/* 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 tests the SitePermissions.getAllPermissionDetailsForBrowser function.
add_task(async
function testGetAllPermissionDetailsForBrowser() {
let principal =
Services.scriptSecurityManager.createContentPrincipalFromOrigin(
"https://example.com"
);
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
principal.spec
);
Services.prefs.setIntPref(
"permissions.default.shortcuts", 2);
let browser = tab.linkedBrowser;
SitePermissions.setForPrincipal(principal,
"camera", SitePermissions.ALLOW);
SitePermissions.setForPrincipal(
principal,
"cookie",
SitePermissions.ALLOW_COOKIES_FOR_SESSION
);
SitePermissions.setForPrincipal(principal,
"popup", SitePermissions.BLOCK);
SitePermissions.setForPrincipal(
principal,
"geo",
SitePermissions.ALLOW,
SitePermissions.SCOPE_SESSION
);
SitePermissions.setForPrincipal(
principal,
"shortcuts",
SitePermissions.ALLOW
);
SitePermissions.setForPrincipal(principal,
"xr", SitePermissions.ALLOW);
let permissions = SitePermissions.getAllPermissionDetailsForBrowser(browser);
let camera = permissions.find(({ id }) => id ===
"camera");
Assert.deepEqual(camera, {
id:
"camera",
label:
"Use the camera",
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
});
// Check that removed permissions (State.UNKNOWN) are skipped.
SitePermissions.removeFromPrincipal(principal,
"camera");
permissions = SitePermissions.getAllPermissionDetailsForBrowser(browser);
camera = permissions.find(({ id }) => id ===
"camera");
Assert.equal(camera, undefined);
let cookie = permissions.find(({ id }) => id ===
"cookie");
Assert.deepEqual(cookie, {
id:
"cookie",
label:
"Set cookies",
state: SitePermissions.ALLOW_COOKIES_FOR_SESSION,
scope: SitePermissions.SCOPE_PERSISTENT,
});
let popup = permissions.find(({ id }) => id ===
"popup");
Assert.deepEqual(popup, {
id:
"popup",
label:
"Open pop-up windows",
state: SitePermissions.BLOCK,
scope: SitePermissions.SCOPE_PERSISTENT,
});
let geo = permissions.find(({ id }) => id ===
"geo");
Assert.deepEqual(geo, {
id:
"geo",
label:
"Access your location",
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_SESSION,
});
let shortcuts = permissions.find(({ id }) => id ===
"shortcuts");
Assert.deepEqual(shortcuts, {
id:
"shortcuts",
label:
"Override keyboard shortcuts",
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
});
let xr = permissions.find(({ id }) => id ===
"xr");
Assert.deepEqual(xr, {
id:
"xr",
label:
"Access virtual reality devices",
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
});
SitePermissions.removeFromPrincipal(principal,
"cookie");
SitePermissions.removeFromPrincipal(principal,
"popup");
SitePermissions.removeFromPrincipal(principal,
"geo");
SitePermissions.removeFromPrincipal(principal,
"shortcuts");
SitePermissions.removeFromPrincipal(principal,
"xr");
Services.prefs.clearUserPref(
"permissions.default.shortcuts");
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
add_task(async
function testTemporaryChangeEvent() {
let principal =
Services.scriptSecurityManager.createContentPrincipalFromOrigin(
"https://example.com"
);
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
principal.spec
);
let browser = tab.linkedBrowser;
let changeEventCount = 0;
function listener() {
changeEventCount++;
}
browser.addEventListener(
"PermissionStateChange", listener);
// Test browser-specific permissions.
SitePermissions.setForPrincipal(
browser.contentPrincipal,
"autoplay-media",
SitePermissions.BLOCK,
SitePermissions.SCOPE_GLOBAL,
browser
);
is(changeEventCount, 1,
"Should've changed");
// Setting the same value shouldn't dispatch a change event.
SitePermissions.setForPrincipal(
browser.contentPrincipal,
"autoplay-media",
SitePermissions.BLOCK,
SitePermissions.SCOPE_GLOBAL,
browser
);
is(changeEventCount, 1,
"Shouldn't have changed");
browser.removeEventListener(
"PermissionStateChange", listener);
BrowserTestUtils.removeTab(tab);
});
add_task(async
function testInvalidPrincipal() {
// Check that an error is thrown when an invalid principal argument is passed.
try {
SitePermissions.isSupportedPrincipal(
"file:///example.js");
}
catch (e) {
Assert.equal(
e.message,
"Argument passed as principal is not an instance of Ci.nsIPrincipal"
);
}
try {
SitePermissions.removeFromPrincipal(
null,
"canvas");
}
catch (e) {
Assert.equal(
e.message,
"Atleast one of the arguments, either principal or browser should not be null."
);
}
try {
SitePermissions.setForPrincipal(
"blah",
"camera",
SitePermissions.ALLOW,
SitePermissions.SCOPE_PERSISTENT,
gBrowser.selectedBrowser
);
}
catch (e) {
Assert.equal(
e.message,
"Argument passed as principal is not an instance of Ci.nsIPrincipal"
);
}
try {
SitePermissions.getAllByPrincipal(
"blah");
}
catch (e) {
Assert.equal(
e.message,
"Argument passed as principal is not an instance of Ci.nsIPrincipal"
);
}
try {
SitePermissions.getAllByPrincipal(
null);
}
catch (e) {
Assert.equal(e.message,
"principal argument cannot be null.");
}
try {
SitePermissions.getForPrincipal(5,
"camera");
}
catch (e) {
Assert.equal(
e.message,
"Argument passed as principal is not an instance of Ci.nsIPrincipal"
);
}
// Check that no error is thrown when passing valid principal and browser arguments.
Assert.deepEqual(
SitePermissions.getForPrincipal(gBrowser.contentPrincipal,
"camera"),
{
state: SitePermissions.UNKNOWN,
scope: SitePermissions.SCOPE_PERSISTENT,
}
);
Assert.deepEqual(
SitePermissions.getForPrincipal(
null,
"camera", gBrowser.selectedBrowser),
{
state: SitePermissions.UNKNOWN,
scope: SitePermissions.SCOPE_PERSISTENT,
}
);
});