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 }