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
|
/* 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';
const { Cc, Ci, Cu } = require('chrome');
const { List, addListItem } = require('sdk/util/list');
const { URL } = require('sdk/url');
const { Services } = require('../chrome/services');
const { nsIPermissionManager } = Ci;
const UNKNOWN = nsIPermissionManager.UNKNOWN_ACTION; // 0
const ALLOW = nsIPermissionManager.ALLOW_ACTION; // 1
const BLOCK = nsIPermissionManager.DENY_ACTION; // 2
const SESSION = Ci.nsICookiePermission.ACCESS_SESSION; // 8
function getKey(obj, val) {
for (let key in obj)
if (obj[key] == val)
return key;
return undefined;
}
const PERMISSIONS = {
'session': SESSION,
'allow': ALLOW,
'deny': BLOCK
};
const TYPES = {
'images': 'image',
'popups': 'popup',
'desktop-notifications': 'desktop-notification',
'installs': 'install',
'location': 'geo',
'fullscreen': 'fullscreen',
'pointer-lock': 'pointerLock'
}
const PM = Cc['@mozilla.org/permissionmanager;1'].
getService(nsIPermissionManager);
function add(options) {
let uri = Services.io.newURI(options.url, null, null);
if (!/^https?/.test(uri.scheme)) {
throw new Error('invalid content url, only https or http schemes are accepted');
}
PM.add(uri,
TYPES[options.type],
PERMISSIONS[options.permission]);
}
function remove(options) {
PM.remove(URL(options.url).host, TYPES[options.type]);
}
function removeAll() {
PM.removeAll();
}
// TODO: cache entries after first request, and observe new additions with the "perm-changed" event
exports.permissions = {
add: add,
remove: remove,
removeAll: removeAll,
get permissions() {
let list = List();
let permissions = PM.enumerator;
while (permissions.hasMoreElements()) {
let permission = permissions.getNext().QueryInterface(Ci.nsIPermission);
addListItem(list, {
type: getKey(TYPES, permission.type),
host: String(permission.host),
permission: getKey(PERMISSIONS, Number(permission.capability))
//'expire-time': Number(permission.expireTime),
});
}
return list;
},
TYPES: TYPES,
PERMISSIONS: PERMISSIONS
}
|