Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

"use strict";
/* 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/. */
const PERMISSIONS_URL =
"chrome://browser/content/preferences/dialogs/sitePermissions.xhtml";
const URL = "http://www.example.com";
const URI = Services.io.newURI(URL);
var sitePermissionsDialog;
let settingsButtonMap = {
"desktop-notification": "notificationSettingsButton",
speaker: "speakerSettingsButton",
};
function checkMenulistPermissionItem(origin, state) {
let doc = sitePermissionsDialog.document;
let label = doc.getElementsByTagName("label")[3];
Assert.equal(label.textContent, origin);
let menulist = doc.getElementsByTagName("menulist")[0];
Assert.equal(menulist.value, state);
}
async function openPermissionsDialog(permissionType) {
let dialogOpened = promiseLoadSubDialog(PERMISSIONS_URL);
await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[settingsButtonMap[permissionType]],
function (settingsButtonId) {
let doc = content.document;
let settingsButton = doc.getElementById(settingsButtonId);
settingsButton.click();
}
);
sitePermissionsDialog = await dialogOpened;
await sitePermissionsDialog.document.mozSubdialogReady;
}
add_task(async function openSitePermissionsDialog() {
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
await openPermissionsDialog("desktop-notification");
});
add_task(async function addPermission() {
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
// First item in the richlistbox contains column headers.
Assert.equal(
richlistbox.itemCount,
0,
"Number of permission items is 0 initially"
);
// Add notification permission for a website.
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// Observe the added permission changes in the dialog UI.
Assert.equal(richlistbox.itemCount, 1);
checkMenulistPermissionItem(URL, Services.perms.ALLOW_ACTION);
PermissionTestUtils.remove(URI, "desktop-notification");
});
add_task(async function addPermissionPrivateBrowsing() {
let privateBrowsingPrincipal =
Services.scriptSecurityManager.createContentPrincipal(URI, {
privateBrowsingId: 1,
});
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
Assert.equal(
richlistbox.itemCount,
0,
"Number of permission items is 0 initially"
);
// Add a session permission for private browsing.
PermissionTestUtils.add(
privateBrowsingPrincipal,
"desktop-notification",
Services.perms.ALLOW_ACTION,
Services.perms.EXPIRE_SESSION
);
// The permission should not show in the dialog UI.
Assert.equal(richlistbox.itemCount, 0);
PermissionTestUtils.remove(privateBrowsingPrincipal, "desktop-notification");
// Add a permanent permission for private browsing
// The permission manager will store it as EXPIRE_SESSION
PermissionTestUtils.add(
privateBrowsingPrincipal,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// The permission should not show in the dialog UI.
Assert.equal(richlistbox.itemCount, 0);
PermissionTestUtils.remove(privateBrowsingPrincipal, "desktop-notification");
});
add_task(async function observePermissionChange() {
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// Change the permission.
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.DENY_ACTION
);
checkMenulistPermissionItem(URL, Services.perms.DENY_ACTION);
PermissionTestUtils.remove(URI, "desktop-notification");
});
add_task(async function observePermissionDelete() {
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
Assert.equal(
richlistbox.itemCount,
1,
"The box contains one permission item initially"
);
PermissionTestUtils.remove(URI, "desktop-notification");
Assert.equal(richlistbox.itemCount, 0);
});
add_task(async function onPermissionChange() {
let doc = sitePermissionsDialog.document;
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// Change the permission state in the UI.
doc.getElementsByAttribute("value", SitePermissions.BLOCK)[0].click();
Assert.equal(
PermissionTestUtils.getPermissionObject(URI, "desktop-notification")
.capability,
Services.perms.ALLOW_ACTION,
"Permission state does not change before saving changes"
);
doc.querySelector("dialog").getButton("accept").click();
await TestUtils.waitForCondition(
() =>
PermissionTestUtils.getPermissionObject(URI, "desktop-notification")
.capability == Services.perms.DENY_ACTION
);
PermissionTestUtils.remove(URI, "desktop-notification");
});
add_task(async function onPermissionDelete() {
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
richlistbox.selectItem(richlistbox.getItemAtIndex(0));
doc.getElementById("removePermission").click();
await TestUtils.waitForCondition(() => richlistbox.itemCount == 0);
Assert.equal(
PermissionTestUtils.getPermissionObject(URI, "desktop-notification")
.capability,
Services.perms.ALLOW_ACTION,
"Permission is not deleted before saving changes"
);
doc.querySelector("dialog").getButton("accept").click();
await TestUtils.waitForCondition(
() =>
PermissionTestUtils.getPermissionObject(URI, "desktop-notification") ==
null
);
});
add_task(async function onAllPermissionsDelete() {
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
let u = Services.io.newURI("http://www.test.com");
PermissionTestUtils.add(
u,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
doc.getElementById("removeAllPermissions").click();
await TestUtils.waitForCondition(() => richlistbox.itemCount == 0);
Assert.equal(
PermissionTestUtils.getPermissionObject(URI, "desktop-notification")
.capability,
Services.perms.ALLOW_ACTION
);
Assert.equal(
PermissionTestUtils.getPermissionObject(u, "desktop-notification")
.capability,
Services.perms.ALLOW_ACTION,
"Permissions are not deleted before saving changes"
);
doc.querySelector("dialog").getButton("accept").click();
await TestUtils.waitForCondition(
() =>
PermissionTestUtils.getPermissionObject(URI, "desktop-notification") ==
null &&
PermissionTestUtils.getPermissionObject(u, "desktop-notification") == null
);
});
add_task(async function onPermissionChangeAndDelete() {
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// Change the permission state in the UI.
doc.getElementsByAttribute("value", SitePermissions.BLOCK)[0].click();
// Remove that permission by clicking the "Remove" button.
richlistbox.selectItem(richlistbox.getItemAtIndex(0));
doc.getElementById("removePermission").click();
await TestUtils.waitForCondition(() => richlistbox.itemCount == 0);
doc.querySelector("dialog").getButton("accept").click();
await TestUtils.waitForCondition(
() =>
PermissionTestUtils.getPermissionObject(URI, "desktop-notification") ==
null
);
});
add_task(async function onPermissionChangeCancel() {
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// Change the permission state in the UI.
doc.getElementsByAttribute("value", SitePermissions.BLOCK)[0].click();
doc.querySelector("dialog").getButton("cancel").click();
Assert.equal(
PermissionTestUtils.getPermissionObject(URI, "desktop-notification")
.capability,
Services.perms.ALLOW_ACTION,
"Permission state does not change on clicking cancel"
);
PermissionTestUtils.remove(URI, "desktop-notification");
});
add_task(async function onPermissionDeleteCancel() {
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
// Remove that permission by clicking the "Remove" button.
richlistbox.selectItem(richlistbox.getItemAtIndex(0));
doc.getElementById("removePermission").click();
await TestUtils.waitForCondition(() => richlistbox.itemCount == 0);
doc.querySelector("dialog").getButton("cancel").click();
Assert.equal(
PermissionTestUtils.getPermissionObject(URI, "desktop-notification")
.capability,
Services.perms.ALLOW_ACTION,
"Permission state does not change on clicking cancel"
);
PermissionTestUtils.remove(URI, "desktop-notification");
});
add_task(async function onSearch() {
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
let searchBox = doc.getElementById("searchBox");
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
searchBox.value = "www.example.com";
let u = Services.io.newURI("http://www.test.com");
PermissionTestUtils.add(
u,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
Assert.equal(
doc.getElementsByAttribute("origin", "http://www.test.com")[0],
null
);
Assert.equal(
doc.getElementsByAttribute("origin", "http://www.example.com")[0],
richlistbox.getItemAtIndex(0)
);
PermissionTestUtils.remove(URI, "desktop-notification");
PermissionTestUtils.remove(u, "desktop-notification");
doc.querySelector("dialog").getButton("cancel").click();
});
add_task(async function onPermissionsSort() {
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
let u = Services.io.newURI("http://www.test.com");
PermissionTestUtils.add(
u,
"desktop-notification",
Services.perms.DENY_ACTION
);
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
// Test default arrangement(Allow followed by Block).
Assert.equal(
richlistbox.getItemAtIndex(0).getAttribute("origin"),
);
Assert.equal(
richlistbox.getItemAtIndex(1).getAttribute("origin"),
);
doc.getElementById("statusCol").click();
// Test the rearrangement(Block followed by Allow).
Assert.equal(
richlistbox.getItemAtIndex(0).getAttribute("origin"),
);
Assert.equal(
richlistbox.getItemAtIndex(1).getAttribute("origin"),
);
doc.getElementById("siteCol").click();
// Test the rearrangement(Website names arranged in alphabhetical order).
Assert.equal(
richlistbox.getItemAtIndex(0).getAttribute("origin"),
);
Assert.equal(
richlistbox.getItemAtIndex(1).getAttribute("origin"),
);
doc.getElementById("siteCol").click();
// Test the rearrangement(Website names arranged in reverse alphabhetical order).
Assert.equal(
richlistbox.getItemAtIndex(0).getAttribute("origin"),
);
Assert.equal(
richlistbox.getItemAtIndex(1).getAttribute("origin"),
);
PermissionTestUtils.remove(URI, "desktop-notification");
PermissionTestUtils.remove(u, "desktop-notification");
doc.querySelector("dialog").getButton("cancel").click();
});
add_task(async function onPermissionDisable() {
// Enable desktop-notification permission prompts.
Services.prefs.setIntPref(
"permissions.default.desktop-notification",
SitePermissions.UNKNOWN
);
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
// Check if the enabled state is reflected in the checkbox.
let checkbox = doc.getElementById("permissionsDisableCheckbox");
Assert.equal(checkbox.checked, false);
// Disable permission and click on "Cancel".
checkbox.checked = true;
doc.querySelector("dialog").getButton("cancel").click();
// Check that the permission is not disabled yet.
let perm = Services.prefs.getIntPref(
"permissions.default.desktop-notification"
);
Assert.equal(perm, SitePermissions.UNKNOWN);
// Open the dialog once again.
await openPermissionsDialog("desktop-notification");
doc = sitePermissionsDialog.document;
// Disable permission and save changes.
checkbox = doc.getElementById("permissionsDisableCheckbox");
checkbox.checked = true;
doc.querySelector("dialog").getButton("accept").click();
// Check if the permission is now disabled.
perm = Services.prefs.getIntPref("permissions.default.desktop-notification");
Assert.equal(perm, SitePermissions.BLOCK);
// Open the dialog once again and check if the disabled state is still reflected in the checkbox.
await openPermissionsDialog("desktop-notification");
doc = sitePermissionsDialog.document;
checkbox = doc.getElementById("permissionsDisableCheckbox");
Assert.equal(checkbox.checked, true);
// Close the dialog and clean up.
doc.querySelector("dialog").getButton("cancel").click();
Services.prefs.setIntPref(
"permissions.default.desktop-notification",
SitePermissions.UNKNOWN
);
});
add_task(async function checkDefaultPermissionState() {
// Set default permission state to ALLOW.
Services.prefs.setIntPref(
"permissions.default.desktop-notification",
SitePermissions.ALLOW
);
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
// Check if the enabled state is reflected in the checkbox.
let checkbox = doc.getElementById("permissionsDisableCheckbox");
Assert.equal(checkbox.checked, false);
// Check the checkbox and then uncheck it.
checkbox.checked = true;
checkbox.checked = false;
// Save changes.
doc.querySelector("dialog").getButton("accept").click();
// Check if the default permission state is retained (and not automatically set to SitePermissions.UNKNOWN).
let state = Services.prefs.getIntPref(
"permissions.default.desktop-notification"
);
Assert.equal(state, SitePermissions.ALLOW);
// Clean up.
Services.prefs.setIntPref(
"permissions.default.desktop-notification",
SitePermissions.UNKNOWN
);
});
add_task(async function testTabBehaviour() {
// Test tab behaviour inside the permissions setting dialog when site permissions are selected.
// Only selected items in the richlistbox should be tabable for accessibility reasons.
// Force tabfocus for all elements on OSX.
SpecialPowers.pushPrefEnv({ set: [["accessibility.tabfocus", 7]] });
PermissionTestUtils.add(
URI,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
let u = Services.io.newURI("http://www.test.com");
PermissionTestUtils.add(
u,
"desktop-notification",
Services.perms.ALLOW_ACTION
);
await openPermissionsDialog("desktop-notification");
let doc = sitePermissionsDialog.document;
EventUtils.synthesizeKey("KEY_Tab", {}, sitePermissionsDialog);
let richlistbox = doc.getElementById("permissionsBox");
is(
richlistbox,
doc.activeElement.closest("#permissionsBox"),
"The richlistbox is focused after pressing tab once."
);
EventUtils.synthesizeKey("KEY_ArrowDown", {}, sitePermissionsDialog);
EventUtils.synthesizeKey("KEY_Tab", {}, sitePermissionsDialog);
let menulist = doc
.getElementById("permissionsBox")
.itemChildren[1].getElementsByTagName("menulist")[0];
is(
menulist,
doc.activeElement,
"The menulist inside the selected richlistitem is focused now"
);
EventUtils.synthesizeKey("KEY_Tab", {}, sitePermissionsDialog);
let removeButton = doc.getElementById("removePermission");
is(
removeButton,
doc.activeElement,
"The focus moves outside the richlistbox and onto the remove button"
);
PermissionTestUtils.remove(URI, "desktop-notification");
PermissionTestUtils.remove(u, "desktop-notification");
doc.querySelector("dialog").getButton("cancel").click();
});
add_task(async function addSpeakerPermission() {
let enabled = Services.prefs.getBoolPref("media.setsinkid.enabled", false);
let speakerRow =
gBrowser.contentDocument.getElementById("speakerSettingsRow");
Assert.equal(
BrowserTestUtils.isVisible(speakerRow),
enabled,
"speakerRow visible"
);
if (!enabled) {
return;
}
await openPermissionsDialog("speaker");
let doc = sitePermissionsDialog.document;
let richlistbox = doc.getElementById("permissionsBox");
Assert.equal(
richlistbox.itemCount,
0,
"Number of permission items is 0 initially"
);
// Add an allow permission for a device.
let deviceId = "DEVICE-ID";
let devicePermissionId = `speaker^${deviceId}`;
PermissionTestUtils.add(URI, devicePermissionId, Services.perms.ALLOW_ACTION);
// Observe the added permission changes in the dialog UI.
Assert.equal(richlistbox.itemCount, 1, "itemCount with allow");
checkMenulistPermissionItem(URL, Services.perms.ALLOW_ACTION);
// Check that an all-device deny permission overrides the device-specific
// allow permission.
PermissionTestUtils.add(URI, "speaker", Services.perms.DENY_ACTION);
Assert.equal(richlistbox.itemCount, 1, "itemCount with deny and allow");
let richlistitem = richlistbox.itemChildren[0];
let siteStatus = richlistitem.querySelector(".website-status");
Assert.equal(
siteStatus.value,
Services.perms.DENY_ACTION,
"website status with deny and allow"
);
// The website status element is not a menulist because all-device allow is
// not an option.
Assert.equal(siteStatus.tagName, "label");
PermissionTestUtils.remove(URI, devicePermissionId);
PermissionTestUtils.remove(URI, "speaker");
doc.querySelector("dialog").getButton("cancel").click();
});
add_task(async function removeTab() {
gBrowser.removeCurrentTab();
});