tor-browser

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

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 }