tor-browser

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

test_devtools_socket_status.js (4447B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 const {
      7  useDistinctSystemPrincipalLoader,
      8  releaseDistinctSystemPrincipalLoader,
      9 } = ChromeUtils.importESModule(
     10  "resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs",
     11  { global: "shared" }
     12 );
     13 
     14 const { DevToolsSocketStatus } = ChromeUtils.importESModule(
     15  "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs"
     16 );
     17 
     18 add_task(async function () {
     19  Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true);
     20  Services.prefs.setBoolPref("devtools.debugger.prompt-connection", false);
     21 
     22  info("Without any server started, all states should be set to false");
     23  checkSocketStatus(false, false);
     24 
     25  info("Start a first server, expect all states to change to true");
     26  const server = await setupDevToolsServer({ fromBrowserToolbox: false });
     27  checkSocketStatus(true, true);
     28 
     29  info("Start another server, expect all states to remain true");
     30  const otherServer = await setupDevToolsServer({ fromBrowserToolbox: false });
     31  checkSocketStatus(true, true);
     32 
     33  info("Shutdown one of the servers, expect all states to remain true");
     34  teardownDevToolsServer(otherServer);
     35  checkSocketStatus(true, true);
     36 
     37  info("Shutdown the other server, expect all states to change to false");
     38  teardownDevToolsServer(server);
     39  checkSocketStatus(false, false);
     40 
     41  info(
     42    "Start a 'browser toolbox' server, expect only the 'include' state to become true"
     43  );
     44  const browserToolboxServer = await setupDevToolsServer({
     45    fromBrowserToolbox: true,
     46  });
     47  checkSocketStatus(true, false);
     48 
     49  info(
     50    "Shutdown the 'browser toolbox' server, expect all states to become false"
     51  );
     52  teardownDevToolsServer(browserToolboxServer);
     53  checkSocketStatus(false, false);
     54 
     55  Services.prefs.clearUserPref("devtools.debugger.remote-enabled");
     56  Services.prefs.clearUserPref("devtools.debugger.prompt-connection");
     57 });
     58 
     59 function checkSocketStatus(expectedExcludeFalse, expectedExcludeTrue) {
     60  const openedDefault = DevToolsSocketStatus.hasSocketOpened();
     61  const openedExcludeFalse = DevToolsSocketStatus.hasSocketOpened({
     62    excludeBrowserToolboxSockets: false,
     63  });
     64  const openedExcludeTrue = DevToolsSocketStatus.hasSocketOpened({
     65    excludeBrowserToolboxSockets: true,
     66  });
     67 
     68  equal(
     69    openedDefault,
     70    openedExcludeFalse,
     71    "DevToolsSocketStatus.hasSocketOpened should default to excludeBrowserToolboxSockets=false"
     72  );
     73  equal(
     74    openedExcludeFalse,
     75    expectedExcludeFalse,
     76    "DevToolsSocketStatus matches the expectation for excludeBrowserToolboxSockets=false"
     77  );
     78  equal(
     79    openedExcludeTrue,
     80    expectedExcludeTrue,
     81    "DevToolsSocketStatus matches the expectation for excludeBrowserToolboxSockets=true"
     82  );
     83 }
     84 
     85 async function setupDevToolsServer({ fromBrowserToolbox }) {
     86  info("Use the dedicated system principal loader for the DevToolsServer.");
     87  const requester = {};
     88  const loader = useDistinctSystemPrincipalLoader(requester);
     89 
     90  const { DevToolsServer } = loader.require(
     91    "resource://devtools/server/devtools-server.js"
     92  );
     93 
     94  DevToolsServer.init();
     95  DevToolsServer.registerAllActors();
     96  DevToolsServer.allowChromeProcess = true;
     97  const socketOptions = {
     98    fromBrowserToolbox,
     99    // Pass -1 to automatically choose an available port
    100    portOrPath: -1,
    101  };
    102 
    103  const listener = new SocketListener(DevToolsServer, socketOptions);
    104  ok(listener, "Socket listener created");
    105 
    106  // Note that useDistinctSystemPrincipalLoader will lead to reuse the same
    107  // loader if we are creating several servers in a row. The DevToolsServer
    108  // singleton might already have sockets opened.
    109  const listeningSockets = DevToolsServer.listeningSockets;
    110  await listener.open();
    111  equal(
    112    DevToolsServer.listeningSockets,
    113    listeningSockets + 1,
    114    "A new listening socket was created"
    115  );
    116 
    117  return { DevToolsServer, listener, requester };
    118 }
    119 
    120 function teardownDevToolsServer({ DevToolsServer, listener, requester }) {
    121  info("Close the listener socket");
    122  const listeningSockets = DevToolsServer.listeningSockets;
    123  listener.close();
    124  equal(
    125    DevToolsServer.listeningSockets,
    126    listeningSockets - 1,
    127    "A listening socket was closed"
    128  );
    129 
    130  if (DevToolsServer.listeningSockets == 0) {
    131    info("Destroy the temporary devtools server");
    132    DevToolsServer.destroy();
    133  }
    134 
    135  if (requester) {
    136    releaseDistinctSystemPrincipalLoader(requester);
    137  }
    138 }