gecko-dev/devtools/server/content-server.jsm

80 строки
2.5 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const Ci = Components.interfaces;
const Cc = Components.classes;
const Cu = Components.utils;
this.EXPORTED_SYMBOLS = ["init"];
let gLoader;
function setupServer(mm) {
// Prevent spawning multiple server per process, even if the caller call us
// multiple times
if (gLoader) {
return gLoader;
}
// Lazy load Loader.jsm to prevent loading any devtools dependency too early.
let { DevToolsLoader } =
Cu.import("resource://devtools/shared/Loader.jsm", {});
// Init a custom, invisible DebuggerServer, in order to not pollute the
// debugger with all devtools modules, nor break the debugger itself with
// using it in the same process.
gLoader = new DevToolsLoader();
gLoader.invisibleToDebugger = true;
let { DebuggerServer } = gLoader.require("devtools/server/main");
if (!DebuggerServer.initialized) {
DebuggerServer.init();
}
// In case of apps being loaded in parent process, DebuggerServer is already
// initialized, but child specific actors are not registered.
// Otherwise, for child process, we need to load actors the first
// time we load child.js
DebuggerServer.addChildActors();
// Clean up things when the client disconnects
mm.addMessageListener("debug:content-process-destroy", function onDestroy() {
mm.removeMessageListener("debug:content-process-destroy", onDestroy);
DebuggerServer.destroy();
gLoader.destroy();
gLoader = null;
});
return gLoader;
}
function init(msg) {
let mm = msg.target;
mm.QueryInterface(Ci.nsISyncMessageSender);
let prefix = msg.data.prefix;
// Setup a server if none started yet
let loader = setupServer(mm);
// Connect both parent/child processes debugger servers RDP via message
// managers
let { DebuggerServer } = loader.require("devtools/server/main");
let conn = DebuggerServer.connectToParent(prefix, mm);
conn.parentMessageManager = mm;
let { ChildProcessActor } =
loader.require("devtools/server/actors/child-process");
let { ActorPool } = loader.require("devtools/server/main");
let actor = new ChildProcessActor(conn);
let actorPool = new ActorPool(conn);
actorPool.addActor(actor);
conn.addActorPool(actorPool);
let response = { actor: actor.form() };
mm.sendAsyncMessage("debug:content-process-actor", response);
}