tor-browser

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

commit 37c9f6ef4c7a9a335b42f734b4b53b7e81612410
parent d6dae370b4a5ed25c0d28d8b60871e102354d0db
Author: Emma Zuehlcke <emz@mozilla.com>
Date:   Wed, 12 Nov 2025 11:32:48 +0000

Bug 1971438 - Update tests for history preferences section. r=mconley

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

Diffstat:
Mbrowser/base/content/test/sanitize/browser_sanitizeOnShutdown_migration.js | 2++
Mbrowser/base/content/test/sanitize/head.js | 2++
Mbrowser/components/enterprisepolicies/tests/browser/browser_policy_privatebrowsingmodeavailability.js | 5+++--
Mbrowser/components/preferences/tests/browser_cookies_exceptions.js | 5++---
Mbrowser/components/preferences/tests/browser_privacy_syncDataClearing.js | 15+++++++++++----
Mbrowser/components/preferences/tests/browser_privacy_syncDataClearing_v2.js | 16++++++++++++----
Mbrowser/components/preferences/tests/browser_warning_permanent_private_browsing.js | 8+++++---
Mbrowser/components/preferences/tests/head.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mbrowser/components/preferences/tests/privacypane_tests_perwindow.js | 124+++++++++++++++++++++++++++++++++++++++----------------------------------------
9 files changed, 165 insertions(+), 79 deletions(-)

