forked from mirrors/gecko-dev
		
	 e4b74becff
			
		
	
	
		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.
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 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");
 | |
| }
 |