mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-09 12:51:09 +02:00
It seems to be possible for an inner-window-destroyed notification to be dispatched after xpcom-shutdown. This means that communications over the Services.cpmm are attempted after the connection to the parent process has already been torn down. This can cause an Exception to be thrown, which can keep the ContentProcessMessageManager alive long enough to cause SpiderMonkey to complain that there are still living elements in its heap at JS shutdown time. MozReview-Commit-ID: wmCHtqcjkJ --HG-- extra : rebase_source : 0e888b5a71080faa87c60369f1fec776a259663f
64 lines
2 KiB
JavaScript
64 lines
2 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";
|
|
|
|
var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
|
|
|
|
// Creates a new PageListener for this process. This will listen for page loads
|
|
// and for those that match URLs provided by the parent process will set up
|
|
// a dedicated message port and notify the parent process.
|
|
Cu.import("resource://gre/modules/RemotePageManager.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
const gInContentProcess = Services.appinfo.processType == Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT;
|
|
|
|
Services.cpmm.addMessageListener("gmp-plugin-crash", msg => {
|
|
let gmpservice = Cc["@mozilla.org/gecko-media-plugin-service;1"]
|
|
.getService(Ci.mozIGeckoMediaPluginService);
|
|
|
|
gmpservice.RunPluginCrashCallbacks(msg.data.pluginID, msg.data.pluginName);
|
|
});
|
|
|
|
if (gInContentProcess) {
|
|
let ProcessObserver = {
|
|
TOPICS: [
|
|
"inner-window-destroyed",
|
|
"xpcom-shutdown",
|
|
],
|
|
|
|
init() {
|
|
for (let topic of this.TOPICS) {
|
|
Services.obs.addObserver(this, topic, false);
|
|
}
|
|
},
|
|
|
|
uninit() {
|
|
for (let topic of this.TOPICS) {
|
|
Services.obs.removeObserver(this, topic);
|
|
}
|
|
},
|
|
|
|
observe(subject, topic, data) {
|
|
switch (topic) {
|
|
case "inner-window-destroyed": {
|
|
// Forward inner-window-destroyed notifications with the
|
|
// inner window ID, so that code in the parent that should
|
|
// do something when content windows go away can do it
|
|
let innerWindowID =
|
|
subject.QueryInterface(Ci.nsISupportsPRUint64).data;
|
|
Services.cpmm.sendAsyncMessage("Toolkit:inner-window-destroyed",
|
|
innerWindowID);
|
|
break;
|
|
}
|
|
case "xpcom-shutdown": {
|
|
this.uninit();
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
|
|
ProcessObserver.init();
|
|
}
|