tor-browser

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

browser_commands_from_url.js (4910B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 const TEST_URI =
      5  "data:text/html;charset=utf-8," + "<p>browser_target-from-url.js</p>";
      6 
      7 const { DevToolsLoader } = ChromeUtils.importESModule(
      8  "resource://devtools/shared/loader/Loader.sys.mjs"
      9 );
     10 const {
     11  commandsFromURL,
     12 } = require("resource://devtools/client/framework/commands-from-url.js");
     13 
     14 Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true);
     15 Services.prefs.setBoolPref("devtools.debugger.prompt-connection", false);
     16 
     17 function assertTarget(target, url) {
     18  is(target.url, url);
     19  is(target.isBrowsingContext, true);
     20 }
     21 
     22 add_task(async function () {
     23  const tab = await addTab(TEST_URI);
     24  const browser = tab.linkedBrowser;
     25  let commands, target;
     26 
     27  info("Test invalid type");
     28  try {
     29    await commandsFromURL(new URL("https://foo?type=x"));
     30    ok(false, "Shouldn't pass");
     31  } catch (e) {
     32    is(e.message, "commandsFromURL, unsupported type 'x' parameter");
     33  }
     34 
     35  info("Test tab");
     36  commands = await commandsFromURL(
     37    new URL("https://foo?type=tab&id=" + browser.browserId)
     38  );
     39  // Descriptor's getTarget will only work if the TargetCommand watches for the first top target
     40  await commands.targetCommand.startListening();
     41 
     42  // For now, we can't spawn a commands flagged as 'local tab' via URL query params
     43  // The only way to has isLocalTab is to create the toolbox via showToolboxForTab
     44  // and spawn the command via CommandsFactory.forTab.
     45  is(
     46    commands.descriptorFront.isLocalTab,
     47    false,
     48    "Even if we refer to a local tab, isLocalTab is false (for now)"
     49  );
     50 
     51  target = await commands.descriptorFront.getTarget();
     52 
     53  assertTarget(target, TEST_URI);
     54  await commands.destroy();
     55 
     56  info("Test invalid tab id");
     57  try {
     58    await commandsFromURL(new URL("https://foo?type=tab&id=10000"));
     59    ok(false, "Shouldn't pass");
     60  } catch (e) {
     61    is(e.message, "commandsFromURL, tab with browserId '10000' doesn't exist");
     62  }
     63 
     64  info("Test parent process");
     65  commands = await commandsFromURL(new URL("https://foo?type=process"));
     66  target = await commands.descriptorFront.getTarget();
     67  const topWindow = Services.wm.getMostRecentBrowserWindow();
     68  assertTarget(target, topWindow.location.href);
     69  await commands.destroy();
     70 
     71  await testRemoteTCP();
     72  await testRemoteWebSocket();
     73 
     74  gBrowser.removeCurrentTab();
     75 });
     76 
     77 async function setupDevToolsServer(webSocket) {
     78  info("Create a separate loader instance for the DevToolsServer.");
     79  const loader = new DevToolsLoader();
     80  const { DevToolsServer } = loader.require(
     81    "resource://devtools/server/devtools-server.js"
     82  );
     83  const { SocketListener } = loader.require(
     84    "resource://devtools/shared/security/socket.js"
     85  );
     86 
     87  DevToolsServer.init();
     88  DevToolsServer.registerAllActors();
     89  DevToolsServer.allowChromeProcess = true;
     90  const socketOptions = {
     91    // Pass -1 to automatically choose an available port
     92    portOrPath: -1,
     93    webSocket,
     94  };
     95 
     96  const listener = new SocketListener(DevToolsServer, socketOptions);
     97  ok(listener, "Socket listener created");
     98  await listener.open();
     99  is(DevToolsServer.listeningSockets, 1, "1 listening socket");
    100 
    101  return { DevToolsServer, listener };
    102 }
    103 
    104 function teardownDevToolsServer({ DevToolsServer, listener }) {
    105  info("Close the listener socket");
    106  listener.close();
    107  is(DevToolsServer.listeningSockets, 0, "0 listening sockets");
    108 
    109  info("Destroy the temporary devtools server");
    110  DevToolsServer.destroy();
    111 }
    112 
    113 async function testRemoteTCP() {
    114  info("Test remote process via TCP Connection");
    115 
    116  const server = await setupDevToolsServer(false);
    117 
    118  const { port } = server.listener;
    119  const commands = await commandsFromURL(
    120    new URL("https://foo?type=process&host=127.0.0.1&port=" + port)
    121  );
    122  const target = await commands.descriptorFront.getTarget();
    123  const topWindow = Services.wm.getMostRecentBrowserWindow();
    124  assertTarget(target, topWindow.location.href);
    125 
    126  const settings = commands.client._transport.connectionSettings;
    127  is(settings.host, "127.0.0.1");
    128  is(parseInt(settings.port, 10), port);
    129  is(settings.webSocket, false);
    130 
    131  await commands.destroy();
    132 
    133  teardownDevToolsServer(server);
    134 }
    135 
    136 async function testRemoteWebSocket() {
    137  info("Test remote process via WebSocket Connection");
    138 
    139  const server = await setupDevToolsServer(true);
    140 
    141  const { port } = server.listener;
    142  const commands = await commandsFromURL(
    143    new URL("https://foo?type=process&host=127.0.0.1&port=" + port + "&ws=true")
    144  );
    145  const target = await commands.descriptorFront.getTarget();
    146  const topWindow = Services.wm.getMostRecentBrowserWindow();
    147  assertTarget(target, topWindow.location.href);
    148 
    149  const settings = commands.client._transport.connectionSettings;
    150  is(settings.host, "127.0.0.1");
    151  is(parseInt(settings.port, 10), port);
    152  is(settings.webSocket, true);
    153  await commands.destroy();
    154 
    155  teardownDevToolsServer(server);
    156 }