diff options
Diffstat (limited to 'dom/permission/PermissionPromptService.js')
-rw-r--r-- | dom/permission/PermissionPromptService.js | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/dom/permission/PermissionPromptService.js b/dom/permission/PermissionPromptService.js new file mode 100644 index 000000000..47418d5de --- /dev/null +++ b/dom/permission/PermissionPromptService.js @@ -0,0 +1,95 @@ +/* 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/. */ + +"use strict"; + +/* static functions */ +var DEBUG = 0; +var debug; +if (DEBUG) { + debug = function (s) { dump("-*- PermissionPromptService: " + s + "\n"); }; +} +else { + debug = function (s) {}; +} + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cu = Components.utils; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/PermissionsInstaller.jsm"); + +const PERMISSIONPROMPTSERVICE_CONTRACTID = "@mozilla.org/permission-prompt-service;1"; +const PERMISSIONPROMPTSERVICE_CID = Components.ID("{e5f953b3-a6ca-444e-a88d-cdc81383741c}"); +const permissionPromptService = Ci.nsIPermissionPromptService; + +var permissionManager = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager); +var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager); + +function makePrompt() +{ + return Cc["@mozilla.org/content-permission/prompt;1"].createInstance(Ci.nsIContentPermissionPrompt); +} + +function PermissionPromptService() +{ + debug("Constructor"); +} + +PermissionPromptService.prototype = { + + classID : PERMISSIONPROMPTSERVICE_CID, + + QueryInterface : XPCOMUtils.generateQI([permissionPromptService, Ci.nsIObserver]), + + classInfo : XPCOMUtils.generateCI({classID: PERMISSIONPROMPTSERVICE_CID, + contractID: PERMISSIONPROMPTSERVICE_CONTRACTID, + classDescription: "PermissionPromptService", + interfaces: [permissionPromptService] + }), + /** + * getPermission + * Ask for permission for an API, device, etc. + * @param nsIContentPermissionRequest aRequest + * @returns void + **/ + getPermission: function PS_getPermission(aRequest) + { + if (!(aRequest instanceof Ci.nsIContentPermissionRequest)) { + throw new Error("PermissionService.getPermission: " + + "2nd argument must be type 'nsIContentPermissionRequest'"); + } + + // Only allow exactly one permission request here. + let types = aRequest.types.QueryInterface(Ci.nsIArray); + if (types.length != 1) { + aRequest.cancel(); + return; + } + let reqType = types.queryElementAt(0, Ci.nsIContentPermissionType); + + let type = reqType.access !== "unused" ? reqType.type + "-" + reqType.access + : reqType.type; + let perm = + permissionManager.testExactPermissionFromPrincipal(aRequest.principal, type); + + switch (perm) { + case Ci.nsIPermissionManager.ALLOW_ACTION: + aRequest.allow(); + break; + case Ci.nsIPermissionManager.PROMPT_ACTION: + makePrompt().prompt(aRequest); + break; + case Ci.nsIPermissionManager.DENY_ACTION: + case Ci.nsIPermissionManager.UNKNOWN_ACTION: + default: + aRequest.cancel(); + break; + } + }, +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionPromptService]); |