1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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]);
|