mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-13 03:24:26 +00:00
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:
parent
c1adf2fe24
commit
9a1d46ab79
@ -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();
|
||||
});
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user