forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			392 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			392 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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");
 | |
|   SpecialPowers.pushPrefEnv({
 | |
|     set: [["browser.preferences.instantApply", true]],
 | |
|   });
 | |
| 
 | |
|   let tests = [cache_preferences, ...subset, reset_preferences];
 | |
|   for (let test of tests) {
 | |
|     add_task(runTestOnPrivacyPrefPane.bind(undefined, test));
 | |
|   }
 | |
| }
 | 
