mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 17:25:36 +00:00
e4b74becff
I generally tried to preserve the behavior of consumers where they treated an exception from getInterface(Ci.nsIContentFrameMessageManager) as a signal to use some sort of fallback. I did change the behavior of consumers that walked up to the root same-type docshell before getting the message manager to just get it directly from the docshell they have. Please review those parts carefully, and let me know if you want me to ask some subject area experts to review those.
71 lines
2.4 KiB
JavaScript
71 lines
2.4 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* 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/. */
|
|
|
|
/**
|
|
* This process script is for small observers that we want to register
|
|
* once per content process, usually in order to forward content-based
|
|
* observer service notifications to the chrome process through
|
|
* message passing. Using a process script avoids having them in
|
|
* content.js and thereby registering N observers for N open tabs,
|
|
* which is bad for perf.
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
ChromeUtils.defineModuleGetter(this, "WebRTCChild",
|
|
"resource:///actors/WebRTCChild.jsm");
|
|
|
|
var gEMEUIObserver = function(subject, topic, data) {
|
|
let win = subject.top;
|
|
let mm = getMessageManagerForWindow(win);
|
|
if (mm) {
|
|
mm.sendAsyncMessage("EMEVideo:ContentMediaKeysRequest", data);
|
|
}
|
|
};
|
|
|
|
var gDecoderDoctorObserver = function(subject, topic, data) {
|
|
let win = subject.top;
|
|
let mm = getMessageManagerForWindow(win);
|
|
if (mm) {
|
|
mm.sendAsyncMessage("DecoderDoctor:Notification", data);
|
|
}
|
|
};
|
|
|
|
function getMessageManagerForWindow(aContentWindow) {
|
|
return aContentWindow.docShell.messageManager;
|
|
}
|
|
|
|
Services.obs.addObserver(gEMEUIObserver, "mediakeys-request");
|
|
Services.obs.addObserver(gDecoderDoctorObserver, "decoder-doctor-notification");
|
|
|
|
|
|
// WebRTCChild observer registration.
|
|
const kWebRTCObserverTopics = ["getUserMedia:request",
|
|
"recording-device-stopped",
|
|
"PeerConnection:request",
|
|
"recording-device-events",
|
|
"recording-window-ended"];
|
|
|
|
function webRTCObserve(aSubject, aTopic, aData) {
|
|
WebRTCChild.observe(aSubject, aTopic, aData);
|
|
}
|
|
|
|
for (let topic of kWebRTCObserverTopics) {
|
|
Services.obs.addObserver(webRTCObserve, topic);
|
|
}
|
|
|
|
if (Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT)
|
|
Services.obs.addObserver(processShutdown, "content-child-shutdown");
|
|
|
|
function processShutdown() {
|
|
for (let topic of kWebRTCObserverTopics) {
|
|
Services.obs.removeObserver(webRTCObserve, topic);
|
|
}
|
|
Services.obs.removeObserver(processShutdown, "content-child-shutdown");
|
|
}
|