tor-browser

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

browser_pageinfo_permissions.js (8737B)


      1 const { PermissionTestUtils } = ChromeUtils.importESModule(
      2  "resource://testing-common/PermissionTestUtils.sys.mjs"
      3 );
      4 
      5 const TEST_ORIGIN = "https://example.com";
      6 const TEST_ORIGIN_CERT_ERROR = "https://expired.example.com";
      7 const LOW_TLS_VERSION = "https://tls1.example.com/";
      8 
      9 async function testPermissions(defaultPermission) {
     10  await BrowserTestUtils.withNewTab(TEST_ORIGIN, async function () {
     11    let pageInfo = BrowserCommands.pageInfo(TEST_ORIGIN, "permTab");
     12    await BrowserTestUtils.waitForEvent(pageInfo, "load");
     13 
     14    let defaultCheckbox = await TestUtils.waitForCondition(() =>
     15      pageInfo.document.getElementById("geoDef")
     16    );
     17    let radioGroup = pageInfo.document.getElementById("geoRadioGroup");
     18    let defaultRadioButton = pageInfo.document.getElementById(
     19      "geo#" + defaultPermission
     20    );
     21    let blockRadioButton = pageInfo.document.getElementById("geo#2");
     22 
     23    ok(defaultCheckbox.checked, "The default checkbox should be checked.");
     24 
     25    PermissionTestUtils.add(
     26      gBrowser.currentURI,
     27      "geo",
     28      Services.perms.DENY_ACTION
     29    );
     30 
     31    ok(!defaultCheckbox.checked, "The default checkbox should not be checked.");
     32 
     33    defaultCheckbox.checked = true;
     34    defaultCheckbox.doCommand();
     35 
     36    ok(
     37      !PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo"),
     38      "Checking the default checkbox should reset the permission."
     39    );
     40 
     41    defaultCheckbox.checked = false;
     42    defaultCheckbox.doCommand();
     43 
     44    ok(
     45      !PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo"),
     46      "Unchecking the default checkbox should pick the default permission."
     47    );
     48    is(
     49      radioGroup.selectedItem,
     50      defaultRadioButton,
     51      "The unknown radio button should be selected."
     52    );
     53 
     54    radioGroup.selectedItem = blockRadioButton;
     55    blockRadioButton.doCommand();
     56 
     57    is(
     58      PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo")
     59        .capability,
     60      Services.perms.DENY_ACTION,
     61      "Selecting a value in the radio group should set the corresponding permission"
     62    );
     63 
     64    radioGroup.selectedItem = defaultRadioButton;
     65    defaultRadioButton.doCommand();
     66 
     67    ok(
     68      !PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo"),
     69      "Selecting the default value should reset the permission."
     70    );
     71    ok(defaultCheckbox.checked, "The default checkbox should be checked.");
     72 
     73    pageInfo.close();
     74    PermissionTestUtils.remove(gBrowser.currentURI, "geo");
     75  });
     76 }
     77 
     78 // Test displaying website permissions on certificate error pages.
     79 add_task(async function test_CertificateError() {
     80  let browser;
     81  let pageLoaded;
     82  await BrowserTestUtils.openNewForegroundTab(
     83    gBrowser,
     84    () => {
     85      gBrowser.selectedTab = BrowserTestUtils.addTab(
     86        gBrowser,
     87        TEST_ORIGIN_CERT_ERROR
     88      );
     89      browser = gBrowser.selectedBrowser;
     90      pageLoaded = BrowserTestUtils.waitForErrorPage(browser);
     91    },
     92    false
     93  );
     94 
     95  await pageLoaded;
     96 
     97  let pageInfo = BrowserCommands.pageInfo(TEST_ORIGIN_CERT_ERROR, "permTab");
     98  await BrowserTestUtils.waitForEvent(pageInfo, "load");
     99  let permissionTab = pageInfo.document.getElementById("permTab");
    100  await TestUtils.waitForCondition(
    101    () => BrowserTestUtils.isVisible(permissionTab),
    102    "Permission tab should be visible."
    103  );
    104 
    105  let hostText = pageInfo.document.getElementById("hostText");
    106  let permList = pageInfo.document.getElementById("permList");
    107  let excludedPermissions = pageInfo.window.getExcludedPermissions();
    108  let permissions = SitePermissions.listPermissions().filter(
    109    p =>
    110      SitePermissions.getPermissionLabel(p) != null &&
    111      !excludedPermissions.includes(p)
    112  );
    113 
    114  await TestUtils.waitForCondition(
    115    () => hostText.value === browser.currentURI.displayPrePath,
    116    `Value of owner should be "${browser.currentURI.displayPrePath}" instead got "${hostText.value}".`
    117  );
    118 
    119  await TestUtils.waitForCondition(
    120    () => permList.childElementCount === permissions.length,
    121    `Value of verifier should be ${permissions.length}, instead got ${permList.childElementCount}.`
    122  );
    123 
    124  pageInfo.close();
    125  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    126 });
    127 
    128 // Test displaying website permissions on network error pages.
    129 add_task(async function test_NetworkError() {
    130  // Setup for TLS error
    131  Services.prefs.setIntPref("security.tls.version.max", 3);
    132  Services.prefs.setIntPref("security.tls.version.min", 3);
    133 
    134  let browser;
    135  let pageLoaded;
    136  await BrowserTestUtils.openNewForegroundTab(
    137    gBrowser,
    138    () => {
    139      gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, LOW_TLS_VERSION);
    140      browser = gBrowser.selectedBrowser;
    141      pageLoaded = BrowserTestUtils.waitForErrorPage(browser);
    142    },
    143    false
    144  );
    145 
    146  await pageLoaded;
    147 
    148  let pageInfo = BrowserCommands.pageInfo(LOW_TLS_VERSION, "permTab");
    149  await BrowserTestUtils.waitForEvent(pageInfo, "load");
    150  let permissionTab = pageInfo.document.getElementById("permTab");
    151  await TestUtils.waitForCondition(
    152    () => BrowserTestUtils.isVisible(permissionTab),
    153    "Permission tab should be visible."
    154  );
    155 
    156  let hostText = pageInfo.document.getElementById("hostText");
    157  let permList = pageInfo.document.getElementById("permList");
    158  let excludedPermissions = pageInfo.window.getExcludedPermissions();
    159  let permissions = SitePermissions.listPermissions().filter(
    160    p =>
    161      SitePermissions.getPermissionLabel(p) != null &&
    162      !excludedPermissions.includes(p)
    163  );
    164 
    165  await TestUtils.waitForCondition(
    166    () => hostText.value === browser.currentURI.displayPrePath,
    167    `Value of host should be should be "${browser.currentURI.displayPrePath}" instead got "${hostText.value}".`
    168  );
    169 
    170  await TestUtils.waitForCondition(
    171    () => permList.childElementCount === permissions.length,
    172    `Value of permissions list should be ${permissions.length}, instead got ${permList.childElementCount}.`
    173  );
    174 
    175  pageInfo.close();
    176  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    177 });
    178 
    179 // Test some standard operations in the permission tab.
    180 add_task(async function test_geo_permission() {
    181  await testPermissions(Services.perms.UNKNOWN_ACTION);
    182 });
    183 
    184 // Test some standard operations in the permission tab, falling back to a custom
    185 // default permission instead of UNKNOWN.
    186 add_task(async function test_default_geo_permission() {
    187  await SpecialPowers.pushPrefEnv({
    188    set: [["permissions.default.geo", SitePermissions.ALLOW]],
    189  });
    190  await testPermissions(Services.perms.ALLOW_ACTION);
    191 });
    192 
    193 // Test special behavior for cookie permissions.
    194 add_task(async function test_cookie_permission() {
    195  await BrowserTestUtils.withNewTab(TEST_ORIGIN, async function () {
    196    let pageInfo = BrowserCommands.pageInfo(TEST_ORIGIN, "permTab");
    197    await BrowserTestUtils.waitForEvent(pageInfo, "load");
    198 
    199    let defaultCheckbox = await TestUtils.waitForCondition(() =>
    200      pageInfo.document.getElementById("cookieDef")
    201    );
    202    let radioGroup = pageInfo.document.getElementById("cookieRadioGroup");
    203    let allowRadioButton = pageInfo.document.getElementById("cookie#1");
    204    let blockRadioButton = pageInfo.document.getElementById("cookie#2");
    205 
    206    ok(defaultCheckbox.checked, "The default checkbox should be checked.");
    207 
    208    defaultCheckbox.checked = false;
    209    defaultCheckbox.dispatchEvent(new Event("command"));
    210 
    211    is(
    212      PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"),
    213      SitePermissions.ALLOW,
    214      "Unchecking the default checkbox should pick the default permission."
    215    );
    216    is(
    217      radioGroup.selectedItem,
    218      allowRadioButton,
    219      "The unknown radio button should be selected."
    220    );
    221 
    222    radioGroup.selectedItem = blockRadioButton;
    223    blockRadioButton.doCommand();
    224 
    225    is(
    226      PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"),
    227      SitePermissions.BLOCK,
    228      "Selecting a value in the radio group should set the corresponding permission"
    229    );
    230 
    231    radioGroup.selectedItem = allowRadioButton;
    232    allowRadioButton.doCommand();
    233 
    234    is(
    235      PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"),
    236      SitePermissions.ALLOW,
    237      "Selecting a value in the radio group should set the corresponding permission"
    238    );
    239    ok(!defaultCheckbox.checked, "The default checkbox should not be checked.");
    240 
    241    defaultCheckbox.checked = true;
    242    defaultCheckbox.doCommand();
    243 
    244    is(
    245      PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"),
    246      SitePermissions.UNKNOWN,
    247      "Checking the default checkbox should reset the permission."
    248    );
    249    is(
    250      radioGroup.selectedItem,
    251      null,
    252      "For cookies, no item should be selected when the checkbox is checked."
    253    );
    254 
    255    pageInfo.close();
    256    PermissionTestUtils.remove(gBrowser.currentURI, "cookie");
    257  });
    258 });