gecko-dev/browser/fxr/content/permissions.js
2020-01-10 15:09:59 +00:00

146 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();
}
}