|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 /* static functions */ |
|
8 let DEBUG = 0; |
|
9 let debug; |
|
10 if (DEBUG) { |
|
11 debug = function (s) { dump("-*- PermissionPromptService: " + s + "\n"); }; |
|
12 } |
|
13 else { |
|
14 debug = function (s) {}; |
|
15 } |
|
16 |
|
17 const Cc = Components.classes; |
|
18 const Ci = Components.interfaces; |
|
19 const Cu = Components.utils; |
|
20 |
|
21 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
22 Cu.import("resource://gre/modules/Services.jsm"); |
|
23 Cu.import("resource://gre/modules/PermissionsInstaller.jsm"); |
|
24 |
|
25 const PERMISSIONPROMPTSERVICE_CONTRACTID = "@mozilla.org/permission-prompt-service;1"; |
|
26 const PERMISSIONPROMPTSERVICE_CID = Components.ID("{e5f953b3-a6ca-444e-a88d-cdc81383741c}"); |
|
27 const permissionPromptService = Ci.nsIPermissionPromptService; |
|
28 |
|
29 var permissionManager = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager); |
|
30 var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager); |
|
31 |
|
32 function makePrompt() |
|
33 { |
|
34 return Cc["@mozilla.org/content-permission/prompt;1"].createInstance(Ci.nsIContentPermissionPrompt); |
|
35 } |
|
36 |
|
37 function PermissionPromptService() |
|
38 { |
|
39 debug("Constructor"); |
|
40 } |
|
41 |
|
42 PermissionPromptService.prototype = { |
|
43 |
|
44 classID : PERMISSIONPROMPTSERVICE_CID, |
|
45 |
|
46 QueryInterface : XPCOMUtils.generateQI([permissionPromptService, Ci.nsIObserver]), |
|
47 |
|
48 classInfo : XPCOMUtils.generateCI({classID: PERMISSIONPROMPTSERVICE_CID, |
|
49 contractID: PERMISSIONPROMPTSERVICE_CONTRACTID, |
|
50 classDescription: "PermissionPromptService", |
|
51 interfaces: [permissionPromptService] |
|
52 }), |
|
53 /** |
|
54 * getPermission |
|
55 * Ask for permission for an API, device, etc. |
|
56 * @param nsIContentPermissionRequest aRequest |
|
57 * @returns void |
|
58 **/ |
|
59 getPermission: function PS_getPermission(aRequest) |
|
60 { |
|
61 if (!(aRequest instanceof Ci.nsIContentPermissionRequest)) { |
|
62 throw new Error("PermissionService.getPermission: " |
|
63 + "2nd argument must be type 'nsIContentPermissionRequest'"); |
|
64 } |
|
65 |
|
66 // Only allow exactly one permission request here. |
|
67 let types = aRequest.types.QueryInterface(Ci.nsIArray); |
|
68 if (types.length != 1) { |
|
69 aRequest.cancel(); |
|
70 return; |
|
71 } |
|
72 let reqType = types.queryElementAt(0, Ci.nsIContentPermissionType); |
|
73 |
|
74 let type = reqType.access !== "unused" ? reqType.type + "-" + reqType.access |
|
75 : reqType.type; |
|
76 let perm = |
|
77 permissionManager.testExactPermissionFromPrincipal(aRequest.principal, type); |
|
78 |
|
79 switch (perm) { |
|
80 case Ci.nsIPermissionManager.ALLOW_ACTION: |
|
81 aRequest.allow(); |
|
82 break; |
|
83 case Ci.nsIPermissionManager.PROMPT_ACTION: |
|
84 makePrompt().prompt(aRequest); |
|
85 break; |
|
86 case Ci.nsIPermissionManager.DENY_ACTION: |
|
87 case Ci.nsIPermissionManager.UNKNOWN_ACTION: |
|
88 default: |
|
89 aRequest.cancel(); |
|
90 break; |
|
91 } |
|
92 }, |
|
93 }; |
|
94 |
|
95 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionPromptService]); |