privacypane_tests_perwindow.js (15199B)
1 // This file gets imported into the same scope as head.js. 2 /* import-globals-from head.js */ 3 4 async function runTestOnPrivacyPrefPane(testFunc) { 5 info("runTestOnPrivacyPrefPane entered"); 6 let tab = await BrowserTestUtils.openNewForegroundTab( 7 gBrowser, 8 "about:preferences", 9 true, 10 true 11 ); 12 let browser = tab.linkedBrowser; 13 info("loaded about:preferences"); 14 await browser.contentWindow.gotoPref("panePrivacy"); 15 info("viewing privacy pane, executing testFunc"); 16 await testFunc(browser.contentWindow); 17 BrowserTestUtils.removeTab(tab); 18 } 19 20 function controlChanged(element) { 21 element.doCommand(); 22 } 23 24 // We can only test the panes that don't trigger a preference update 25 async function test_pane_visibility(win) { 26 // Elements which should only be visible in history mode "custom". 27 let customElementIds = [ 28 "privateBrowsingAutoStart", 29 "rememberHistory", 30 "rememberForms", 31 "alwaysClear", 32 "clearDataSettings", 33 ]; 34 35 let historymode = win.document.getElementById("historyMode"); 36 ok(historymode, "history mode menulist should exist"); 37 38 await selectHistoryMode(win, "custom"); 39 40 for (let id of customElementIds) { 41 let element = win.document.querySelector( 42 `setting-group[groupid='history'] #${id}` 43 ); 44 ok(element, `the ${id} element should exist`); 45 is_element_visible( 46 element, 47 `the ${id} element should be visible in 'custom' mode` 48 ); 49 } 50 51 await selectHistoryMode(win, "remember"); 52 53 for (let id of customElementIds) { 54 let element = win.document.querySelector( 55 `setting-group[groupid='history'] #${id}` 56 ); 57 ok(element, `the ${id} element should exist`); 58 is_element_hidden( 59 element, 60 `the ${id} element should be hidden in 'remember' mode` 61 ); 62 } 63 } 64 65 async function test_dependent_elements(win) { 66 let historymode = win.document.getElementById("historyMode"); 67 ok(historymode, "history mode menulist should exist"); 68 let pbautostart = win.document.getElementById("privateBrowsingAutoStart"); 69 ok(pbautostart, "the private browsing auto-start checkbox should exist"); 70 let controls = [ 71 win.document.getElementById("rememberHistory"), 72 win.document.getElementById("rememberForms"), 73 win.document.getElementById("deleteOnClose"), 74 win.document.getElementById("alwaysClear"), 75 ]; 76 controls.forEach(function (control) { 77 ok(control, "the dependent controls should exist"); 78 }); 79 let independents = [ 80 win.document.getElementById("contentBlockingBlockCookiesCheckbox"), 81 ]; 82 independents.forEach(function (control) { 83 ok(control, "the independent controls should exist"); 84 }); 85 let cookieexceptions = win.document.getElementById("cookieExceptions"); 86 ok(cookieexceptions, "the cookie exceptions button should exist"); 87 let deleteOnCloseCheckbox = win.document.getElementById("deleteOnClose"); 88 ok(deleteOnCloseCheckbox, "the delete on close checkbox should exist"); 89 let alwaysclear = win.document.getElementById("alwaysClear"); 90 ok(alwaysclear, "the clear data on close checkbox should exist"); 91 let rememberhistory = win.document.getElementById("rememberHistory"); 92 ok(rememberhistory, "the remember history checkbox should exist"); 93 let rememberforms = win.document.getElementById("rememberForms"); 94 ok(rememberforms, "the remember forms checkbox should exist"); 95 let alwaysclearsettings = win.document.getElementById("clearDataSettings"); 96 ok(alwaysclearsettings, "the clear data settings button should exist"); 97 98 function expect_disabled(disabled) { 99 controls.forEach(function (control) { 100 is( 101 control.disabled, 102 disabled, 103 control.getAttribute("id") + 104 " should " + 105 (disabled ? "" : "not ") + 106 "be disabled" 107 ); 108 }); 109 if (disabled) { 110 ok( 111 !alwaysclear.checked, 112 "the clear data on close checkbox value should be as expected" 113 ); 114 ok( 115 !rememberhistory.checked, 116 "the remember history checkbox value should be as expected" 117 ); 118 ok( 119 !rememberforms.checked, 120 "the remember forms checkbox value should be as expected" 121 ); 122 } 123 } 124 function check_independents(expected) { 125 independents.forEach(function (control) { 126 is( 127 control.disabled, 128 expected, 129 control.getAttribute("id") + 130 " should " + 131 (expected ? "" : "not ") + 132 "be disabled" 133 ); 134 }); 135 136 ok( 137 !cookieexceptions.disabled, 138 "the cookie exceptions button should never be disabled" 139 ); 140 ok( 141 alwaysclearsettings.disabled, 142 "the clear data settings button should always be disabled" 143 ); 144 } 145 146 // controls should only change in custom mode 147 await selectHistoryMode(win, "remember"); 148 expect_disabled(false); 149 check_independents(false); 150 151 // setting the mode to custom shouldn't change anything 152 await selectHistoryMode(win, "custom"); 153 expect_disabled(false); 154 check_independents(false); 155 156 await selectHistoryMode(win, "remember"); 157 } 158 159 async function test_dependent_elements_redesigned(win) { 160 let historymode = win.document.getElementById("historyMode"); 161 ok(historymode, "history mode options should exist"); 162 163 let customButton = win.document.getElementById("customHistoryButton"); 164 ok(customButton, "advanced settings button should exist"); 165 166 // button should only change in custom mode 167 ok(customButton.parentDisabled, "button is disabled in remember mode"); 168 169 // setting the mode to custom shouldn't change anything 170 await selectRedesignedHistoryMode(win, "custom"); 171 ok(!customButton.parentDisabled, "button is enabled in custom mode"); 172 173 await selectRedesignedHistoryMode(win, "remember"); 174 ok(customButton.parentDisabled, "button is disabled in remember mode"); 175 } 176 177 async function test_dependent_cookie_elements(win) { 178 let deleteOnCloseCheckbox = win.document.getElementById("deleteOnClose"); 179 let deleteOnCloseNote = win.document.getElementById("deleteOnCloseInfo"); 180 let blockCookiesMenu = win.document.getElementById("blockCookiesMenu"); 181 182 let controls = [blockCookiesMenu, deleteOnCloseCheckbox]; 183 controls.forEach(function (control) { 184 ok(control, "the dependent cookie controls should exist"); 185 }); 186 let blockCookiesCheckbox = win.document.getElementById( 187 "contentBlockingBlockCookiesCheckbox" 188 ); 189 ok(blockCookiesCheckbox, "the block cookies checkbox should exist"); 190 191 function expect_disabled(disabled, c = controls) { 192 c.forEach(function (control) { 193 is( 194 control.disabled, 195 disabled, 196 control.getAttribute("id") + 197 " should " + 198 (disabled ? "" : "not ") + 199 "be disabled" 200 ); 201 }); 202 } 203 204 blockCookiesCheckbox.checked = true; 205 controlChanged(blockCookiesCheckbox); 206 await new Promise(resolve => requestAnimationFrame(resolve)); 207 expect_disabled(false); 208 209 blockCookiesCheckbox.checked = false; 210 controlChanged(blockCookiesCheckbox); 211 await new Promise(resolve => requestAnimationFrame(resolve)); 212 expect_disabled(true, [blockCookiesMenu]); 213 expect_disabled(false, [deleteOnCloseCheckbox]); 214 is_element_hidden( 215 deleteOnCloseNote, 216 "The notice for delete on close in permanent private browsing mode should be hidden." 217 ); 218 219 blockCookiesMenu.value = "always"; 220 controlChanged(blockCookiesMenu); 221 await new Promise(resolve => requestAnimationFrame(resolve)); 222 expect_disabled(true, [deleteOnCloseCheckbox]); 223 expect_disabled(false, [blockCookiesMenu]); 224 is_element_hidden( 225 deleteOnCloseNote, 226 "The notice for delete on close in permanent private browsing mode should be hidden." 227 ); 228 229 if (win.contentBlockingCookiesAndSiteDataRejectTrackersEnabled) { 230 blockCookiesMenu.value = "trackers"; 231 } else { 232 blockCookiesMenu.value = "unvisited"; 233 } 234 controlChanged(blockCookiesMenu); 235 await new Promise(resolve => requestAnimationFrame(resolve)); 236 expect_disabled(false); 237 238 // The History mode setting for "never remember history" should still 239 // disable the "keep cookies until..." menu. 240 241 // Suppress restart prompt, because we can't restart in a mochitest. 242 win._shouldPromptForRestartPBM = false; 243 await selectHistoryMode(win, "dontremember"); 244 expect_disabled(true, [deleteOnCloseCheckbox]); 245 is_element_visible( 246 deleteOnCloseNote, 247 "The notice for delete on close in permanent private browsing mode should be visible." 248 ); 249 expect_disabled(false, [blockCookiesMenu]); 250 251 // Suppress restart prompt, because we can't restart in a mochitest. 252 win._shouldPromptForRestartPBM = false; 253 254 await selectHistoryMode(win, "remember"); 255 expect_disabled(false); 256 is_element_hidden( 257 deleteOnCloseNote, 258 "The notice for delete on close in permanent private browsing mode should be hidden." 259 ); 260 } 261 262 async function test_dependent_clearonclose_elements(win) { 263 let historymode = win.document.getElementById("historyMode"); 264 ok(historymode, "history mode menulist should exist"); 265 let pbautostart = win.document.getElementById("privateBrowsingAutoStart"); 266 ok(pbautostart, "the private browsing auto-start checkbox should exist"); 267 let alwaysclear = win.document.getElementById("alwaysClear"); 268 ok(alwaysclear, "the clear data on close checkbox should exist"); 269 let alwaysclearsettings = win.document.getElementById("clearDataSettings"); 270 ok(alwaysclearsettings, "the clear data settings button should exist"); 271 272 function expect_disabled(disabled) { 273 is( 274 alwaysclearsettings.disabled, 275 disabled, 276 "the clear data settings should " + 277 (disabled ? "" : "not ") + 278 "be disabled" 279 ); 280 } 281 282 await selectHistoryMode(win, "custom"); 283 await updateCheckBox(win, "privateBrowsingAutoStart", false); 284 285 await updateCheckBox(win, "alwaysClear", false); 286 expect_disabled(true); 287 288 await updateCheckBox(win, "alwaysClear", true); 289 expect_disabled(false); 290 291 await updateCheckBox(win, "alwaysClear", false); 292 expect_disabled(true); 293 } 294 295 async function test_dependent_prefs(win) { 296 let historymode = win.document.getElementById("historyMode"); 297 ok(historymode, "history mode menulist should exist"); 298 let controls = [ 299 win.document.getElementById("rememberHistory"), 300 win.document.getElementById("rememberForms"), 301 ]; 302 controls.forEach(function (control) { 303 ok(control, "the micro-management controls should exist"); 304 }); 305 306 function expect_checked(checked) { 307 controls.forEach(function (control) { 308 is( 309 control.checked, 310 checked, 311 control.getAttribute("id") + 312 " should " + 313 (checked ? "" : "not ") + 314 "be checked" 315 ); 316 }); 317 } 318 319 // controls should be checked in remember mode 320 await selectHistoryMode(win, "remember"); 321 // Initial updates from prefs are not sync, so wait: 322 await TestUtils.waitForCondition(() => controls[0].checked); 323 expect_checked(true); 324 325 // even if they're unchecked in custom mode 326 await selectHistoryMode(win, "custom"); 327 328 for (let control of controls) { 329 await updateCheckBox(win, control.id, false); 330 } 331 expect_checked(false); 332 await selectHistoryMode(win, "remember"); 333 expect_checked(true); 334 } 335 336 function test_historymode_retention(mode, expect) { 337 return async function test_historymode_retention_fn(win) { 338 let historymode = win.document.getElementById("historyMode"); 339 ok(historymode, "history mode menulist should exist"); 340 341 if ( 342 (historymode.value == "remember" && mode == "dontremember") || 343 (historymode.value == "dontremember" && mode == "remember") || 344 (historymode.value == "custom" && mode == "dontremember") 345 ) { 346 return; 347 } 348 349 if (expect !== undefined) { 350 is( 351 historymode.value, 352 expect, 353 "history mode is expected to remain " + expect 354 ); 355 } 356 357 await selectHistoryMode(win, mode); 358 }; 359 } 360 361 function test_historymode_retention_redesign(mode, expect) { 362 return async function test_historymode_retention_fn(win) { 363 let historymode = win.document.getElementById("historyMode"); 364 ok(historymode, "history mode menulist should exist"); 365 366 if ( 367 (historymode.value == "remember" && mode == "dontremember") || 368 (historymode.value == "dontremember" && mode == "remember") || 369 (historymode.value == "custom" && mode == "dontremember") 370 ) { 371 return; 372 } 373 374 if (expect !== undefined) { 375 is( 376 historymode.value, 377 expect, 378 "history mode is expected to remain " + expect 379 ); 380 } 381 382 await selectRedesignedHistoryMode(win, mode); 383 }; 384 } 385 386 function test_custom_retention(controlToChange, expect, valueIncrement) { 387 return async function test_custom_retention_fn(win) { 388 let historymode = win.document.getElementById("historyMode"); 389 ok(historymode, "history mode menulist should exist"); 390 391 if (expect !== undefined) { 392 is( 393 historymode.value, 394 expect, 395 "history mode is expected to remain " + expect 396 ); 397 } 398 399 await selectHistoryMode(win, "custom"); 400 401 controlToChange = win.document.getElementById(controlToChange); 402 ok(controlToChange, "the control to change should exist"); 403 switch (controlToChange.localName) { 404 case "checkbox": 405 await updateCheckBox(win, controlToChange.id, !controlToChange.checked); 406 break; 407 case "menulist": 408 await selectHistoryMode(win, valueIncrement); 409 break; 410 } 411 }; 412 } 413 414 function test_custom_retention_redesign( 415 controlToChange, 416 expect, 417 valueIncrement 418 ) { 419 return async function test_custom_retention_fn(win) { 420 let historymode = win.document.getElementById("historyMode"); 421 ok(historymode, "history mode options should exist"); 422 423 if (expect !== undefined) { 424 is( 425 historymode.value, 426 expect, 427 "history mode is expected to remain " + expect 428 ); 429 } 430 431 await selectRedesignedHistoryMode(win, "custom"); 432 433 // Navigate to the custom subpane 434 let paneChange = waitForPaneChange("history"); 435 let customButton = win.document.getElementById("customHistoryButton"); 436 customButton.click(); 437 await paneChange; 438 439 controlToChange = win.document.querySelector( 440 `setting-group[groupid='historyAdvanced'] #${controlToChange}` 441 ); 442 ok(controlToChange, "the control to change should exist"); 443 switch (controlToChange.localName) { 444 case "moz-checkbox": 445 await updateCheckBoxElement(controlToChange, !controlToChange.checked); 446 break; 447 case "menulist": 448 await selectRedesignedHistoryMode(win, valueIncrement); 449 break; 450 } 451 }; 452 } 453 454 const gPrefCache = new Map(); 455 456 function cache_preferences(win) { 457 let prefs = win.Preferences.getAll(); 458 for (let pref of prefs) { 459 gPrefCache.set(pref.id, pref.value); 460 } 461 } 462 463 function reset_preferences(win) { 464 let prefs = win.Preferences.getAll(); 465 // Avoid assigning undefined, which means clearing a "user"/test pref value 466 for (let pref of prefs) { 467 if (gPrefCache.has(pref.id)) { 468 pref.value = gPrefCache.get(pref.id); 469 } 470 } 471 } 472 473 function run_test_subset(subset) { 474 info("subset: " + Array.from(subset, x => x.name).join(",") + "\n"); 475 let tests = [cache_preferences, ...subset, reset_preferences]; 476 for (let test of tests) { 477 add_task(runTestOnPrivacyPrefPane.bind(undefined, test)); 478 } 479 }