diff --git a/browser/base/content/test/sanitize/browser_sanitizeOnShutdown_migration.js b/browser/base/content/test/sanitize/browser_sanitizeOnShutdown_migration.js @@ -37,6 +37,8 @@ add_task(async function testMigrationForDeleteOnClose() { ok(!alwaysClearBox.checked, "AlwaysClear initial state is deselected"); deleteOnCloseBox.click(); + // Wait for change to take effect. + await new Promise(resolve => requestAnimationFrame(resolve)); ok(deleteOnCloseBox.checked, "DeleteOnClose is selected"); is( diff --git a/browser/base/content/test/sanitize/head.js b/browser/base/content/test/sanitize/head.js @@ -667,6 +667,8 @@ ClearHistoryDialogHelper.prototype = { clearDialogOpenButtonId = "clearDataSettings"; } // open dialog + // Wait a tick for the button to be initialized.œ + await new Promise(resolve => requestAnimationFrame(resolve)); tabWindow.document.getElementById(clearDialogOpenButtonId).click(); } // We open the dialog in the chrome context in other cases diff --git a/browser/components/enterprisepolicies/tests/browser/browser_policy_privatebrowsingmodeavailability.js b/browser/components/enterprisepolicies/tests/browser/browser_policy_privatebrowsingmodeavailability.js @@ -27,8 +27,9 @@ add_task(async function test_privatebrowsing_disabled() { "about:preferences#privacy", async browser => { ok( - browser.contentDocument.querySelector("menuitem[value='dontremember']") - .disabled, + browser.contentDocument + .getElementById("historyMode") + .inputEl.querySelector("option[value='dontremember']").disabled, "Don't remember history should be disabled" ); } diff --git a/browser/components/preferences/tests/browser_cookies_exceptions.js b/browser/components/preferences/tests/browser_cookies_exceptions.js @@ -530,9 +530,8 @@ async function runTest(test, getObservances) { }); let doc = gBrowser.contentDocument; - let historyMode = doc.getElementById("historyMode"); - historyMode.value = "custom"; - historyMode.doCommand(); + + await selectHistoryMode(gBrowser.contentWindow, "custom"); let promiseSubDialogLoaded = promiseLoadSubDialog( "chrome://browser/content/preferences/dialogs/permissions.xhtml" diff --git a/browser/components/preferences/tests/browser_privacy_syncDataClearing.js b/browser/components/preferences/tests/browser_privacy_syncDataClearing.js @@ -26,6 +26,9 @@ add_task(async function test_syncWithoutCustomPrefs() { deleteOnCloseBox.click(); + // Wait for UI to update. + await new Promise(resolve => requestAnimationFrame(resolve)); + ok(deleteOnCloseBox.checked, "DeleteOnClose is selected"); is( deleteOnCloseBox.checked, @@ -51,6 +54,9 @@ add_task(async function test_syncWithoutCustomPrefs() { deleteOnCloseBox.click(); + // Wait for UI to update. + await new Promise(resolve => requestAnimationFrame(resolve)); + ok(!deleteOnCloseBox.checked, "DeleteOnClose is deselected"); is( deleteOnCloseBox.checked, @@ -187,6 +193,8 @@ add_task(async function test_syncWithCustomPrefs() { ["privacy.clearOnShutdown.cache", true], ["privacy.clearOnShutdown.offlineApps", true], ["privacy.sanitize.sanitizeOnShutdown", true], + // Make sure custom is selected so the depending checkboxes are visible. + ["privacy.history.custom", true], ], }); @@ -288,9 +296,8 @@ add_task(async function test_initialState() { ); // Reset history mode - let historyMode = document.getElementById("historyMode"); - historyMode.value = "remember"; - historyMode.doCommand(); - BrowserTestUtils.removeTab(gBrowser.selectedTab); await SpecialPowers.popPrefEnv(); + gBrowser.contentWindow.Preferences.getSetting("historyMode").value = + "remember"; + BrowserTestUtils.removeTab(gBrowser.selectedTab); }); diff --git a/browser/components/preferences/tests/browser_privacy_syncDataClearing_v2.js b/browser/components/preferences/tests/browser_privacy_syncDataClearing_v2.js @@ -29,6 +29,9 @@ add_task(async function test_syncWithoutCustomPrefs() { deleteOnCloseBox.click(); + // Wait for UI to update. + await new Promise(resolve => requestAnimationFrame(resolve)); + ok(deleteOnCloseBox.checked, "DeleteOnClose is selected"); is( deleteOnCloseBox.checked, @@ -64,6 +67,9 @@ add_task(async function test_syncWithoutCustomPrefs() { deleteOnCloseBox.click(); + // Wait for UI to update. + await new Promise(resolve => requestAnimationFrame(resolve)); + ok(!deleteOnCloseBox.checked, "DeleteOnClose is deselected"); is( deleteOnCloseBox.checked, @@ -161,6 +167,9 @@ add_task(async function test_syncWithCustomPrefs() { deleteOnCloseBox.click(); + // Wait for UI to update. + await new Promise(resolve => requestAnimationFrame(resolve)); + ok(!deleteOnCloseBox.checked, "DeleteOnClose is deselected"); is( !deleteOnCloseBox.checked, @@ -312,9 +321,8 @@ add_task(async function test_initialState() { ); // Reset history mode - let historyMode = document.getElementById("historyMode"); - historyMode.value = "remember"; - historyMode.doCommand(); - BrowserTestUtils.removeTab(gBrowser.selectedTab); await SpecialPowers.popPrefEnv(); + gBrowser.contentWindow.Preferences.getSetting("historyMode").value = + "remember"; + BrowserTestUtils.removeTab(gBrowser.selectedTab); }); diff --git a/browser/components/preferences/tests/browser_warning_permanent_private_browsing.js b/browser/components/preferences/tests/browser_warning_permanent_private_browsing.js @@ -30,9 +30,11 @@ function checkForPrompt(prefVal) { return doc.defaultView.CONFIRM_RESTART_PROMPT_RESTART_NOW; }; // Tick the checkbox and pretend the user did it: - let checkbox = doc.getElementById("privateBrowsingAutoStart"); - checkbox.checked = prefVal; - checkbox.doCommand(); + await updateCheckBox( + gBrowser.contentWindow, + "privateBrowsingAutoStart", + prefVal + ); // Now the prompt should have shown. ok( diff --git a/browser/components/preferences/tests/head.js b/browser/components/preferences/tests/head.js @@ -637,3 +637,70 @@ async function clickCheckboxWithConfirmDialog( return checkbox; } + +/** + * Select the given history mode via dropdown in the privacy pane. + * + * @param {Window} win - The preferences window which contains the + * dropdown. + * @param {string} value - The history mode to select. + */ +async function selectHistoryMode(win, value) { + let historyMode = win.document.getElementById("historyMode").inputEl; + + // Find the index of the option with the given value. Do this before the first + // click so we can bail out early if the option does not exist. + let optionIndexStr = Array.from(historyMode.children) + .findIndex(option => option.value == value) + ?.toString(); + if (optionIndexStr == null) { + throw new Error( + "Could not find history mode option item for value: " + value + ); + } + + // Scroll into view for click to succeed. + historyMode.scrollIntoView(); + + let popupShownPromise = BrowserTestUtils.waitForSelectPopupShown(window); + + await EventUtils.synthesizeMouseAtCenter( + historyMode, + {}, + historyMode.ownerGlobal + ); + + let popup = await popupShownPromise; + let popupItems = Array.from(popup.children); + + let targetItem = popupItems.find(item => item.value == optionIndexStr); + + if (!targetItem) { + throw new Error( + "Could not find history mode popup item for value: " + value + ); + } + + let popupHiddenPromise = BrowserTestUtils.waitForPopupEvent(popup, "hidden"); + + EventUtils.synthesizeMouseAtCenter(targetItem, {}, targetItem.ownerGlobal); + + await popupHiddenPromise; +} + +async function updateCheckBox(win, id, value) { + let checkbox = win.document.getElementById(id); + ok(checkbox, "the " + id + " checkbox should exist"); + is_element_visible(checkbox, "the " + id + " checkbox should be visible"); + + // No need to click if we're already in the desired state. + if (checkbox.checked === value) { + return; + } + + // Scroll into view for click to succeed. + checkbox.scrollIntoView(); + + // Toggle the state. + await EventUtils.synthesizeMouseAtCenter(checkbox, {}, checkbox.ownerGlobal); +} diff --git a/browser/components/preferences/tests/privacypane_tests_perwindow.js b/browser/components/preferences/tests/privacypane_tests_perwindow.js @@ -22,33 +22,43 @@ function controlChanged(element) { } // We can only test the panes that don't trigger a preference update -function test_pane_visibility(win) { - let modes = { - remember: "historyRememberPane", - custom: "historyCustomPane", - }; +async function test_pane_visibility(win) { + // Elements which should only be visible in history mode "custom". + let customElementIds = [ + "privateBrowsingAutoStart", + "rememberHistory", + "rememberForms", + "alwaysClear", + "clearDataSettings", + ]; let historymode = win.document.getElementById("historyMode"); ok(historymode, "history mode menulist should exist"); - let historypane = win.document.getElementById("historyPane"); - ok(historypane, "history mode pane should exist"); - for (let mode in modes) { - historymode.value = mode; - controlChanged(historymode); - is( - historypane.selectedPanel, - win.document.getElementById(modes[mode]), - "The correct pane should be selected for the " + mode + " mode" - ); + await selectHistoryMode(win, "custom"); + + for (let id of customElementIds) { + let element = win.document.getElementById(id); + ok(element, `the ${id} element should exist`); is_element_visible( - historypane.selectedPanel, - "Correct pane should be visible for the " + mode + " mode" + element, + `the ${id} element should be visible in 'custom' mode` + ); + } + + await selectHistoryMode(win, "remember"); + + for (let id of customElementIds) { + let element = win.document.getElementById(id); + ok(element, `the ${id} element should exist`); + is_element_hidden( + element, + `the ${id} element should be hidden in 'remember' mode` ); } } -function test_dependent_elements(win) { +async function test_dependent_elements(win) { let historymode = win.document.getElementById("historyMode"); ok(historymode, "history mode menulist should exist"); let pbautostart = win.document.getElementById("privateBrowsingAutoStart"); @@ -130,16 +140,16 @@ function test_dependent_elements(win) { } // controls should only change in custom mode - historymode.value = "remember"; - controlChanged(historymode); + await selectHistoryMode(win, "remember"); expect_disabled(false); check_independents(false); // setting the mode to custom shouldn't change anything - historymode.value = "custom"; - controlChanged(historymode); + await selectHistoryMode(win, "custom"); expect_disabled(false); check_independents(false); + + await selectHistoryMode(win, "remember"); } async function test_dependent_cookie_elements(win) { @@ -203,13 +213,12 @@ async function test_dependent_cookie_elements(win) { await new Promise(resolve => requestAnimationFrame(resolve)); expect_disabled(false); - let historymode = win.document.getElementById("historyMode"); - // The History mode setting for "never remember history" should still // disable the "keep cookies until..." menu. - historymode.value = "dontremember"; - controlChanged(historymode); - await new Promise(resolve => requestAnimationFrame(resolve)); + + // Suppress restart prompt, because we can't restart in a mochitest. + win._shouldPromptForRestartPBM = false; + await selectHistoryMode(win, "dontremember"); expect_disabled(true, [deleteOnCloseCheckbox]); is_element_visible( deleteOnCloseNote, @@ -217,9 +226,10 @@ async function test_dependent_cookie_elements(win) { ); expect_disabled(false, [blockCookiesMenu]); - historymode.value = "remember"; - controlChanged(historymode); - await new Promise(resolve => requestAnimationFrame(resolve)); + // Suppress restart prompt, because we can't restart in a mochitest. + win._shouldPromptForRestartPBM = false; + + await selectHistoryMode(win, "remember"); expect_disabled(false); is_element_hidden( deleteOnCloseNote, @@ -227,7 +237,7 @@ async function test_dependent_cookie_elements(win) { ); } -function test_dependent_clearonclose_elements(win) { +async function test_dependent_clearonclose_elements(win) { let historymode = win.document.getElementById("historyMode"); ok(historymode, "history mode menulist should exist"); let pbautostart = win.document.getElementById("privateBrowsingAutoStart"); @@ -247,20 +257,16 @@ function test_dependent_clearonclose_elements(win) { ); } - historymode.value = "custom"; - controlChanged(historymode); - pbautostart.checked = false; - controlChanged(pbautostart); - alwaysclear.checked = false; - controlChanged(alwaysclear); + await selectHistoryMode(win, "custom"); + await updateCheckBox(win, "privateBrowsingAutoStart", false); + + await updateCheckBox(win, "alwaysClear", false); expect_disabled(true); - alwaysclear.checked = true; - controlChanged(alwaysclear); + await updateCheckBox(win, "alwaysClear", true); expect_disabled(false); - alwaysclear.checked = false; - controlChanged(alwaysclear); + await updateCheckBox(win, "alwaysClear", false); expect_disabled(true); } @@ -289,29 +295,24 @@ async function test_dependent_prefs(win) { } // controls should be checked in remember mode - historymode.value = "remember"; - controlChanged(historymode); + await selectHistoryMode(win, "remember"); // Initial updates from prefs are not sync, so wait: - await TestUtils.waitForCondition( - () => controls[0].getAttribute("checked") == "true" - ); + await TestUtils.waitForCondition(() => controls[0].checked); expect_checked(true); // even if they're unchecked in custom mode - historymode.value = "custom"; - controlChanged(historymode); - controls.forEach(function (control) { - control.checked = false; - controlChanged(control); - }); + await selectHistoryMode(win, "custom"); + + for (let control of controls) { + await updateCheckBox(win, control.id, false); + } expect_checked(false); - historymode.value = "remember"; - controlChanged(historymode); + await selectHistoryMode(win, "remember"); expect_checked(true); } function test_historymode_retention(mode, expect) { - return function test_historymode_retention_fn(win) { + return async function test_historymode_retention_fn(win) { let historymode = win.document.getElementById("historyMode"); ok(historymode, "history mode menulist should exist"); @@ -331,13 +332,12 @@ function test_historymode_retention(mode, expect) { ); } - historymode.value = mode; - controlChanged(historymode); + await selectHistoryMode(win, mode); }; } function test_custom_retention(controlToChange, expect, valueIncrement) { - return function test_custom_retention_fn(win) { + return async function test_custom_retention_fn(win) { let historymode = win.document.getElementById("historyMode"); ok(historymode, "history mode menulist should exist"); @@ -349,20 +349,18 @@ function test_custom_retention(controlToChange, expect, valueIncrement) { ); } - historymode.value = "custom"; - controlChanged(historymode); + await selectHistoryMode(win, "custom"); controlToChange = win.document.getElementById(controlToChange); ok(controlToChange, "the control to change should exist"); switch (controlToChange.localName) { case "checkbox": - controlToChange.checked = !controlToChange.checked; + await updateCheckBox(win, controlToChange.id, !controlToChange.checked); break; case "menulist": - controlToChange.value = valueIncrement; + await selectHistoryMode(win, valueIncrement); break; } - controlChanged(controlToChange); }; }