tor-browser

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

browser_vendored.js (6045B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 const { RootMessageHandler } = ChromeUtils.importESModule(
      7  "chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs"
      8 );
      9 
     10 add_task(async function test_vendored_commands() {
     11  // Navigate to a page to make sure that the windowglobal modules run in a
     12  // different process than the root module.
     13  const tab = BrowserTestUtils.addTab(
     14    gBrowser,
     15    "https://example.com/document-builder.sjs?html=tab"
     16  );
     17  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
     18  const browsingContextId = tab.linkedBrowser.browsingContext.id;
     19 
     20  const rootMessageHandler = createRootMessageHandler(
     21    "session-id-vendored-commands"
     22  );
     23 
     24  const valueFromRoot = await rootMessageHandler.handleCommand({
     25    moduleName: "vendor:vendored",
     26    commandName: "testRoot",
     27    destination: {
     28      type: RootMessageHandler.type,
     29    },
     30  });
     31  is(valueFromRoot, "valueFromRoot");
     32 
     33  const valueFromWindowGlobal = await rootMessageHandler.handleCommand({
     34    moduleName: "vendor:vendored",
     35    commandName: "testWindowGlobal",
     36    destination: {
     37      type: WindowGlobalMessageHandler.type,
     38      id: browsingContextId,
     39    },
     40  });
     41  is(valueFromWindowGlobal, "valueFromWindowGlobal");
     42 
     43  const valueFromWindowGlobalInRoot = await rootMessageHandler.handleCommand({
     44    moduleName: "vendor:vendored",
     45    commandName: "testWindowGlobalInRoot",
     46    destination: {
     47      type: WindowGlobalMessageHandler.type,
     48      id: browsingContextId,
     49    },
     50  });
     51  is(valueFromWindowGlobalInRoot, "valueFromWindowGlobalInRoot");
     52 
     53  rootMessageHandler.destroy();
     54  gBrowser.removeTab(tab);
     55 });
     56 
     57 add_task(async function test_vendored_events_dispatcher() {
     58  // Navigate to a page to make sure that the windowglobal modules run in a
     59  // different process than the root module.
     60  const tab = BrowserTestUtils.addTab(
     61    gBrowser,
     62    "https://example.com/document-builder.sjs?html=tab"
     63  );
     64  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
     65  const browsingContext = tab.linkedBrowser.browsingContext;
     66  const browsingContextId = browsingContext.id;
     67 
     68  const rootMessageHandler = createRootMessageHandler(
     69    "session-id-vendored-events-dispatcher"
     70  );
     71  const events = [];
     72  const onEvent = (event, data) => events.push(data);
     73  await rootMessageHandler.eventsDispatcher.on(
     74    "vendor:vendored.vendoredWindowGlobalEvent",
     75    {
     76      type: ContextDescriptorType.TopBrowsingContext,
     77      id: browsingContext.browserId,
     78    },
     79    onEvent
     80  );
     81 
     82  await rootMessageHandler.handleCommand({
     83    moduleName: "vendor:vendored",
     84    commandName: "emitVendoredWindowGlobalEvent",
     85    destination: {
     86      type: WindowGlobalMessageHandler.type,
     87      id: browsingContextId,
     88    },
     89  });
     90 
     91  await BrowserTestUtils.waitForCondition(() => events.length === 1);
     92  is(events[0], "vendoredWindowGlobalEventValue");
     93 
     94  await rootMessageHandler.eventsDispatcher.on(
     95    "vendor:vendored.vendoredRootEvent",
     96    {
     97      type: ContextDescriptorType.All,
     98    },
     99    onEvent
    100  );
    101 
    102  await rootMessageHandler.handleCommand({
    103    moduleName: "vendor:vendored",
    104    commandName: "emitVendoredRootEvent",
    105    destination: {
    106      type: RootMessageHandler.type,
    107    },
    108  });
    109 
    110  await BrowserTestUtils.waitForCondition(() => events.length === 2);
    111  is(events[1], "vendoredRootEventValue");
    112 
    113  rootMessageHandler.destroy();
    114  gBrowser.removeTab(tab);
    115 });
    116 
    117 add_task(async function test_vendored_session_data() {
    118  // Navigate to a page to make sure that the windowglobal modules run in a
    119  // different process than the root module.
    120  const tab = BrowserTestUtils.addTab(
    121    gBrowser,
    122    "https://example.com/document-builder.sjs?html=tab"
    123  );
    124  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
    125  const browsingContextId = tab.linkedBrowser.browsingContext.id;
    126 
    127  const rootMessageHandler = createRootMessageHandler(
    128    "session-id-vendored-session-data"
    129  );
    130 
    131  await rootMessageHandler.updateSessionData([
    132    {
    133      method: "add",
    134      moduleName: "vendor:vendored",
    135      category: "vendored-session-data",
    136      contextDescriptor: contextDescriptorAll,
    137      values: ["vendored-session-data-value"],
    138    },
    139  ]);
    140 
    141  const valueFromSessionData = await rootMessageHandler.handleCommand({
    142    moduleName: "vendor:vendored",
    143    commandName: "getSessionDataValue",
    144    destination: {
    145      type: WindowGlobalMessageHandler.type,
    146      id: browsingContextId,
    147    },
    148  });
    149  is(valueFromSessionData[0].value, "vendored-session-data-value");
    150 
    151  rootMessageHandler.destroy();
    152  gBrowser.removeTab(tab);
    153 });
    154 
    155 add_task(async function test_vendored_unknown_modules() {
    156  // Navigate to a page to make sure that the windowglobal modules run in a
    157  // different process than the root module.
    158  const tab = BrowserTestUtils.addTab(
    159    gBrowser,
    160    "https://example.com/document-builder.sjs?html=tab"
    161  );
    162  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
    163 
    164  const rootMessageHandler = createRootMessageHandler(
    165    "session-id-vendored-commands"
    166  );
    167 
    168  info("Attempt to call a vendored module with an unknown vendor prefix");
    169  Assert.throws(
    170    () =>
    171      rootMessageHandler.handleCommand({
    172        moduleName: "rodnev:vendored",
    173        commandName: "testRoot",
    174        destination: {
    175          type: RootMessageHandler.type,
    176        },
    177      }),
    178    err =>
    179      err.name == "UnsupportedCommandError" &&
    180      err.message ==
    181        `rodnev:vendored.testRoot not supported for destination ROOT`
    182  );
    183 
    184  info("Attempt to call an unknown vendored module with a valid vendor prefix");
    185  Assert.throws(
    186    () =>
    187      rootMessageHandler.handleCommand({
    188        moduleName: "vendor:derodnev",
    189        commandName: "testRoot",
    190        destination: {
    191          type: RootMessageHandler.type,
    192        },
    193      }),
    194    err =>
    195      err.name == "UnsupportedCommandError" &&
    196      err.message ==
    197        `vendor:derodnev.testRoot not supported for destination ROOT`
    198  );
    199 
    200  rootMessageHandler.destroy();
    201  gBrowser.removeTab(tab);
    202 });