michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: /* static functions */ michael@0: let DEBUG = 0; michael@0: let debug; michael@0: if (DEBUG) { michael@0: debug = function (s) { dump("-*- PermissionPromptService: " + s + "\n"); }; michael@0: } michael@0: else { michael@0: debug = function (s) {}; michael@0: } michael@0: michael@0: const Cc = Components.classes; michael@0: const Ci = Components.interfaces; michael@0: const Cu = Components.utils; michael@0: michael@0: Cu.import("resource://gre/modules/XPCOMUtils.jsm"); michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/PermissionsInstaller.jsm"); michael@0: michael@0: const PERMISSIONPROMPTSERVICE_CONTRACTID = "@mozilla.org/permission-prompt-service;1"; michael@0: const PERMISSIONPROMPTSERVICE_CID = Components.ID("{e5f953b3-a6ca-444e-a88d-cdc81383741c}"); michael@0: const permissionPromptService = Ci.nsIPermissionPromptService; michael@0: michael@0: var permissionManager = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager); michael@0: var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager); michael@0: michael@0: function makePrompt() michael@0: { michael@0: return Cc["@mozilla.org/content-permission/prompt;1"].createInstance(Ci.nsIContentPermissionPrompt); michael@0: } michael@0: michael@0: function PermissionPromptService() michael@0: { michael@0: debug("Constructor"); michael@0: } michael@0: michael@0: PermissionPromptService.prototype = { michael@0: michael@0: classID : PERMISSIONPROMPTSERVICE_CID, michael@0: michael@0: QueryInterface : XPCOMUtils.generateQI([permissionPromptService, Ci.nsIObserver]), michael@0: michael@0: classInfo : XPCOMUtils.generateCI({classID: PERMISSIONPROMPTSERVICE_CID, michael@0: contractID: PERMISSIONPROMPTSERVICE_CONTRACTID, michael@0: classDescription: "PermissionPromptService", michael@0: interfaces: [permissionPromptService] michael@0: }), michael@0: /** michael@0: * getPermission michael@0: * Ask for permission for an API, device, etc. michael@0: * @param nsIContentPermissionRequest aRequest michael@0: * @returns void michael@0: **/ michael@0: getPermission: function PS_getPermission(aRequest) michael@0: { michael@0: if (!(aRequest instanceof Ci.nsIContentPermissionRequest)) { michael@0: throw new Error("PermissionService.getPermission: " michael@0: + "2nd argument must be type 'nsIContentPermissionRequest'"); michael@0: } michael@0: michael@0: // Only allow exactly one permission request here. michael@0: let types = aRequest.types.QueryInterface(Ci.nsIArray); michael@0: if (types.length != 1) { michael@0: aRequest.cancel(); michael@0: return; michael@0: } michael@0: let reqType = types.queryElementAt(0, Ci.nsIContentPermissionType); michael@0: michael@0: let type = reqType.access !== "unused" ? reqType.type + "-" + reqType.access michael@0: : reqType.type; michael@0: let perm = michael@0: permissionManager.testExactPermissionFromPrincipal(aRequest.principal, type); michael@0: michael@0: switch (perm) { michael@0: case Ci.nsIPermissionManager.ALLOW_ACTION: michael@0: aRequest.allow(); michael@0: break; michael@0: case Ci.nsIPermissionManager.PROMPT_ACTION: michael@0: makePrompt().prompt(aRequest); michael@0: break; michael@0: case Ci.nsIPermissionManager.DENY_ACTION: michael@0: case Ci.nsIPermissionManager.UNKNOWN_ACTION: michael@0: default: michael@0: aRequest.cancel(); michael@0: break; michael@0: } michael@0: }, michael@0: }; michael@0: michael@0: this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionPromptService]);