summaryrefslogtreecommitdiffstats
path: root/browser/fxr/content/permissions.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/fxr/content/permissions.js')
-rw-r--r--browser/fxr/content/permissions.js145
1 files changed, 145 insertions, 0 deletions
diff --git a/browser/fxr/content/permissions.js b/browser/fxr/content/permissions.js
new file mode 100644
index 0000000000..ee8d8fbd42
--- /dev/null
+++ b/browser/fxr/content/permissions.js
@@ -0,0 +1,145 @@
+/* -*- 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();
+ }
+}