Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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";
// This function applies combinations of different permissions and
// checks how they override each other.
async function checkPermissionCombinations(combinations) {
let principal =
Services.scriptSecurityManager.createContentPrincipalFromOrigin(
);
await BrowserTestUtils.withNewTab(principal.spec, function (browser) {
let id = "geo";
for (let { reverse, states, result } of combinations) {
let loop = () => {
for (let [state, scope] of states) {
SitePermissions.setForPrincipal(principal, id, state, scope, browser);
}
Assert.deepEqual(
SitePermissions.getForPrincipal(principal, id, browser),
result
);
SitePermissions.removeFromPrincipal(principal, id, browser);
};
loop();
if (reverse) {
states.reverse();
loop();
}
}
});
}
// Test that passing null as scope becomes SCOPE_PERSISTENT.
add_task(async function testDefaultScope() {
await checkPermissionCombinations([
{
states: [[SitePermissions.ALLOW, null]],
result: {
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
},
},
]);
});
// Test that "wide" scopes like PERSISTENT always override "narrower" ones like TAB.
add_task(async function testScopeOverrides() {
await checkPermissionCombinations([
{
// The behavior of SCOPE_SESSION is not in line with the general behavior
// because of the legacy nsIPermissionManager implementation.
states: [
[SitePermissions.ALLOW, SitePermissions.SCOPE_PERSISTENT],
[SitePermissions.BLOCK, SitePermissions.SCOPE_SESSION],
],
result: {
state: SitePermissions.BLOCK,
scope: SitePermissions.SCOPE_SESSION,
},
},
{
states: [
[SitePermissions.BLOCK, SitePermissions.SCOPE_SESSION],
[SitePermissions.ALLOW, SitePermissions.SCOPE_PERSISTENT],
],
result: {
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
},
},
{
reverse: true,
states: [
[SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY],
[SitePermissions.ALLOW, SitePermissions.SCOPE_SESSION],
],
result: {
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_SESSION,
},
},
{
reverse: true,
states: [
[SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY],
[SitePermissions.ALLOW, SitePermissions.SCOPE_PERSISTENT],
],
result: {
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
},
},
]);
});
// Test that clearing a temporary permission also removes a
// persistent permission that was set for the same URL.
add_task(async function testClearTempPermission() {
await checkPermissionCombinations([
{
states: [
[SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY],
[SitePermissions.ALLOW, SitePermissions.SCOPE_PERSISTENT],
[SitePermissions.UNKNOWN, SitePermissions.SCOPE_TEMPORARY],
],
result: {
state: SitePermissions.UNKNOWN,
scope: SitePermissions.SCOPE_PERSISTENT,
},
},
]);
});
// Test that states override each other when applied with the same scope.
add_task(async function testStateOverride() {
await checkPermissionCombinations([
{
states: [
[SitePermissions.ALLOW, SitePermissions.SCOPE_PERSISTENT],
[SitePermissions.BLOCK, SitePermissions.SCOPE_PERSISTENT],
],
result: {
state: SitePermissions.BLOCK,
scope: SitePermissions.SCOPE_PERSISTENT,
},
},
{
states: [
[SitePermissions.BLOCK, SitePermissions.SCOPE_PERSISTENT],
[SitePermissions.ALLOW, SitePermissions.SCOPE_PERSISTENT],
],
result: {
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
},
},
]);
});