forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathprocess-content.js
92 lines (77 loc) · 2.79 KB
/
process-content.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* 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";
// 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.
const { Services } = ChromeUtils.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);
});
let TOPICS = [
"chrome-document-global-created",
"content-document-global-created",
];
if (gInContentProcess) {
TOPICS.push("inner-window-destroyed");
TOPICS.push("xpcom-shutdown");
}
let ProcessObserver = {
init() {
for (let topic of TOPICS) {
Services.obs.addObserver(this, topic);
}
},
uninit() {
for (let topic of TOPICS) {
Services.obs.removeObserver(this, topic);
}
},
observe(subject, topic, data) {
switch (topic) {
case "chrome-document-global-created":
case "content-document-global-created": {
// Strip the hash from the URL, because it's not part of the origin.
let window = subject;
let url = window.document.documentURI.replace(/[\#|\?].*$/, "");
let registeredURLs = Services.cpmm.sharedData.get(
"RemotePageManager:urls"
);
if (!registeredURLs || !registeredURLs.has(url)) {
return;
}
// Get the frame message manager for this window so we can associate this
// page with a browser element
let messageManager = window.docShell.messageManager;
let { ChildMessagePort } = ChromeUtils.import(
"resource://gre/modules/remotepagemanager/RemotePageManagerChild.jsm"
);
// Set up the child side of the message port
new ChildMessagePort(messageManager, window);
break;
}
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();