From 795cb89ab5566508751baf1ba2f590e704e05df0 Mon Sep 17 00:00:00 2001 From: Alexandre Poirot Date: Mon, 2 Dec 2013 11:34:47 -0500 Subject: [PATCH] Bug 941012 - Always use SDK loader to load DebuggerServer. r=jryans --- toolkit/devtools/Loader.jsm | 1 + toolkit/devtools/server/dbg-server.jsm | 30 ++---------- toolkit/devtools/server/main.js | 64 ++++++++++++-------------- 3 files changed, 35 insertions(+), 60 deletions(-) diff --git a/toolkit/devtools/Loader.jsm b/toolkit/devtools/Loader.jsm index d2c8bb03473..530831976ae 100644 --- a/toolkit/devtools/Loader.jsm +++ b/toolkit/devtools/Loader.jsm @@ -35,6 +35,7 @@ let loaderGlobals = { btoa: btoa, console: console, _Iterator: Iterator, + ChromeWorker: ChromeWorker, loader: { lazyGetter: XPCOMUtils.defineLazyGetter.bind(XPCOMUtils), lazyImporter: XPCOMUtils.defineLazyModuleGetter.bind(XPCOMUtils), diff --git a/toolkit/devtools/server/dbg-server.jsm b/toolkit/devtools/server/dbg-server.jsm index 44d88f3c319..4087d6ab4ec 100644 --- a/toolkit/devtools/server/dbg-server.jsm +++ b/toolkit/devtools/server/dbg-server.jsm @@ -15,31 +15,11 @@ const Ci = Components.interfaces; const Cc = Components.classes; const Cu = Components.utils; +const { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); + this.EXPORTED_SYMBOLS = ["DebuggerServer", "ActorPool"]; -var loadSubScript = - "function loadSubScript(aURL)\n" + - "{\n" + - "const Ci = Components.interfaces;\n" + - "const Cc = Components.classes;\n" + - " try {\n" + - " let loader = Cc[\"@mozilla.org/moz/jssubscript-loader;1\"]\n" + - " .getService(Ci.mozIJSSubScriptLoader);\n" + - " loader.loadSubScript(aURL, this);\n" + - " } catch(e) {\n" + - " dump(\"Error loading: \" + aURL + \": \" + e + \" - \" + e.stack + \"\\n\");\n" + - " throw e;\n" + - " }\n" + - "}"; +let server = devtools.require("devtools/server/main"); -// Load the debugging server in a sandbox with its own compartment. -var systemPrincipal = Cc["@mozilla.org/systemprincipal;1"] - .createInstance(Ci.nsIPrincipal); - -var gGlobal = Cu.Sandbox(systemPrincipal); -gGlobal.ChromeWorker = ChromeWorker; -Cu.evalInSandbox(loadSubScript, gGlobal, "1.8"); -gGlobal.loadSubScript("resource://gre/modules/devtools/server/main.js"); - -this.DebuggerServer = gGlobal.DebuggerServer; -this.ActorPool = gGlobal.ActorPool; +this.DebuggerServer = server.DebuggerServer; +this.ActorPool = server.ActorPool; diff --git a/toolkit/devtools/server/main.js b/toolkit/devtools/server/main.js index 01f78e7991c..ae2f86788cc 100644 --- a/toolkit/devtools/server/main.js +++ b/toolkit/devtools/server/main.js @@ -10,36 +10,22 @@ * debugging global. */ -// |this.require| is used to test if this file was loaded via the devtools -// loader (as it is in DebuggerProcess.jsm) or via loadSubScript (as it is from -// dbg-server.jsm). Note that testing |require| is not safe in either -// situation, as it causes a ReferenceError. -var Ci, Cc, CC, Cu, Cr, Components; -if (this.require) { - ({ Ci, Cc, CC, Cu, Cr, components: Components }) = require("chrome"); -} else { - ({ - interfaces: Ci, - classes: Cc, - Constructor: CC, - utils: Cu, - results: Cr - }) = Components; -} - -// On B2G, if |this.require| is undefined at this point, it remains undefined -// later on when |DebuggerServer.registerModule| is called. On desktop (and -// perhaps other places), if |this.require| starts out undefined, it ends up -// being set to some native code by the time we get to |registerModule|. Here -// we perform a test early on, and then cache the correct require function for -// later use. -var localRequire; -if (this.require) { - localRequire = id => require(id); -} else { - let { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); - localRequire = id => devtools.require(id); -} +// Until all Debugger server code is converted to SDK modules, +// imports Components.* alias from chrome module. +var { Ci, Cc, CC, Cu, Cr } = require("chrome"); +// On B2G, `this` != Global scope, so `Ci` won't be binded on `this` +// (i.e. this.Ci is undefined) Then later, when using loadSubScript, +// Ci,... won't be defined for sub scripts. +this.Ci = Ci; +this.Cc = Cc; +this.CC = CC; +this.Cu = Cu; +this.Cr = Cr; +// Overload `Components` to prevent SDK loader exception on Components +// object usage +Object.defineProperty(this, "Components", { + get: function () require("chrome").components +}); const DBG_STRINGS_URI = "chrome://global/locale/devtools/debugger.properties"; @@ -68,10 +54,12 @@ function loadSubScript(aURL) } } -let loaderRequire = this.require; -this.require = null; -loadSubScript.call(this, "resource://gre/modules/commonjs/sdk/core/promise.js"); -this.require = loaderRequire; +let {defer, resolve, reject, promised, all} = require("sdk/core/promise"); +this.defer = defer; +this.resolve = resolve; +this.reject = reject; +this.promised = promised; +this.all = all; Cu.import("resource://gre/modules/devtools/SourceMap.jsm"); @@ -82,12 +70,14 @@ function dumpn(str) { dump("DBG-SERVER: " + str + "\n"); } } +this.dumpn = dumpn; function dbg_assert(cond, e) { if (!cond) { return e; } } +this.dbg_assert = dbg_assert; loadSubScript.call(this, "resource://gre/modules/devtools/server/transport.js"); @@ -324,7 +314,7 @@ var DebuggerServer = { } let moduleAPI = ModuleAPI(); - let mod = localRequire(id); + let mod = require(id); mod.register(moduleAPI); gRegisteredModules[id] = { module: mod, api: moduleAPI }; }, @@ -688,6 +678,8 @@ var DebuggerServer = { if (this.exports) { exports.DebuggerServer = DebuggerServer; } +// Needed on B2G (See header note) +this.DebuggerServer = DebuggerServer; /** * Construct an ActorPool. @@ -706,6 +698,8 @@ function ActorPool(aConnection) if (this.exports) { exports.ActorPool = ActorPool; } +// Needed on B2G (See header note) +this.ActorPool = ActorPool; ActorPool.prototype = { /**