tor-browser

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

browser_SitePermissions.js (7497B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 const LOCAL_NETWORK_ACCESS_ENABLED = Services.prefs.getBoolPref(
      8  "network.lna.blocking"
      9 );
     10 
     11 // This tests the SitePermissions.getAllPermissionDetailsForBrowser function.
     12 add_task(async function testGetAllPermissionDetailsForBrowser() {
     13  let principal =
     14    Services.scriptSecurityManager.createContentPrincipalFromOrigin(
     15      "https://example.com"
     16    );
     17 
     18  let tab = await BrowserTestUtils.openNewForegroundTab(
     19    gBrowser,
     20    principal.spec
     21  );
     22 
     23  Services.prefs.setIntPref("permissions.default.shortcuts", 2);
     24 
     25  let browser = tab.linkedBrowser;
     26 
     27  SitePermissions.setForPrincipal(principal, "camera", SitePermissions.ALLOW);
     28 
     29  SitePermissions.setForPrincipal(
     30    principal,
     31    "cookie",
     32    SitePermissions.ALLOW_COOKIES_FOR_SESSION
     33  );
     34  SitePermissions.setForPrincipal(principal, "popup", SitePermissions.BLOCK);
     35  SitePermissions.setForPrincipal(
     36    principal,
     37    "geo",
     38    SitePermissions.ALLOW,
     39    SitePermissions.SCOPE_SESSION
     40  );
     41 
     42  SitePermissions.setForPrincipal(
     43    principal,
     44    "localhost",
     45    SitePermissions.ALLOW,
     46    SitePermissions.SCOPE_SESSION
     47  );
     48 
     49  SitePermissions.setForPrincipal(
     50    principal,
     51    "local-network",
     52    SitePermissions.ALLOW,
     53    SitePermissions.SCOPE_SESSION
     54  );
     55 
     56  SitePermissions.setForPrincipal(
     57    principal,
     58    "shortcuts",
     59    SitePermissions.ALLOW
     60  );
     61 
     62  SitePermissions.setForPrincipal(principal, "xr", SitePermissions.ALLOW);
     63 
     64  let permissions = SitePermissions.getAllPermissionDetailsForBrowser(browser);
     65 
     66  let camera = permissions.find(({ id }) => id === "camera");
     67  Assert.deepEqual(camera, {
     68    id: "camera",
     69    label: "Use the camera",
     70    state: SitePermissions.ALLOW,
     71    scope: SitePermissions.SCOPE_PERSISTENT,
     72  });
     73 
     74  // Check that removed permissions (State.UNKNOWN) are skipped.
     75  SitePermissions.removeFromPrincipal(principal, "camera");
     76  permissions = SitePermissions.getAllPermissionDetailsForBrowser(browser);
     77 
     78  camera = permissions.find(({ id }) => id === "camera");
     79  Assert.equal(camera, undefined);
     80 
     81  let cookie = permissions.find(({ id }) => id === "cookie");
     82  Assert.deepEqual(cookie, {
     83    id: "cookie",
     84    label: "Set cookies",
     85    state: SitePermissions.ALLOW_COOKIES_FOR_SESSION,
     86    scope: SitePermissions.SCOPE_PERSISTENT,
     87  });
     88 
     89  let popup = permissions.find(({ id }) => id === "popup");
     90  Assert.deepEqual(popup, {
     91    id: "popup",
     92    label: "Pop-ups and third-party redirects",
     93    state: SitePermissions.BLOCK,
     94    scope: SitePermissions.SCOPE_PERSISTENT,
     95  });
     96 
     97  let geo = permissions.find(({ id }) => id === "geo");
     98  Assert.deepEqual(geo, {
     99    id: "geo",
    100    label: "Access your location",
    101    state: SitePermissions.ALLOW,
    102    scope: SitePermissions.SCOPE_SESSION,
    103  });
    104 
    105  if (LOCAL_NETWORK_ACCESS_ENABLED) {
    106    let localhost = permissions.find(({ id }) => id === "localhost");
    107    Assert.deepEqual(localhost, {
    108      id: "localhost",
    109      label: "Access this device",
    110      state: SitePermissions.ALLOW,
    111      scope: SitePermissions.SCOPE_SESSION,
    112    });
    113 
    114    let localNetwork = permissions.find(({ id }) => id === "local-network");
    115    Assert.deepEqual(localNetwork, {
    116      id: "local-network",
    117      label: "Access local network devices",
    118      state: SitePermissions.ALLOW,
    119      scope: SitePermissions.SCOPE_SESSION,
    120    });
    121  }
    122 
    123  let shortcuts = permissions.find(({ id }) => id === "shortcuts");
    124  Assert.deepEqual(shortcuts, {
    125    id: "shortcuts",
    126    label: "Override keyboard shortcuts",
    127    state: SitePermissions.ALLOW,
    128    scope: SitePermissions.SCOPE_PERSISTENT,
    129  });
    130 
    131  let xr = permissions.find(({ id }) => id === "xr");
    132  Assert.deepEqual(xr, {
    133    id: "xr",
    134    label: "Access virtual reality devices",
    135    state: SitePermissions.ALLOW,
    136    scope: SitePermissions.SCOPE_PERSISTENT,
    137  });
    138 
    139  SitePermissions.removeFromPrincipal(principal, "cookie");
    140  SitePermissions.removeFromPrincipal(principal, "popup");
    141  SitePermissions.removeFromPrincipal(principal, "geo");
    142  SitePermissions.removeFromPrincipal(principal, "localhost");
    143  SitePermissions.removeFromPrincipal(principal, "local-network");
    144  SitePermissions.removeFromPrincipal(principal, "shortcuts");
    145 
    146  SitePermissions.removeFromPrincipal(principal, "xr");
    147 
    148  Services.prefs.clearUserPref("permissions.default.shortcuts");
    149 
    150  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    151 });
    152 
    153 add_task(async function testTemporaryChangeEvent() {
    154  let principal =
    155    Services.scriptSecurityManager.createContentPrincipalFromOrigin(
    156      "https://example.com"
    157    );
    158 
    159  let tab = await BrowserTestUtils.openNewForegroundTab(
    160    gBrowser,
    161    principal.spec
    162  );
    163 
    164  let browser = tab.linkedBrowser;
    165 
    166  let changeEventCount = 0;
    167  function listener() {
    168    changeEventCount++;
    169  }
    170 
    171  browser.addEventListener("PermissionStateChange", listener);
    172 
    173  // Test browser-specific permissions.
    174  SitePermissions.setForPrincipal(
    175    browser.contentPrincipal,
    176    "autoplay-media",
    177    SitePermissions.BLOCK,
    178    SitePermissions.SCOPE_GLOBAL,
    179    browser
    180  );
    181  is(changeEventCount, 1, "Should've changed");
    182 
    183  // Setting the same value shouldn't dispatch a change event.
    184  SitePermissions.setForPrincipal(
    185    browser.contentPrincipal,
    186    "autoplay-media",
    187    SitePermissions.BLOCK,
    188    SitePermissions.SCOPE_GLOBAL,
    189    browser
    190  );
    191  is(changeEventCount, 1, "Shouldn't have changed");
    192 
    193  browser.removeEventListener("PermissionStateChange", listener);
    194 
    195  BrowserTestUtils.removeTab(tab);
    196 });
    197 
    198 add_task(async function testInvalidPrincipal() {
    199  // Check that an error is thrown when an invalid principal argument is passed.
    200  try {
    201    SitePermissions.isSupportedPrincipal("file:///example.js");
    202  } catch (e) {
    203    Assert.equal(
    204      e.message,
    205      "Argument passed as principal is not an instance of Ci.nsIPrincipal"
    206    );
    207  }
    208  try {
    209    SitePermissions.removeFromPrincipal(null, "canvas");
    210  } catch (e) {
    211    Assert.equal(
    212      e.message,
    213      "Atleast one of the arguments, either principal or browser should not be null."
    214    );
    215  }
    216  try {
    217    SitePermissions.setForPrincipal(
    218      "blah",
    219      "camera",
    220      SitePermissions.ALLOW,
    221      SitePermissions.SCOPE_PERSISTENT,
    222      gBrowser.selectedBrowser
    223    );
    224  } catch (e) {
    225    Assert.equal(
    226      e.message,
    227      "Argument passed as principal is not an instance of Ci.nsIPrincipal"
    228    );
    229  }
    230  try {
    231    SitePermissions.getAllByPrincipal("blah");
    232  } catch (e) {
    233    Assert.equal(
    234      e.message,
    235      "Argument passed as principal is not an instance of Ci.nsIPrincipal"
    236    );
    237  }
    238  try {
    239    SitePermissions.getAllByPrincipal(null);
    240  } catch (e) {
    241    Assert.equal(e.message, "principal argument cannot be null.");
    242  }
    243  try {
    244    SitePermissions.getForPrincipal(5, "camera");
    245  } catch (e) {
    246    Assert.equal(
    247      e.message,
    248      "Argument passed as principal is not an instance of Ci.nsIPrincipal"
    249    );
    250  }
    251  // Check that no error is thrown when passing valid principal and browser arguments.
    252  Assert.deepEqual(
    253    SitePermissions.getForPrincipal(gBrowser.contentPrincipal, "camera"),
    254    {
    255      state: SitePermissions.UNKNOWN,
    256      scope: SitePermissions.SCOPE_PERSISTENT,
    257    }
    258  );
    259  Assert.deepEqual(
    260    SitePermissions.getForPrincipal(null, "camera", gBrowser.selectedBrowser),
    261    {
    262      state: SitePermissions.UNKNOWN,
    263      scope: SitePermissions.SCOPE_PERSISTENT,
    264    }
    265  );
    266 });