Skip to content

Commit fcdd242

Browse files
committed
Bug 1379560 - Part 2 - Add support for custom default permissions in SitePermissions.jsm. r=Paolo
Part 1 added support for changing default permissions via pref. This patch adds support in the frontend code, which is required to actually make it work for most permission prompts. This patch introduces the concept of SitePermissions.PROMPT (which already exists in the permission manager) to distinguish between the default UNKNOWN state and the explicit PROMPT state. They both have the same effect (always asking the user for confirmation). MozReview-Commit-ID: 2Gg9uwigter UltraBlame original commit: 99b0d3748cdae722454c26912cccdc2fdbb60e44
1 parent 8c339e8 commit fcdd242

File tree

5 files changed

+101
-19
lines changed

5 files changed

+101
-19
lines changed

browser/base/content/pageinfo/permissions.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ function initRow(aPartId) {
7676
var checkbox = document.getElementById(aPartId + "Def");
7777
var command = document.getElementById("cmd_" + aPartId + "Toggle");
7878
var {state} = SitePermissions.get(gPermURI, aPartId);
79+
let defaultState = SitePermissions.getDefault(aPartId);
7980

80-
if (state != SitePermissions.UNKNOWN) {
81+
if (state != defaultState) {
8182
checkbox.checked = false;
8283
command.removeAttribute("disabled");
8384
} else {
8485
checkbox.checked = true;
8586
command.setAttribute("disabled", "true");
86-
state = SitePermissions.getDefault(aPartId);
8787
}
8888
setRadioState(aPartId, state);
8989

@@ -169,7 +169,7 @@ function onPluginRadioClick(aEvent) {
169169
function onRadioClick(aPartId) {
170170
var radioGroup = document.getElementById(aPartId + "RadioGroup");
171171
var id = radioGroup.selectedItem.id;
172-
var permission = id.split("#")[1];
172+
var permission = parseInt(id.split("#")[1]);
173173
SitePermissions.set(gPermURI, aPartId, permission);
174174
}
175175

browser/components/preferences/sitePermissions.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,15 @@ var gSitePermissionsManager = {
160160
menulist.appendChild(menupopup);
161161
let states = SitePermissions.getAvailableStates(permission.type);
162162
for (let state of states) {
163-
if (state == SitePermissions.UNKNOWN)
163+
164+
165+
166+
if (state == SitePermissions.UNKNOWN &&
167+
permission.capability == SitePermissions.PROMPT) {
168+
state = SitePermissions.PROMPT;
169+
} else if (state == SitePermissions.UNKNOWN) {
164170
continue;
171+
}
165172
let m = document.createElement("menuitem");
166173
m.setAttribute("label", this._getCapabilityString(state));
167174
m.setAttribute("value", state);

browser/locales/en-US/chrome/browser/sitePermissions.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ state.current.allowedForSession = Allowed for Session
1414
state.current.allowedTemporarily = Allowed Temporarily
1515
state.current.blockedTemporarily = Blocked Temporarily
1616
state.current.blocked = Blocked
17+
state.current.prompt = Always Ask
1718

1819
# LOCALIZATION NOTE (state.multichoice.alwaysAsk,
1920
# state.multichoice.allow,

browser/modules/SitePermissions.jsm

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ this.SitePermissions = {
141141
UNKNOWN: Services.perms.UNKNOWN_ACTION,
142142
ALLOW: Services.perms.ALLOW_ACTION,
143143
BLOCK: Services.perms.DENY_ACTION,
144+
PROMPT: Services.perms.PROMPT_ACTION,
144145
ALLOW_COOKIES_FOR_SESSION: Components.interfaces.nsICookiePermission.ACCESS_SESSION,
145146

146147

@@ -149,6 +150,8 @@ this.SitePermissions = {
149150
SCOPE_SESSION: "{SitePermissions.SCOPE_SESSION}",
150151
SCOPE_PERSISTENT: "{SitePermissions.SCOPE_PERSISTENT}",
151152

153+
_defaultPrefBranch: Services.prefs.getBranch("permissions.default."),
154+
152155

153156

154157

@@ -278,10 +281,13 @@ this.SitePermissions = {
278281
gPermissionObject[permissionID].states)
279282
return gPermissionObject[permissionID].states;
280283

284+
285+
286+
281287
if (this.getDefault(permissionID) == this.UNKNOWN)
282288
return [ SitePermissions.UNKNOWN, SitePermissions.ALLOW, SitePermissions.BLOCK ];
283289

284-
return [ SitePermissions.ALLOW, SitePermissions.BLOCK ];
290+
return [ SitePermissions.PROMPT, SitePermissions.ALLOW, SitePermissions.BLOCK ];
285291
},
286292

287293

@@ -293,11 +299,14 @@ this.SitePermissions = {
293299

294300

295301
getDefault(permissionID) {
302+
303+
296304
if (permissionID in gPermissionObject &&
297305
gPermissionObject[permissionID].getDefault)
298306
return gPermissionObject[permissionID].getDefault();
299307

300-
return this.UNKNOWN;
308+
309+
return this._defaultPrefBranch.getIntPref(permissionID, this.UNKNOWN);
301310
},
302311

303312

@@ -320,7 +329,8 @@ this.SitePermissions = {
320329

321330

322331
get(uri, permissionID, browser) {
323-
let result = { state: this.UNKNOWN, scope: this.SCOPE_PERSISTENT };
332+
let defaultState = this.getDefault(permissionID);
333+
let result = { state: defaultState, scope: this.SCOPE_PERSISTENT };
324334
if (this.isSupportedURI(uri)) {
325335
let permission = null;
326336
if (permissionID in gPermissionObject &&
@@ -338,7 +348,7 @@ this.SitePermissions = {
338348
}
339349
}
340350

341-
if (!result.state) {
351+
if (result.state == defaultState) {
342352

343353

344354
let value = TemporaryBlockedPermissions.get(browser, permissionID);
@@ -371,7 +381,7 @@ this.SitePermissions = {
371381

372382

373383
set(uri, permissionID, state, scope = this.SCOPE_PERSISTENT, browser = null) {
374-
if (state == this.UNKNOWN) {
384+
if (state == this.UNKNOWN || state == this.getDefault(permissionID)) {
375385
this.remove(uri, permissionID, browser);
376386
return;
377387
}
@@ -488,6 +498,7 @@ this.SitePermissions = {
488498
getMultichoiceStateLabel(state) {
489499
switch (state) {
490500
case this.UNKNOWN:
501+
case this.PROMPT:
491502
return gStringBundle.GetStringFromName("state.multichoice.alwaysAsk");
492503
case this.ALLOW:
493504
return gStringBundle.GetStringFromName("state.multichoice.allow");
@@ -513,6 +524,8 @@ this.SitePermissions = {
513524

514525
getCurrentStateLabel(state, scope = null) {
515526
switch (state) {
527+
case this.PROMPT:
528+
return gStringBundle.GetStringFromName("state.current.prompt");
516529
case this.ALLOW:
517530
if (scope && scope != this.SCOPE_PERSISTENT)
518531
return gStringBundle.GetStringFromName("state.current.allowedTemporarily");
@@ -553,10 +566,7 @@ var gPermissionObject = {
553566

554567

555568
"image": {
556-
getDefault() {
557-
return Services.prefs.getIntPref("permissions.default.image") == 2 ?
558-
SitePermissions.BLOCK : SitePermissions.ALLOW;
559-
}
569+
states: [ SitePermissions.ALLOW, SitePermissions.BLOCK ],
560570
},
561571

562572
"cookie": {
@@ -594,14 +604,16 @@ var gPermissionObject = {
594604
getDefault() {
595605
return Services.prefs.getBoolPref("dom.disable_open_during_load") ?
596606
SitePermissions.BLOCK : SitePermissions.ALLOW;
597-
}
607+
},
608+
states: [ SitePermissions.ALLOW, SitePermissions.BLOCK ],
598609
},
599610

600611
"install": {
601612
getDefault() {
602613
return Services.prefs.getBoolPref("xpinstall.whitelist.required") ?
603614
SitePermissions.BLOCK : SitePermissions.ALLOW;
604-
}
615+
},
616+
states: [ SitePermissions.ALLOW, SitePermissions.BLOCK ],
605617
},
606618

607619
"geo": {

browser/modules/test/unit/test_SitePermissions.js

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ add_task(async function testGetAvailableStates() {
6666
SitePermissions.ALLOW,
6767
SitePermissions.BLOCK ]);
6868

69+
70+
Services.prefs.setIntPref("permissions.default.camera", SitePermissions.ALLOW);
71+
Assert.deepEqual(SitePermissions.getAvailableStates("camera"),
72+
[ SitePermissions.PROMPT,
73+
SitePermissions.ALLOW,
74+
SitePermissions.BLOCK ]);
75+
Services.prefs.clearUserPref("permissions.default.camera");
76+
6977
Assert.deepEqual(SitePermissions.getAvailableStates("cookie"),
7078
[ SitePermissions.ALLOW,
7179
SitePermissions.ALLOW_COOKIES_FOR_SESSION,
@@ -96,21 +104,75 @@ add_task(async function testExactHostMatch() {
96104

97105
if (exactHostMatched.includes(permission)) {
98106

99-
Assert.equal(SitePermissions.get(subUri, permission).state, SitePermissions.UNKNOWN);
107+
Assert.equal(SitePermissions.get(subUri, permission).state, SitePermissions.UNKNOWN,
108+
`${permission} should exact-host match`);
100109
} else if (nonExactHostMatched.includes(permission)) {
101110

102-
Assert.equal(SitePermissions.get(subUri, permission).state, SitePermissions.ALLOW);
111+
Assert.equal(SitePermissions.get(subUri, permission).state, SitePermissions.ALLOW,
112+
`${permission} should not exact-host match`);
103113
} else {
104114
Assert.ok(false, `Found an unknown permission ${permission} in exact host match test.` +
105115
"Please add new permissions from SitePermissions.jsm to this test.");
106116
}
107117

108118

109-
SitePermissions.set(subUri, permission, SitePermissions.BLOCK);
110-
Assert.equal(SitePermissions.get(subUri, permission).state, SitePermissions.BLOCK);
119+
SitePermissions.set(subUri, permission, SitePermissions.PROMPT);
120+
Assert.equal(SitePermissions.get(subUri, permission).state, SitePermissions.PROMPT);
111121
Assert.equal(SitePermissions.get(uri, permission).state, SitePermissions.ALLOW);
112122

113123
SitePermissions.remove(subUri, permission);
114124
SitePermissions.remove(uri, permission);
115125
}
116126
});
127+
128+
add_task(function* testDefaultPrefs() {
129+
let uri = Services.io.newURI("https://example.com")
130+
131+
132+
Assert.deepEqual(SitePermissions.get(uri, "camera"), {
133+
state: SitePermissions.UNKNOWN,
134+
scope: SitePermissions.SCOPE_PERSISTENT,
135+
});
136+
137+
138+
Services.prefs.setIntPref("permissions.default.camera", SitePermissions.BLOCK);
139+
Assert.deepEqual(SitePermissions.get(uri, "camera"), {
140+
state: SitePermissions.BLOCK,
141+
scope: SitePermissions.SCOPE_PERSISTENT,
142+
});
143+
144+
145+
Assert.deepEqual(SitePermissions.get(uri, "microphone"), {
146+
state: SitePermissions.UNKNOWN,
147+
scope: SitePermissions.SCOPE_PERSISTENT,
148+
});
149+
150+
151+
Services.prefs.setIntPref("permissions.default.camera", SitePermissions.ALLOW);
152+
Assert.deepEqual(SitePermissions.get(uri, "camera"), {
153+
state: SitePermissions.ALLOW,
154+
scope: SitePermissions.SCOPE_PERSISTENT,
155+
});
156+
157+
158+
SitePermissions.set(uri, "camera", SitePermissions.BLOCK);
159+
Assert.deepEqual(SitePermissions.get(uri, "camera"), {
160+
state: SitePermissions.BLOCK,
161+
scope: SitePermissions.SCOPE_PERSISTENT,
162+
});
163+
164+
165+
SitePermissions.remove(uri, "camera");
166+
Assert.deepEqual(SitePermissions.get(uri, "camera"), {
167+
state: SitePermissions.ALLOW,
168+
scope: SitePermissions.SCOPE_PERSISTENT,
169+
});
170+
171+
172+
Services.prefs.clearUserPref("permissions.default.camera");
173+
Assert.deepEqual(SitePermissions.get(uri, "camera"), {
174+
state: SitePermissions.UNKNOWN,
175+
scope: SitePermissions.SCOPE_PERSISTENT,
176+
});
177+
});
178+

0 commit comments

Comments
 (0)