Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 this.EXPORTED_SYMBOLS = [ "SitePermissions" ];
7 Components.utils.import("resource://gre/modules/Services.jsm");
9 let gStringBundle =
10 Services.strings.createBundle("chrome://browser/locale/sitePermissions.properties");
12 this.SitePermissions = {
14 UNKNOWN: Services.perms.UNKNOWN_ACTION,
15 ALLOW: Services.perms.ALLOW_ACTION,
16 BLOCK: Services.perms.DENY_ACTION,
17 SESSION: Components.interfaces.nsICookiePermission.ACCESS_SESSION,
19 /* Checks whether a UI for managing permissions should be exposed for a given
20 * URI. This excludes file URIs, for instance, as they don't have a host,
21 * even though nsIPermissionManager can still handle them.
22 */
23 isSupportedURI: function (aURI) {
24 return aURI.schemeIs("http") || aURI.schemeIs("https");
25 },
27 /* Returns an array of all permission IDs.
28 */
29 listPermissions: function () {
30 let array = Object.keys(gPermissionObject);
31 array.sort((a, b) => {
32 return this.getPermissionLabel(a).localeCompare(this.getPermissionLabel(b));
33 });
34 return array;
35 },
37 /* Returns an array of permission states to be exposed to the user for a
38 * permission with the given ID.
39 */
40 getAvailableStates: function (aPermissionID) {
41 if (aPermissionID in gPermissionObject &&
42 gPermissionObject[aPermissionID].states)
43 return gPermissionObject[aPermissionID].states;
45 if (this.getDefault(aPermissionID) == this.UNKNOWN)
46 return [ SitePermissions.UNKNOWN, SitePermissions.ALLOW, SitePermissions.BLOCK ];
48 return [ SitePermissions.ALLOW, SitePermissions.BLOCK ];
49 },
51 /* Returns the default state of a particular permission.
52 */
53 getDefault: function (aPermissionID) {
54 if (aPermissionID in gPermissionObject &&
55 gPermissionObject[aPermissionID].getDefault)
56 return gPermissionObject[aPermissionID].getDefault();
58 return this.UNKNOWN;
59 },
61 /* Returns the state of a particular permission for a given URI.
62 */
63 get: function (aURI, aPermissionID) {
64 if (!this.isSupportedURI(aURI))
65 return this.UNKNOWN;
67 let state;
68 if (aPermissionID in gPermissionObject &&
69 gPermissionObject[aPermissionID].exactHostMatch)
70 state = Services.perms.testExactPermission(aURI, aPermissionID);
71 else
72 state = Services.perms.testPermission(aURI, aPermissionID);
73 return state;
74 },
76 /* Sets the state of a particular permission for a given URI.
77 */
78 set: function (aURI, aPermissionID, aState) {
79 if (!this.isSupportedURI(aURI))
80 return;
82 if (aState == this.UNKNOWN) {
83 this.remove(aURI, aPermissionID);
84 return;
85 }
87 Services.perms.add(aURI, aPermissionID, aState);
89 if (aPermissionID in gPermissionObject &&
90 gPermissionObject[aPermissionID].onChange)
91 gPermissionObject[aPermissionID].onChange(aURI, aState);
92 },
94 /* Removes the saved state of a particular permission for a given URI.
95 */
96 remove: function (aURI, aPermissionID) {
97 if (!this.isSupportedURI(aURI))
98 return;
100 Services.perms.remove(aURI.host, aPermissionID);
102 if (aPermissionID in gPermissionObject &&
103 gPermissionObject[aPermissionID].onChange)
104 gPermissionObject[aPermissionID].onChange(aURI, this.UNKNOWN);
105 },
107 /* Returns the localized label for the permission with the given ID, to be
108 * used in a UI for managing permissions.
109 */
110 getPermissionLabel: function (aPermissionID) {
111 return gStringBundle.GetStringFromName("permission." + aPermissionID + ".label");
112 },
114 /* Returns the localized label for the given permission state, to be used in
115 * a UI for managing permissions.
116 */
117 getStateLabel: function (aPermissionID, aState) {
118 if (aPermissionID in gPermissionObject &&
119 gPermissionObject[aPermissionID].getStateLabel) {
120 let label = gPermissionObject[aPermissionID].getStateLabel(aState);
121 if (label)
122 return label;
123 }
125 switch (aState) {
126 case this.UNKNOWN:
127 return gStringBundle.GetStringFromName("alwaysAsk");
128 case this.ALLOW:
129 return gStringBundle.GetStringFromName("allow");
130 case this.SESSION:
131 return gStringBundle.GetStringFromName("allowForSession");
132 case this.BLOCK:
133 return gStringBundle.GetStringFromName("block");
134 default:
135 throw new Error("unknown permission state");
136 }
137 }
138 };
140 let gPermissionObject = {
141 /* Holds permission ID => options pairs.
142 *
143 * Supported options:
144 *
145 * - exactHostMatch
146 * Allows sub domains to have their own permissions.
147 * Defaults to false.
148 *
149 * - getDefault
150 * Called to get the permission's default state.
151 * Defaults to UNKNOWN, indicating that the user will be asked each time
152 * a page asks for that permissions.
153 *
154 * - getStateLabel
155 * Called to get the localized label for the given permission state, to be
156 * used in a UI for managing permissions. May return null for states that
157 * should use their default label.
158 *
159 * - onChange
160 * Called when a permission state changes.
161 *
162 * - states
163 * Array of permission states to be exposed to the user.
164 * Defaults to ALLOW, BLOCK and the default state (see getDefault).
165 */
167 "image": {
168 getDefault: function () {
169 return Services.prefs.getIntPref("permissions.default.image") == 2 ?
170 SitePermissions.BLOCK : SitePermissions.ALLOW;
171 }
172 },
174 "cookie": {
175 states: [ SitePermissions.ALLOW, SitePermissions.SESSION, SitePermissions.BLOCK ],
176 getDefault: function () {
177 if (Services.prefs.getIntPref("network.cookie.cookieBehavior") == 2)
178 return SitePermissions.BLOCK;
180 if (Services.prefs.getIntPref("network.cookie.lifetimePolicy") == 2)
181 return SitePermissions.SESSION;
183 return SitePermissions.ALLOW;
184 }
185 },
187 "desktop-notification": {},
189 "camera": {},
190 "microphone": {},
192 "popup": {
193 getDefault: function () {
194 return Services.prefs.getBoolPref("dom.disable_open_during_load") ?
195 SitePermissions.BLOCK : SitePermissions.ALLOW;
196 }
197 },
199 "install": {
200 getDefault: function () {
201 return Services.prefs.getBoolPref("xpinstall.whitelist.required") ?
202 SitePermissions.BLOCK : SitePermissions.ALLOW;
203 }
204 },
206 "geo": {
207 exactHostMatch: true
208 },
210 "indexedDB": {
211 states: [ SitePermissions.ALLOW, SitePermissions.UNKNOWN, SitePermissions.BLOCK ],
212 getStateLabel: function (aState) {
213 // indexedDB redefines nsIPermissionManager.UNKNOWN_ACTION (the default)
214 // as "allow" and nsIPermissionManager.ALLOW_ACTION as "ask the user."
215 switch (aState) {
216 case SitePermissions.UNKNOWN:
217 return gStringBundle.GetStringFromName("allow");
218 case SitePermissions.ALLOW:
219 return gStringBundle.GetStringFromName("alwaysAsk");
220 default:
221 return null;
222 }
223 },
224 onChange: function (aURI, aState) {
225 if (aState == SitePermissions.ALLOW || aState == SitePermissions.BLOCK)
226 Services.perms.remove(aURI.host, "indexedDB-unlimited");
227 }
228 },
230 "fullscreen": {},
232 "pointerLock": {
233 exactHostMatch: true
234 }
235 };