tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 4e3f44dec5909a1176e0d50fe025ca722891ab9c
parent 0ebf4c57325616fab27d38e13e3d4663e2552742
Author: Micah Killoran <mtigley@mozilla.com>
Date:   Wed, 19 Nov 2025 17:07:38 +0000

Bug 1971621 - Add tests for Passwords and Autofill section when redesign is enabled. r=dimi,akulyk

Depends on D265170

Differential Revision: https://phabricator.services.mozilla.com/D270055

Diffstat:
Mbrowser/components/preferences/tests/browser_extension_controlled.js | 3+++
Mbrowser/components/preferences/tests/browser_password_management.js | 39+++++++++++++++++++++++++++++++++++++++
Mbrowser/components/preferences/tests/browser_primaryPassword.js | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mbrowser/components/preferences/tests/browser_privacy_passwordGenerationAndAutofill.js | 221+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mbrowser/components/preferences/tests/browser_site_login_exceptions.js | 87++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Mbrowser/components/preferences/tests/browser_site_login_exceptions_policy.js | 84++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
6 files changed, 530 insertions(+), 29 deletions(-)

diff --git a/browser/components/preferences/tests/browser_extension_controlled.js b/browser/components/preferences/tests/browser_extension_controlled.js @@ -1048,6 +1048,9 @@ add_task(async function testExtensionControlledTrackingProtection() { }); add_task(async function testExtensionControlledPasswordManager() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); const PASSWORD_MANAGER_ENABLED_PREF = "signon.rememberSignons"; const PASSWORD_MANAGER_ENABLED_DEFAULT = true; const CONTROLLED_BUTTON_ID = "disablePasswordManagerExtension"; diff --git a/browser/components/preferences/tests/browser_password_management.js b/browser/components/preferences/tests/browser_password_management.js @@ -16,6 +16,9 @@ add_setup(async function () { var passwordsDialog; add_task(async function test_openPasswordManagement() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); let tabOpenPromise = BrowserTestUtils.waitForNewTab(gBrowser, "about:logins"); @@ -47,3 +50,39 @@ add_task(async function test_openPasswordManagement() { BrowserTestUtils.removeTab(tab); gBrowser.removeCurrentTab(); }); + +add_task(async function test_openPasswordManagementNew() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); + + let tabOpenPromise = BrowserTestUtils.waitForNewTab(gBrowser, "about:logins"); + + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let doc = content.document; + + let savePasswordCheckBox = doc.getElementById("savePasswords"); + Assert.ok( + !savePasswordCheckBox.checked, + "Save Password CheckBox should be unchecked by default" + ); + + let showPasswordsButton = doc.getElementById("manageSavedPasswords"); + showPasswordsButton.click(); + }); + + let tab = await tabOpenPromise; + ok(tab, "Tab opened"); + + // check telemetry events while we are in here + await LoginTestUtils.telemetry.waitForEventCount(1); + TelemetryTestUtils.assertEvents( + [["pwmgr", "open_management", "preferences"]], + { category: "pwmgr", method: "open_management" }, + { clear: true, process: "content" } + ); + + BrowserTestUtils.removeTab(tab); + gBrowser.removeCurrentTab(); +}); diff --git a/browser/components/preferences/tests/browser_primaryPassword.js b/browser/components/preferences/tests/browser_primaryPassword.js @@ -12,6 +12,9 @@ add_setup(async function () { }); add_task(async function () { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); let prefs = await openPreferencesViaOpenPreferencesAPI("panePrivacy", { leaveOpen: true, }); @@ -137,3 +140,125 @@ add_task(async function () { BrowserTestUtils.removeTab(gBrowser.selectedTab); }); + +add_task(async function () { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + let prefs = await openPreferencesViaOpenPreferencesAPI("panePrivacy", { + leaveOpen: true, + }); + is(prefs.selectedPane, "panePrivacy", "Privacy pane was selected"); + + let doc = gBrowser.contentDocument; + // Fake the subdialog and LoginHelper + let win = doc.defaultView; + let dialogURL = ""; + let dialogOpened = false; + ChromeUtils.defineLazyGetter(win, "gSubDialog", () => ({ + open(aDialogURL, { closingCallback: aCallback }) { + dialogOpened = true; + dialogURL = aDialogURL; + primaryPasswordSet = primaryPasswordNextState; + aCallback(); + }, + })); + + let primaryPasswordSet = false; + win.LoginHelper = { + isPrimaryPasswordSet() { + return primaryPasswordSet; + }, + getOSAuthEnabled() { + return true; // Since enabled by default. + }, + }; + + let primaryPasswordNotSet = doc.querySelector("#primaryPasswordNotSet"); + primaryPasswordNotSet.scrollIntoView(); + ok( + primaryPasswordNotSet, + "'Primary password not set' control should be shown by default" + ); + let button = doc.getElementById("addPrimaryPassword"); + + let primaryPasswordNextState = false; + if (OSKeyStoreTestUtils.canTestOSKeyStoreLogin() && OSKeyStore.canReauth()) { + let osAuthDialogShown = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(false); + button.click(); + info("waiting for os auth dialog to appear and get canceled"); + await osAuthDialogShown; + ok(!dialogOpened, "the dialog should not have opened"); + ok( + !dialogURL, + "the changemp dialog should not have been opened when the os auth dialog is canceled" + ); + } + + let primaryPasswordSetCtrl = doc.querySelector("#primaryPasswordSet"); + primaryPasswordNextState = true; + if (OSKeyStoreTestUtils.canTestOSKeyStoreLogin() && OSKeyStore.canReauth()) { + let osAuthDialogShown = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(true); + button.click(); + info("waiting for os auth dialog to appear"); + await osAuthDialogShown; + info("waiting for dialogURL to get set"); + await TestUtils.waitForCondition( + () => dialogURL, + "wait for open to get called asynchronously" + ); + is( + dialogURL, + "chrome://mozapps/content/preferences/changemp.xhtml", + "clicking on the checkbox should open the primary password dialog" + ); + } else { + primaryPasswordSet = true; + doc.defaultView.gPrivacyPane._initMasterPasswordUI(); + await TestUtils.waitForCondition( + () => !button.disabled, + "waiting for primary password button to get enabled" + ); + } + ok( + primaryPasswordSetCtrl, + "'primary password set control' should be visible now" + ); + + dialogURL = ""; + button.click(); + await TestUtils.waitForCondition( + () => dialogURL, + "wait for open to get called asynchronously" + ); + is( + dialogURL, + "chrome://mozapps/content/preferences/changemp.xhtml", + "clicking on the button should open the primary password dialog" + ); + + // Confirm that we won't automatically respond to the dialog, + // since we don't expect a dialog here, we want the test to fail if one appears. + is( + Services.prefs.getStringPref( + "toolkit.osKeyStore.unofficialBuildOnlyLogin", + "" + ), + "", + "Pref should be set to an empty string" + ); + + let removePrimaryPasswordButton = doc.querySelector( + "#turnOffPrimaryPassword" + ); + primaryPasswordNextState = false; + dialogURL = ""; + removePrimaryPasswordButton.click(); + is( + dialogURL, + "chrome://mozapps/content/preferences/removemp.xhtml", + "clicking on the checkbox to uncheck primary password should show the removal dialog" + ); + + BrowserTestUtils.removeTab(gBrowser.selectedTab); +}); diff --git a/browser/components/preferences/tests/browser_privacy_passwordGenerationAndAutofill.js b/browser/components/preferences/tests/browser_privacy_passwordGenerationAndAutofill.js @@ -2,6 +2,9 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ add_task(async function initialState() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); // check pref permutations to verify the UI opens in the correct state const prefTests = [ { @@ -112,6 +115,9 @@ add_task(async function initialState() { }); add_task(async function toggleGenerationEnabled() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); // clicking the checkbox should toggle the pref SpecialPowers.pushPrefEnv({ set: [ @@ -155,6 +161,9 @@ add_task(async function toggleGenerationEnabled() { }); add_task(async function toggleRememberSignon() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); // toggling rememberSignons checkbox should make generation checkbox disabled SpecialPowers.pushPrefEnv({ set: [ @@ -197,3 +206,215 @@ add_task(async function toggleRememberSignon() { ); await SpecialPowers.popPrefEnv(); }); + +// Settings redesign tests + +add_task(async function initialStateNew() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + // check pref permutations to verify the UI opens in the correct state + const prefTests = [ + { + initialPrefs: [ + ["signon.rememberSignons", true], + ["signon.generation.available", true], + ["signon.generation.enabled", true], + ["signon.autofillForms", true], + ], + expected: "checked", + }, + { + initialPrefs: [ + ["signon.rememberSignons", true], + ["signon.generation.available", true], + ["signon.generation.enabled", false], + ["signon.autofillForms", false], + ], + expected: "unchecked", + }, + { + initialPrefs: [ + ["signon.rememberSignons", true], + ["signon.generation.available", false], + ["signon.generation.enabled", false], + ], + expected: "hidden", + }, + { + initialPrefs: [ + ["signon.rememberSignons", false], + ["signon.generation.available", true], + ["signon.generation.enabled", true], + ["signon.autofillForms", true], + ], + expected: "disabled", + }, + ]; + for (let test of prefTests) { + // set initial pref values + info("initialState, testing with: " + JSON.stringify(test)); + await SpecialPowers.pushPrefEnv({ set: test.initialPrefs }); + + // open about:privacy in a tab + // verify expected conditions + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: "about:preferences#privacy", + }, + async function (browser) { + let doc = browser.contentDocument; + let generatePasswordsCheckbox = doc + .getElementById("suggestStrongPasswords") + .shadowRoot.querySelector("input"); + let autofillFormsCheckbox = doc + .getElementById("fillUsernameAndPasswords") + .shadowRoot.querySelector("input"); + doc.getElementById("passwordsGroup").scrollIntoView(); + + info("initialState, assert on expected state:" + test.expected); + switch (test.expected) { + case "hidden": + is_element_hidden( + generatePasswordsCheckbox, + "#generatePasswords checkbox is hidden" + ); + break; + case "checked": + is_element_visible( + generatePasswordsCheckbox, + "#generatePasswords checkbox is visible" + ); + ok( + generatePasswordsCheckbox.checked, + "#generatePasswords checkbox is checked" + ); + ok( + autofillFormsCheckbox.checked, + "#passwordAutofillCheckbox is checked" + ); + break; + case "unchecked": + ok( + !generatePasswordsCheckbox.checked, + "#generatePasswords checkbox is un-checked" + ); + ok( + !autofillFormsCheckbox.checked, + "#passwordAutofillCheckbox is un-checked" + ); + break; + case "disabled": + ok( + generatePasswordsCheckbox.disabled, + "#generatePasswords checkbox is disabled" + ); + ok( + autofillFormsCheckbox.disabled, + "#passwordAutofillCheckbox is disabled" + ); + break; + default: + ok(false, "Unknown expected state: " + test.expected); + } + } + ); + await SpecialPowers.popPrefEnv(); + } +}); + +add_task(async function toggleGenerationEnabledNew() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + // clicking the checkbox should toggle the pref + SpecialPowers.pushPrefEnv({ + set: [ + ["signon.generation.available", true], + ["signon.generation.enabled", false], + ["signon.rememberSignons", true], + ], + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: "about:preferences#privacy", + }, + async function (browser) { + let doc = browser.contentDocument; + let checkbox = doc.getElementById("suggestStrongPasswords"); + + info("waiting for the browser to have focus"); + await SimpleTest.promiseFocus(browser); + let prefChanged = TestUtils.waitForPrefChange( + "signon.generation.enabled" + ); + + // the preferences "Search" bar obscures the checkbox if we scrollIntoView and try to click on it + // so use keyboard events instead + checkbox.focus(); + is(doc.activeElement, checkbox, "checkbox is focused"); + EventUtils.synthesizeKey(" "); + + info("waiting for pref to change"); + await prefChanged; + ok(checkbox.checked, "#generatePasswords checkbox is checked"); + ok( + Services.prefs.getBoolPref("signon.generation.enabled"), + "enabled pref is now true" + ); + } + ); + await SpecialPowers.popPrefEnv(); +}); + +add_task(async function toggleRememberSignonNew() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + // toggling rememberSignons checkbox should make generation checkbox disabled + SpecialPowers.pushPrefEnv({ + set: [ + ["signon.generation.available", true], + ["signon.generation.enabled", true], + ["signon.rememberSignons", true], + ], + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: "about:preferences#privacy", + }, + async function (browser) { + let doc = browser.contentDocument; + let checkbox = doc.getElementById("savePasswords"); + let generationCheckbox = doc + .getElementById("suggestStrongPasswords") + .shadowRoot.querySelector("input"); + + ok( + !generationCheckbox.disabled, + "generation checkbox is not initially disabled" + ); + + info("waiting for the browser to have focus"); + await SimpleTest.promiseFocus(browser); + let prefChanged = TestUtils.waitForPrefChange("signon.rememberSignons"); + + checkbox.click(); + + info("waiting for pref to change"); + await prefChanged; + ok(!checkbox.checked, "#savePasswords checkbox is un-checked"); + await BrowserTestUtils.waitForCondition( + () => generationCheckbox.disabled, + "generation checkbox becomes disabled", + 200 + ); + } + ); + await SpecialPowers.popPrefEnv(); +}); diff --git a/browser/components/preferences/tests/browser_site_login_exceptions.js b/browser/components/preferences/tests/browser_site_login_exceptions.js @@ -5,30 +5,66 @@ const PERMISSIONS_URL = var exceptionsDialog; add_task(async function openLoginExceptionsSubDialog() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); // ensure rememberSignons is off for this test; ok( !Services.prefs.getBoolPref("signon.rememberSignons"), "Check initial value of signon.rememberSignons pref" ); + await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); + + let dialogOpened = promiseLoadSubDialog(PERMISSIONS_URL); + + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let doc = content.document; + let savePasswordCheckBox = doc.getElementById("savePasswords"); + Assert.ok( + !savePasswordCheckBox.checked, + "Save Password CheckBox should be unchecked by default" + ); + savePasswordCheckBox.click(); + + let loginExceptionsButton = doc.getElementById("passwordExceptions"); + loginExceptionsButton.click(); + }); + + exceptionsDialog = await dialogOpened; + + await addALoginException(); + await deleteALoginException(); + + exceptionsDialog.close(); + // Undo the save password change. - registerCleanupFunction(async function () { - await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { - let doc = content.document; - let savePasswordCheckBox = doc.getElementById("savePasswords"); - if (savePasswordCheckBox.checked) { - savePasswordCheckBox.click(); - } - }); - - gBrowser.removeCurrentTab(); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let doc = content.document; + let savePasswordCheckBox = doc.getElementById("savePasswords"); + if (savePasswordCheckBox.checked) { + savePasswordCheckBox.click(); + } }); + gBrowser.removeCurrentTab(); +}); + +add_task(async function openLoginExceptionsSubDialogNew() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + // ensure rememberSignons is off for this test; + ok( + !Services.prefs.getBoolPref("signon.rememberSignons"), + "Check initial value of signon.rememberSignons pref" + ); + await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); let dialogOpened = promiseLoadSubDialog(PERMISSIONS_URL); - await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () { let doc = content.document; let savePasswordCheckBox = doc.getElementById("savePasswords"); Assert.ok( @@ -37,14 +73,33 @@ add_task(async function openLoginExceptionsSubDialog() { ); savePasswordCheckBox.click(); - let loginExceptionsButton = doc.getElementById("passwordExceptions"); + let loginExceptionsButton = doc.getElementById("managePasswordExceptions"); + await ContentTaskUtils.waitForCondition( + () => !loginExceptionsButton.disabled + ); loginExceptionsButton.click(); }); exceptionsDialog = await dialogOpened; + + await addALoginException(); + await deleteALoginException(); + + exceptionsDialog.close(); + + // Undo the save password change. + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let doc = content.document; + let savePasswordCheckBox = doc.getElementById("savePasswords"); + if (savePasswordCheckBox.checked) { + savePasswordCheckBox.click(); + } + }); + + gBrowser.removeCurrentTab(); }); -add_task(async function addALoginException() { +async function addALoginException() { let doc = exceptionsDialog.document; let richlistbox = doc.getElementById("permissionsBox"); @@ -65,9 +120,9 @@ add_task(async function addALoginException() { let elements = richlistbox.getElementsByAttribute("origin", website); is(elements.length, 1, "It should find only one coincidence"); } -}); +} -add_task(async function deleteALoginException() { +async function deleteALoginException() { let doc = exceptionsDialog.document; let richlistbox = doc.getElementById("permissionsBox"); @@ -98,4 +153,4 @@ add_task(async function deleteALoginException() { "Subdialog is visible after deleting an element" ); } -}); +} diff --git a/browser/components/preferences/tests/browser_site_login_exceptions_policy.js b/browser/components/preferences/tests/browser_site_login_exceptions_policy.js @@ -13,25 +13,66 @@ const PERMISSIONS_URL = var exceptionsDialog; add_task(async function openLoginExceptionsSubDialog() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); // ensure rememberSignons is off for this test; ok( !Services.prefs.getBoolPref("signon.rememberSignons"), "Check initial value of signon.rememberSignons pref" ); + await EnterprisePolicyTesting.setupPolicyEngineWithJson({ + policies: { + PasswordManagerExceptions: ["https://pwexception.example.com"], + }, + }); + + await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); + + let dialogOpened = promiseLoadSubDialog(PERMISSIONS_URL); + + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let doc = content.document; + let savePasswordCheckBox = doc.getElementById("savePasswords"); + savePasswordCheckBox.click(); + + let loginExceptionsButton = doc.getElementById("passwordExceptions"); + loginExceptionsButton.click(); + }); + + exceptionsDialog = await dialogOpened; + + let doc = exceptionsDialog.document; + + let richlistbox = doc.getElementById("permissionsBox"); + Assert.equal(richlistbox.itemCount, 1, `Row count should initially be 1`); + + richlistbox.focus(); + richlistbox.selectedIndex = 0; + Assert.ok(doc.getElementById("removePermission").disabled); + // Undo the save password change. - registerCleanupFunction(async function () { - await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { - let doc = content.document; - let savePasswordCheckBox = doc.getElementById("savePasswords"); - if (savePasswordCheckBox.checked) { - savePasswordCheckBox.click(); - } - }); - - gBrowser.removeCurrentTab(); - await EnterprisePolicyTesting.setupPolicyEngineWithJson(""); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let savePasswordCheckBox = content.document.getElementById("savePasswords"); + if (savePasswordCheckBox.checked) { + savePasswordCheckBox.click(); + } + }); + + gBrowser.removeCurrentTab(); + await EnterprisePolicyTesting.setupPolicyEngineWithJson(""); +}); + +add_task(async function openLoginExceptionsSubDialogNew() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], }); + // ensure rememberSignons is off for this test; + ok( + !Services.prefs.getBoolPref("signon.rememberSignons"), + "Check initial value of signon.rememberSignons pref" + ); await EnterprisePolicyTesting.setupPolicyEngineWithJson({ policies: { @@ -39,21 +80,27 @@ add_task(async function openLoginExceptionsSubDialog() { }, }); + info("Opening privacy panel"); await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); let dialogOpened = promiseLoadSubDialog(PERMISSIONS_URL); - await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () { let doc = content.document; let savePasswordCheckBox = doc.getElementById("savePasswords"); savePasswordCheckBox.click(); - let loginExceptionsButton = doc.getElementById("passwordExceptions"); + let loginExceptionsButton = doc.getElementById("managePasswordExceptions"); + await ContentTaskUtils.waitForCondition( + () => !loginExceptionsButton.disabled + ); loginExceptionsButton.click(); }); + info("Waiting for dialog to open"); exceptionsDialog = await dialogOpened; + info("Assert remove permission is disabled"); let doc = exceptionsDialog.document; let richlistbox = doc.getElementById("permissionsBox"); @@ -62,4 +109,15 @@ add_task(async function openLoginExceptionsSubDialog() { richlistbox.focus(); richlistbox.selectedIndex = 0; Assert.ok(doc.getElementById("removePermission").disabled); + + // Undo the save password change. + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + let savePasswordCheckBox = content.document.getElementById("savePasswords"); + if (savePasswordCheckBox.checked) { + savePasswordCheckBox.click(); + } + }); + + gBrowser.removeCurrentTab(); + await EnterprisePolicyTesting.setupPolicyEngineWithJson(""); });