forked from mirrors/gecko-dev
		
	 16f95497b9
			
		
	
	
		16f95497b9
		
	
	
	
	
		
			
			Differential Revision: https://phabricator.services.mozilla.com/D56570 --HG-- rename : browser/modules/webrtcUI.jsm => browser/actors/WebRTCParent.jsm extra : moz-landing-system : lando
		
			
				
	
	
		
			145 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
	
		
			3.6 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/. */
 | |
| 
 | |
| /* import-globals-from fxrui.js */
 | |
| 
 | |
| /**
 | |
|  * Code to manage Permissions UI
 | |
|  *
 | |
|  * FxR on Desktop only supports granting permission for
 | |
|  * - Location
 | |
|  * - Camera
 | |
|  * - Microphone
 | |
|  * Any other permissions are automatically denied.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| // Base class for managing permissions in FxR on PC
 | |
| class FxrPermissionPromptPrototype {
 | |
|   constructor(aRequest, aBrowser, aCallback) {
 | |
|     this.request = aRequest;
 | |
|     this.targetBrowser = aBrowser;
 | |
|     this.responseCallback = aCallback;
 | |
|   }
 | |
| 
 | |
|   showPrompt() {
 | |
|     // For now, all permissions default to denied. Testing for allow must be
 | |
|     // done manually until UI is finished:
 | |
|     // Bug 1594840 - Add UI for Web Permissions in FxR for Desktop
 | |
|     this.defaultDeny();
 | |
|   }
 | |
| 
 | |
|   defaultDeny() {
 | |
|     this.handleResponse(false);
 | |
|   }
 | |
| 
 | |
|   handleResponse(allowed) {
 | |
|     if (allowed) {
 | |
|       this.allow();
 | |
|     } else {
 | |
|       this.deny();
 | |
|     }
 | |
| 
 | |
|     this.responseCallback();
 | |
|   }
 | |
| }
 | |
| 
 | |
| // WebRTC-specific class implementation
 | |
| class FxrWebRTCPrompt extends FxrPermissionPromptPrototype {
 | |
|   showPrompt() {
 | |
|     for (let typeName of this.request.requestTypes) {
 | |
|       if (typeName !== "Microphone" && typeName !== "Camera") {
 | |
|         // Only Microphone and Camera requests are allowed. Automatically deny
 | |
|         // any other request.
 | |
|         this.defaultDeny();
 | |
|         return;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     super.showPrompt();
 | |
|   }
 | |
| 
 | |
|   allow() {
 | |
|     let { audioDevices, videoDevices } = this.request;
 | |
| 
 | |
|     let principal = Services.scriptSecurityManager.createContentPrincipalFromOrigin(
 | |
|       this.request.origin
 | |
|     );
 | |
| 
 | |
|     // For now, collect the first audio and video device by default. User
 | |
|     // selection will be enabled later:
 | |
|     // Bug 1594841 - Add UI to select device for WebRTC in FxR for Desktop
 | |
|     let allowedDevices = [];
 | |
| 
 | |
|     if (audioDevices.length) {
 | |
|       allowedDevices.push(audioDevices[0].deviceIndex);
 | |
|     }
 | |
| 
 | |
|     if (videoDevices.length) {
 | |
|       Services.perms.addFromPrincipal(
 | |
|         principal,
 | |
|         "MediaManagerVideo",
 | |
|         Services.perms.ALLOW_ACTION,
 | |
|         Services.perms.EXPIRE_SESSION
 | |
|       );
 | |
|       allowedDevices.push(videoDevices[0].deviceIndex);
 | |
|     }
 | |
| 
 | |
|     // WebRTCChild doesn't currently care which actor
 | |
|     // this is sent to and just uses the windowID.
 | |
|     this.targetBrowser.sendMessageToActor(
 | |
|       "webrtc:Allow",
 | |
|       {
 | |
|         callID: this.request.callID,
 | |
|         windowID: this.request.windowID,
 | |
|         devices: allowedDevices,
 | |
|       },
 | |
|       "WebRTC"
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   deny() {
 | |
|     this.targetBrowser.sendMessageToActor(
 | |
|       "webrtc:Deny",
 | |
|       {
 | |
|         callID: this.request.callID,
 | |
|         windowID: this.request.windowID,
 | |
|       },
 | |
|       "WebRTC"
 | |
|     );
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Implementation for other, non-WebRTC web permission prompts
 | |
| class FxrContentPrompt extends FxrPermissionPromptPrototype {
 | |
|   showPrompt() {
 | |
|     // Only allow exactly one permission request here.
 | |
|     let types = this.request.types.QueryInterface(Ci.nsIArray);
 | |
|     if (types.length != 1) {
 | |
|       this.defaultDeny();
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     // Only Location is supported from this type of request
 | |
|     let type = types.queryElementAt(0, Ci.nsIContentPermissionType).type;
 | |
|     if (type !== "geolocation") {
 | |
|       this.defaultDeny();
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     // Override type so that it can be more easily interpreted by the code
 | |
|     // for the prompt.
 | |
|     type = "Location";
 | |
|     super.showPrompt();
 | |
|   }
 | |
| 
 | |
|   allow() {
 | |
|     this.request.allow();
 | |
|   }
 | |
| 
 | |
|   deny() {
 | |
|     this.request.cancel();
 | |
|   }
 | |
| }
 |