summaryrefslogtreecommitdiffstats
path: root/browser/components/preferences/tests/privacypane_tests_perwindow.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/preferences/tests/privacypane_tests_perwindow.js')
-rw-r--r--browser/components/preferences/tests/privacypane_tests_perwindow.js388
1 files changed, 388 insertions, 0 deletions
diff --git a/browser/components/preferences/tests/privacypane_tests_perwindow.js b/browser/components/preferences/tests/privacypane_tests_perwindow.js
new file mode 100644
index 0000000000..8c376d1705
--- /dev/null
+++ b/browser/components/preferences/tests/privacypane_tests_perwindow.js
@@ -0,0 +1,388 @@
+// This file gets imported into the same scope as head.js.
+/* import-globals-from head.js */
+
+async function runTestOnPrivacyPrefPane(testFunc) {
+ info("runTestOnPrivacyPrefPane entered");
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:preferences",
+ true,
+ true
+ );
+ let browser = tab.linkedBrowser;
+ info("loaded about:preferences");
+ await browser.contentWindow.gotoPref("panePrivacy");
+ info("viewing privacy pane, executing testFunc");
+ await testFunc(browser.contentWindow);
+ BrowserTestUtils.removeTab(tab);
+}
+
+function controlChanged(element) {
+ element.doCommand();
+}
+
+// We can only test the panes that don't trigger a preference update
+function test_pane_visibility(win) {
+ let modes = {
+ remember: "historyRememberPane",
+ custom: "historyCustomPane",
+ };
+
+ 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"
+ );
+ is_element_visible(
+ historypane.selectedPanel,
+ "Correct pane should be visible for the " + mode + " mode"
+ );
+ }
+}
+
+function test_dependent_elements(win) {
+ let historymode = win.document.getElementById("historyMode");
+ ok(historymode, "history mode menulist should exist");
+ let pbautostart = win.document.getElementById("privateBrowsingAutoStart");
+ ok(pbautostart, "the private browsing auto-start checkbox should exist");
+ let controls = [
+ win.document.getElementById("rememberHistory"),
+ win.document.getElementById("rememberForms"),
+ win.document.getElementById("deleteOnClose"),
+ win.document.getElementById("alwaysClear"),
+ ];
+ controls.forEach(function (control) {
+ ok(control, "the dependent controls should exist");
+ });
+ let independents = [
+ win.document.getElementById("contentBlockingBlockCookiesCheckbox"),
+ ];
+ independents.forEach(function (control) {
+ ok(control, "the independent controls should exist");
+ });
+ let cookieexceptions = win.document.getElementById("cookieExceptions");
+ ok(cookieexceptions, "the cookie exceptions button should exist");
+ let deleteOnCloseCheckbox = win.document.getElementById("deleteOnClose");
+ ok(deleteOnCloseCheckbox, "the delete on close checkbox should exist");
+ let alwaysclear = win.document.getElementById("alwaysClear");
+ ok(alwaysclear, "the clear data on close checkbox should exist");
+ let rememberhistory = win.document.getElementById("rememberHistory");
+ ok(rememberhistory, "the remember history checkbox should exist");
+ let rememberforms = win.document.getElementById("rememberForms");
+ ok(rememberforms, "the remember forms checkbox should exist");
+ let alwaysclearsettings = win.document.getElementById("clearDataSettings");
+ ok(alwaysclearsettings, "the clear data settings button should exist");
+
+ function expect_disabled(disabled) {
+ controls.forEach(function (control) {
+ is(
+ control.disabled,
+ disabled,
+ control.getAttribute("id") +
+ " should " +
+ (disabled ? "" : "not ") +
+ "be disabled"
+ );
+ });
+ if (disabled) {
+ ok(
+ !alwaysclear.checked,
+ "the clear data on close checkbox value should be as expected"
+ );
+ ok(
+ !rememberhistory.checked,
+ "the remember history checkbox value should be as expected"
+ );
+ ok(
+ !rememberforms.checked,
+ "the remember forms checkbox value should be as expected"
+ );
+ }
+ }
+ function check_independents(expected) {
+ independents.forEach(function (control) {
+ is(
+ control.disabled,
+ expected,
+ control.getAttribute("id") +
+ " should " +
+ (expected ? "" : "not ") +
+ "be disabled"
+ );
+ });
+
+ ok(
+ !cookieexceptions.disabled,
+ "the cookie exceptions button should never be disabled"
+ );
+ ok(
+ alwaysclearsettings.disabled,
+ "the clear data settings button should always be disabled"
+ );
+ }
+
+ // controls should only change in custom mode
+ historymode.value = "remember";
+ controlChanged(historymode);
+ expect_disabled(false);
+ check_independents(false);
+
+ // setting the mode to custom shouldn't change anything
+ historymode.value = "custom";
+ controlChanged(historymode);
+ expect_disabled(false);
+ check_independents(false);
+}
+
+function test_dependent_cookie_elements(win) {
+ let deleteOnCloseCheckbox = win.document.getElementById("deleteOnClose");
+ let deleteOnCloseNote = win.document.getElementById("deleteOnCloseNote");
+ let blockCookiesMenu = win.document.getElementById("blockCookiesMenu");
+
+ let controls = [blockCookiesMenu, deleteOnCloseCheckbox];
+ controls.forEach(function (control) {
+ ok(control, "the dependent cookie controls should exist");
+ });
+ let blockCookiesCheckbox = win.document.getElementById(
+ "contentBlockingBlockCookiesCheckbox"
+ );
+ ok(blockCookiesCheckbox, "the block cookies checkbox should exist");
+
+ function expect_disabled(disabled, c = controls) {
+ c.forEach(function (control) {
+ is(
+ control.disabled,
+ disabled,
+ control.getAttribute("id") +
+ " should " +
+ (disabled ? "" : "not ") +
+ "be disabled"
+ );
+ });
+ }
+
+ blockCookiesCheckbox.checked = true;
+ controlChanged(blockCookiesCheckbox);
+ expect_disabled(false);
+
+ blockCookiesCheckbox.checked = false;
+ controlChanged(blockCookiesCheckbox);
+ expect_disabled(true, [blockCookiesMenu]);
+ expect_disabled(false, [deleteOnCloseCheckbox]);
+ is_element_hidden(
+ deleteOnCloseNote,
+ "The notice for delete on close in permanent private browsing mode should be hidden."
+ );
+
+ blockCookiesMenu.value = "always";
+ controlChanged(blockCookiesMenu);
+ expect_disabled(true, [deleteOnCloseCheckbox]);
+ expect_disabled(false, [blockCookiesMenu]);
+ is_element_hidden(
+ deleteOnCloseNote,
+ "The notice for delete on close in permanent private browsing mode should be hidden."
+ );
+
+ if (win.contentBlockingCookiesAndSiteDataRejectTrackersEnabled) {
+ blockCookiesMenu.value = "trackers";
+ } else {
+ blockCookiesMenu.value = "unvisited";
+ }
+ controlChanged(blockCookiesMenu);
+ 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);
+ expect_disabled(true, [deleteOnCloseCheckbox]);
+ is_element_visible(
+ deleteOnCloseNote,
+ "The notice for delete on close in permanent private browsing mode should be visible."
+ );
+ expect_disabled(false, [blockCookiesMenu]);
+
+ historymode.value = "remember";
+ controlChanged(historymode);
+ expect_disabled(false);
+ is_element_hidden(
+ deleteOnCloseNote,
+ "The notice for delete on close in permanent private browsing mode should be hidden."
+ );
+}
+
+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");
+ ok(pbautostart, "the private browsing auto-start checkbox should exist");
+ let alwaysclear = win.document.getElementById("alwaysClear");
+ ok(alwaysclear, "the clear data on close checkbox should exist");
+ let alwaysclearsettings = win.document.getElementById("clearDataSettings");
+ ok(alwaysclearsettings, "the clear data settings button should exist");
+
+ function expect_disabled(disabled) {
+ is(
+ alwaysclearsettings.disabled,
+ disabled,
+ "the clear data settings should " +
+ (disabled ? "" : "not ") +
+ "be disabled"
+ );
+ }
+
+ historymode.value = "custom";
+ controlChanged(historymode);
+ pbautostart.checked = false;
+ controlChanged(pbautostart);
+ alwaysclear.checked = false;
+ controlChanged(alwaysclear);
+ expect_disabled(true);
+
+ alwaysclear.checked = true;
+ controlChanged(alwaysclear);
+ expect_disabled(false);
+
+ alwaysclear.checked = false;
+ controlChanged(alwaysclear);
+ expect_disabled(true);
+}
+
+async function test_dependent_prefs(win) {
+ let historymode = win.document.getElementById("historyMode");
+ ok(historymode, "history mode menulist should exist");
+ let controls = [
+ win.document.getElementById("rememberHistory"),
+ win.document.getElementById("rememberForms"),
+ ];
+ controls.forEach(function (control) {
+ ok(control, "the micro-management controls should exist");
+ });
+
+ function expect_checked(checked) {
+ controls.forEach(function (control) {
+ is(
+ control.checked,
+ checked,
+ control.getAttribute("id") +
+ " should " +
+ (checked ? "" : "not ") +
+ "be checked"
+ );
+ });
+ }
+
+ // controls should be checked in remember mode
+ historymode.value = "remember";
+ controlChanged(historymode);
+ // Initial updates from prefs are not sync, so wait:
+ await TestUtils.waitForCondition(
+ () => controls[0].getAttribute("checked") == "true"
+ );
+ 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);
+ });
+ expect_checked(false);
+ historymode.value = "remember";
+ controlChanged(historymode);
+ expect_checked(true);
+}
+
+function test_historymode_retention(mode, expect) {
+ return function test_historymode_retention_fn(win) {
+ let historymode = win.document.getElementById("historyMode");
+ ok(historymode, "history mode menulist should exist");
+
+ if (
+ (historymode.value == "remember" && mode == "dontremember") ||
+ (historymode.value == "dontremember" && mode == "remember") ||
+ (historymode.value == "custom" && mode == "dontremember")
+ ) {
+ return;
+ }
+
+ if (expect !== undefined) {
+ is(
+ historymode.value,
+ expect,
+ "history mode is expected to remain " + expect
+ );
+ }
+
+ historymode.value = mode;
+ controlChanged(historymode);
+ };
+}
+
+function test_custom_retention(controlToChange, expect, valueIncrement) {
+ return function test_custom_retention_fn(win) {
+ let historymode = win.document.getElementById("historyMode");
+ ok(historymode, "history mode menulist should exist");
+
+ if (expect !== undefined) {
+ is(
+ historymode.value,
+ expect,
+ "history mode is expected to remain " + expect
+ );
+ }
+
+ historymode.value = "custom";
+ controlChanged(historymode);
+
+ controlToChange = win.document.getElementById(controlToChange);
+ ok(controlToChange, "the control to change should exist");
+ switch (controlToChange.localName) {
+ case "checkbox":
+ controlToChange.checked = !controlToChange.checked;
+ break;
+ case "menulist":
+ controlToChange.value = valueIncrement;
+ break;
+ }
+ controlChanged(controlToChange);
+ };
+}
+
+const gPrefCache = new Map();
+
+function cache_preferences(win) {
+ let prefs = win.Preferences.getAll();
+ for (let pref of prefs) {
+ gPrefCache.set(pref.id, pref.value);
+ }
+}
+
+function reset_preferences(win) {
+ let prefs = win.Preferences.getAll();
+ // Avoid assigning undefined, which means clearing a "user"/test pref value
+ for (let pref of prefs) {
+ if (gPrefCache.has(pref.id)) {
+ pref.value = gPrefCache.get(pref.id);
+ }
+ }
+}
+
+function run_test_subset(subset) {
+ info("subset: " + Array.from(subset, x => x.name).join(",") + "\n");
+ let tests = [cache_preferences, ...subset, reset_preferences];
+ for (let test of tests) {
+ add_task(runTestOnPrivacyPrefPane.bind(undefined, test));
+ }
+}