Bug 1315044 - Prevent loading multiple loaders and debugger servers when creating multiple ContentActors. r=jryans

MozReview-Commit-ID: 4slVLBNdGyg

--HG--
extra : rebase_source : 8838adf475e31fe5683cc7fa172c2ced837b9157
This commit is contained in:
Alexandre Poirot 2016-11-04 08:04:21 -07:00
parent c1adf2fe24
commit 9a1d46ab79
2 changed files with 74 additions and 24 deletions

View File

@ -8,18 +8,27 @@ const Ci = Components.interfaces;
const Cc = Components.classes;
const Cu = Components.utils;
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
const { DevToolsLoader } = Cu.import("resource://devtools/shared/Loader.jsm", {});
this.EXPORTED_SYMBOLS = ["init"];
function init(msg) {
// 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.
let devtools = new DevToolsLoader();
devtools.invisibleToDebugger = true;
let { DebuggerServer, ActorPool } = devtools.require("devtools/server/main");
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();
@ -31,26 +40,40 @@ function init(msg) {
// 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;
// Connect both parent/child processes debugger servers RDP via message managers
// 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 } = devtools.require("devtools/server/actors/child-process");
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()};
let response = { actor: actor.form() };
mm.sendAsyncMessage("debug:content-process-actor", response);
mm.addMessageListener("debug:content-process-destroy", function onDestroy() {
mm.removeMessageListener("debug:content-process-destroy", onDestroy);
DebuggerServer.destroy();
});
}

View File

@ -20,6 +20,7 @@ let Ci = Components.interfaces;
let {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
let {DebuggerClient} = require("devtools/shared/client/main");
let {DebuggerServer} = require("devtools/server/main");
let Services = require("Services");
window.onload = function() {
SimpleTest.waitForExplicitFinish();
@ -111,16 +112,42 @@ function runTests() {
let actor = response.form;
is(actor, firstActor,
"Second call to getProcess with the same id returns the same form");
closeClient();
});
}
function processScript() {
let listener = function () {
Services.obs.removeObserver(listener, "sdk:loader:destroy", false);
sendAsyncMessage("test:getProcess-destroy", null);
};
Services.obs.addObserver(listener, "sdk:loader:destroy", false);
}
function closeClient() {
let onLoaderDestroyed = new Promise(done => {
let processListener = function () {
Services.ppmm.removeMessageListener("test:getProcess-destroy", processListener)
done();
};
Services.ppmm.addMessageListener("test:getProcess-destroy", processListener)
});
let script = "data:,(" + processScript + ")()";
Services.ppmm.loadProcessScript(script, true);
client.close();
onLoaderDestroyed.then(function () {
Services.ppmm.removeDelayedProcessScript(script);
info("Loader destroyed in the content process");
cleanup();
});
}
function cleanup() {
client.close().then(function () {
DebuggerServer.destroy();
iframe.remove();
SimpleTest.finish()
});
DebuggerServer.destroy();
iframe.remove();
SimpleTest.finish()
}
connect();