tor-browser

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

browser_child_resource.js (6927B)


      1 /*
      2 Any copyright is dedicated to the Public Domain.
      3 http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 "use strict";
      6 
      7 // This must be loaded in the remote process for this test to be useful
      8 const TEST_URL = "https://example.com/browser/netwerk/test/browser/dummy.html";
      9 
     10 const expectedRemote = gMultiProcessBrowser ? "true" : "";
     11 
     12 const resProtocol = Cc[
     13  "@mozilla.org/network/protocol;1?name=resource"
     14 ].getService(Ci.nsIResProtocolHandler);
     15 
     16 function waitForEvent(obj, name, capturing, chromeEvent) {
     17  info("Waiting for " + name);
     18  return new Promise(resolve => {
     19    function listener(event) {
     20      info("Saw " + name);
     21      obj.removeEventListener(name, listener, capturing, chromeEvent);
     22      resolve(event);
     23    }
     24 
     25    obj.addEventListener(name, listener, capturing, chromeEvent);
     26  });
     27 }
     28 
     29 function resolveURI(uri) {
     30  uri = Services.io.newURI(uri);
     31  try {
     32    return resProtocol.resolveURI(uri);
     33  } catch (e) {
     34    return null;
     35  }
     36 }
     37 
     38 function remoteResolveURI(uri) {
     39  return SpecialPowers.spawn(gBrowser.selectedBrowser, [uri], uriToResolve => {
     40    let resProtocol = Cc[
     41      "@mozilla.org/network/protocol;1?name=resource"
     42    ].getService(Ci.nsIResProtocolHandler);
     43 
     44    uriToResolve = Services.io.newURI(uriToResolve);
     45    try {
     46      return resProtocol.resolveURI(uriToResolve);
     47    } catch (e) {}
     48    return null;
     49  });
     50 }
     51 
     52 // Restarts the child process by crashing it then reloading the tab
     53 var restart = async function () {
     54  let browser = gBrowser.selectedBrowser;
     55  // If the tab isn't remote this would crash the main process so skip it
     56  if (browser.getAttribute("remote") != "true") {
     57    return browser;
     58  }
     59 
     60  await BrowserTestUtils.crashFrame(browser);
     61 
     62  browser.reload();
     63 
     64  await BrowserTestUtils.browserLoaded(browser);
     65  is(
     66    browser.getAttribute("remote"),
     67    expectedRemote,
     68    "Browser should be in the right process"
     69  );
     70  return browser;
     71 };
     72 
     73 // Sanity check that this test is going to be useful
     74 add_task(async function () {
     75  await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
     76 
     77  // This must be loaded in the remote process for this test to be useful
     78  is(
     79    gBrowser.selectedBrowser.getAttribute("remote"),
     80    expectedRemote,
     81    "Browser should be in the right process"
     82  );
     83 
     84  let local = resolveURI("resource://gre/modules/AppConstants.jsm");
     85  let remote = await remoteResolveURI(
     86    "resource://gre/modules/AppConstants.jsm"
     87  );
     88  is(local, remote, "AppConstants.jsm should resolve in both processes");
     89 
     90  gBrowser.removeCurrentTab();
     91 });
     92 
     93 // Add a mapping, update it then remove it
     94 add_task(async function () {
     95  await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
     96 
     97  info("Set");
     98  resProtocol.setSubstitution(
     99    "testing",
    100    Services.io.newURI("chrome://global/content")
    101  );
    102  let local = resolveURI("resource://testing/test.js");
    103  let remote = await remoteResolveURI("resource://testing/test.js");
    104  is(
    105    local,
    106    "chrome://global/content/test.js",
    107    "Should resolve in main process"
    108  );
    109  is(
    110    remote,
    111    "chrome://global/content/test.js",
    112    "Should resolve in child process"
    113  );
    114 
    115  info("Change");
    116  resProtocol.setSubstitution(
    117    "testing",
    118    Services.io.newURI("chrome://global/skin")
    119  );
    120  local = resolveURI("resource://testing/test.js");
    121  remote = await remoteResolveURI("resource://testing/test.js");
    122  is(local, "chrome://global/skin/test.js", "Should resolve in main process");
    123  is(remote, "chrome://global/skin/test.js", "Should resolve in child process");
    124 
    125  info("Clear");
    126  resProtocol.setSubstitution("testing", null);
    127  local = resolveURI("resource://testing/test.js");
    128  remote = await remoteResolveURI("resource://testing/test.js");
    129  is(local, null, "Shouldn't resolve in main process");
    130  is(remote, null, "Shouldn't resolve in child process");
    131 
    132  gBrowser.removeCurrentTab();
    133 });
    134 
    135 // Add a mapping, restart the child process then check it is still there
    136 add_task(async function () {
    137  await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
    138 
    139  info("Set");
    140  resProtocol.setSubstitution(
    141    "testing",
    142    Services.io.newURI("chrome://global/content")
    143  );
    144  let local = resolveURI("resource://testing/test.js");
    145  let remote = await remoteResolveURI("resource://testing/test.js");
    146  is(
    147    local,
    148    "chrome://global/content/test.js",
    149    "Should resolve in main process"
    150  );
    151  is(
    152    remote,
    153    "chrome://global/content/test.js",
    154    "Should resolve in child process"
    155  );
    156 
    157  await restart();
    158 
    159  local = resolveURI("resource://testing/test.js");
    160  remote = await remoteResolveURI("resource://testing/test.js");
    161  is(
    162    local,
    163    "chrome://global/content/test.js",
    164    "Should resolve in main process"
    165  );
    166  is(
    167    remote,
    168    "chrome://global/content/test.js",
    169    "Should resolve in child process"
    170  );
    171 
    172  info("Change");
    173  resProtocol.setSubstitution(
    174    "testing",
    175    Services.io.newURI("chrome://global/skin")
    176  );
    177 
    178  await restart();
    179 
    180  local = resolveURI("resource://testing/test.js");
    181  remote = await remoteResolveURI("resource://testing/test.js");
    182  is(local, "chrome://global/skin/test.js", "Should resolve in main process");
    183  is(remote, "chrome://global/skin/test.js", "Should resolve in child process");
    184 
    185  info("Clear");
    186  resProtocol.setSubstitution("testing", null);
    187 
    188  await restart();
    189 
    190  local = resolveURI("resource://testing/test.js");
    191  remote = await remoteResolveURI("resource://testing/test.js");
    192  is(local, null, "Shouldn't resolve in main process");
    193  is(remote, null, "Shouldn't resolve in child process");
    194 
    195  gBrowser.removeCurrentTab();
    196 });
    197 
    198 // Adding a mapping to a resource URI should work
    199 add_task(async function () {
    200  await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
    201 
    202  info("Set");
    203  resProtocol.setSubstitution(
    204    "testing",
    205    Services.io.newURI("chrome://global/content")
    206  );
    207  resProtocol.setSubstitution(
    208    "testing2",
    209    Services.io.newURI("resource://testing")
    210  );
    211  let local = resolveURI("resource://testing2/test.js");
    212  let remote = await remoteResolveURI("resource://testing2/test.js");
    213  is(
    214    local,
    215    "chrome://global/content/test.js",
    216    "Should resolve in main process"
    217  );
    218  is(
    219    remote,
    220    "chrome://global/content/test.js",
    221    "Should resolve in child process"
    222  );
    223 
    224  info("Clear");
    225  resProtocol.setSubstitution("testing", null);
    226  local = resolveURI("resource://testing2/test.js");
    227  remote = await remoteResolveURI("resource://testing2/test.js");
    228  is(
    229    local,
    230    "chrome://global/content/test.js",
    231    "Should resolve in main process"
    232  );
    233  is(
    234    remote,
    235    "chrome://global/content/test.js",
    236    "Should resolve in child process"
    237  );
    238 
    239  resProtocol.setSubstitution("testing2", null);
    240  local = resolveURI("resource://testing2/test.js");
    241  remote = await remoteResolveURI("resource://testing2/test.js");
    242  is(local, null, "Shouldn't resolve in main process");
    243  is(remote, null, "Shouldn't resolve in child process");
    244 
    245  gBrowser.removeCurrentTab();
    246 });