tor-browser

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

head_dbg.js (5403B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 /* exported Cr, CC, NetUtil, errorCount, initTestDevToolsServer,
      7            writeTestTempFile, socket_transport, local_transport, really_long
      8 */
      9 
     10 var CC = Components.Constructor;
     11 
     12 const { require } = ChromeUtils.importESModule(
     13  "resource://devtools/shared/loader/Loader.sys.mjs"
     14 );
     15 const { NetUtil } = ChromeUtils.importESModule(
     16  "resource://gre/modules/NetUtil.sys.mjs"
     17 );
     18 
     19 // We do not want to log packets by default, because in some tests,
     20 // we can be sending large amounts of data. The test harness has
     21 // trouble dealing with logging all the data, and we end up with
     22 // intermittent time outs (e.g. bug 775924).
     23 // Services.prefs.setBoolPref("devtools.debugger.log", true);
     24 // Services.prefs.setBoolPref("devtools.debugger.log.verbose", true);
     25 // Enable remote debugging for the relevant tests.
     26 Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true);
     27 
     28 const {
     29  ActorRegistry,
     30 } = require("resource://devtools/server/actors/utils/actor-registry.js");
     31 const {
     32  DevToolsServer,
     33 } = require("resource://devtools/server/devtools-server.js");
     34 const {
     35  DevToolsClient,
     36 } = require("resource://devtools/client/devtools-client.js");
     37 const {
     38  SocketListener,
     39 } = require("resource://devtools/shared/security/socket.js");
     40 
     41 // Convert an nsIScriptError 'logLevel' value into an appropriate string.
     42 function scriptErrorLogLevel(message) {
     43  switch (message.logLevel) {
     44    case Ci.nsIConsoleMessage.info:
     45      return "info";
     46    case Ci.nsIConsoleMessage.warn:
     47      return "warning";
     48    default:
     49      Assert.equal(message.logLevel, Ci.nsIConsoleMessage.error);
     50      return "error";
     51  }
     52 }
     53 
     54 // Register a console listener, so console messages don't just disappear
     55 // into the ether.
     56 var errorCount = 0;
     57 var listener = {
     58  observe(message) {
     59    errorCount++;
     60    let string = "";
     61    try {
     62      // If we've been given an nsIScriptError, then we can print out
     63      // something nicely formatted, for tools like Emacs to pick up.
     64      message.QueryInterface(Ci.nsIScriptError);
     65      dump(
     66        message.sourceName +
     67          ":" +
     68          message.lineNumber +
     69          ": " +
     70          scriptErrorLogLevel(message) +
     71          ": " +
     72          message.errorMessage +
     73          "\n"
     74      );
     75      string = message.errorMessage;
     76    } catch (x) {
     77      // Be a little paranoid with message, as the whole goal here is to lose
     78      // no information.
     79      try {
     80        string = message.message;
     81      } catch (e) {
     82        string = "<error converting error message to string>";
     83      }
     84    }
     85 
     86    // Make sure we exit all nested event loops so that the test can finish.
     87    while (DevToolsServer.xpcInspector.eventLoopNestLevel > 0) {
     88      DevToolsServer.xpcInspector.exitNestedEventLoop();
     89    }
     90 
     91    do_throw("head_dbg.js got console message: " + string + "\n");
     92  },
     93 };
     94 
     95 Services.console.registerListener(listener);
     96 
     97 /**
     98 * Initialize the testing devtools server.
     99 */
    100 function initTestDevToolsServer() {
    101  ActorRegistry.registerModule("devtools/server/actors/thread", {
    102    prefix: "script",
    103    constructor: "ScriptActor",
    104    type: { global: true, target: true },
    105  });
    106  const { createRootActor } = require("xpcshell-test/testactors");
    107  DevToolsServer.setRootActor(createRootActor);
    108  // Allow incoming connections.
    109  DevToolsServer.init();
    110  // Avoid the server from being destroyed when the last connection closes
    111  DevToolsServer.keepAlive = true;
    112 }
    113 
    114 /**
    115 * Wrapper around do_get_file to prefix files with the name of current test to
    116 * avoid collisions when running in parallel.
    117 */
    118 function getTestTempFile(fileName, allowMissing) {
    119  let thisTest = _TEST_FILE.toString().replace(/\\/g, "/");
    120  thisTest = thisTest.substring(thisTest.lastIndexOf("/") + 1);
    121  thisTest = thisTest.replace(/\..*$/, "");
    122  return do_get_file(fileName + "-" + thisTest, allowMissing);
    123 }
    124 
    125 function writeTestTempFile(fileName, content) {
    126  const file = getTestTempFile(fileName, true);
    127  const stream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(
    128    Ci.nsIFileOutputStream
    129  );
    130  stream.init(file, -1, -1, 0);
    131  try {
    132    do {
    133      const numWritten = stream.write(content, content.length);
    134      content = content.slice(numWritten);
    135    } while (content.length);
    136  } finally {
    137    stream.close();
    138  }
    139 }
    140 
    141 /*** Transport Factories ***/
    142 
    143 var socket_transport = async function () {
    144  if (!DevToolsServer.listeningSockets) {
    145    const AuthenticatorType = DevToolsServer.Authenticators.get("PROMPT");
    146    const authenticator = new AuthenticatorType.Server();
    147    authenticator.allowConnection = () => {
    148      return DevToolsServer.AuthenticationResult.ALLOW;
    149    };
    150    const socketOptions = {
    151      authenticator,
    152      portOrPath: -1,
    153    };
    154    const debuggerListener = new SocketListener(DevToolsServer, socketOptions);
    155    await debuggerListener.open();
    156  }
    157  const port = DevToolsServer._listeners[0].port;
    158  info("DevTools server port is " + port);
    159  return DevToolsClient.socketConnect({ host: "127.0.0.1", port });
    160 };
    161 
    162 function local_transport() {
    163  return Promise.resolve(DevToolsServer.connectPipe());
    164 }
    165 
    166 /*** Sample Data ***/
    167 
    168 var gReallyLong;
    169 function really_long() {
    170  if (gReallyLong) {
    171    return gReallyLong;
    172  }
    173  let ret = "0123456789";
    174  for (let i = 0; i < 18; i++) {
    175    ret += ret;
    176  }
    177  gReallyLong = ret;
    178  return ret;
    179 }