forked from mirrors/gecko-dev
		
	 dce6901df0
			
		
	
	
		dce6901df0
		
	
	
	
	
		
			
			For speaker permissions, this has the effect of presenting a menulist instead of a label when a device-specific ALLOW permission is set, providing the option to the user of changing this to a BLOCK. A global permission for speaker selection is not currently supported but if it were implemented and set to BLOCK, then a menulist would be shown for all sites with permissions set. It would include at least PROMPT and BLOCK menuitems. This change would mean that the menulist selected item can display "Allowed" when a device-specific ALLOW permission has already been granted through a selectAudioOutput() prompt. _permissionsToChange is modified in _removePermissionFromList() so that permissions changed then deleted are not added by onApplyChanges(). Differential Revision: https://phabricator.services.mozilla.com/D172085
		
			
				
	
	
		
			685 lines
		
	
	
	
		
			19 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			685 lines
		
	
	
	
		
			19 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "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.value, 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"),
 | |
|     "http://www.example.com"
 | |
|   );
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(1).getAttribute("origin"),
 | |
|     "http://www.test.com"
 | |
|   );
 | |
| 
 | |
|   doc.getElementById("statusCol").click();
 | |
| 
 | |
|   // Test the rearrangement(Block followed by Allow).
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(0).getAttribute("origin"),
 | |
|     "http://www.test.com"
 | |
|   );
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(1).getAttribute("origin"),
 | |
|     "http://www.example.com"
 | |
|   );
 | |
| 
 | |
|   doc.getElementById("siteCol").click();
 | |
| 
 | |
|   // Test the rearrangement(Website names arranged in alphabhetical order).
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(0).getAttribute("origin"),
 | |
|     "http://www.example.com"
 | |
|   );
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(1).getAttribute("origin"),
 | |
|     "http://www.test.com"
 | |
|   );
 | |
| 
 | |
|   doc.getElementById("siteCol").click();
 | |
| 
 | |
|   // Test the rearrangement(Website names arranged in reverse alphabhetical order).
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(0).getAttribute("origin"),
 | |
|     "http://www.test.com"
 | |
|   );
 | |
|   Assert.equal(
 | |
|     richlistbox.getItemAtIndex(1).getAttribute("origin"),
 | |
|     "http://www.example.com"
 | |
|   );
 | |
| 
 | |
|   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.is_visible(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, "hbox");
 | |
|   Assert.equal(siteStatus.firstElementChild.tagName, "label");
 | |
| 
 | |
|   PermissionTestUtils.remove(URI, devicePermissionId);
 | |
|   PermissionTestUtils.remove(URI, "speaker");
 | |
| 
 | |
|   doc
 | |
|     .querySelector("dialog")
 | |
|     .getButton("cancel")
 | |
|     .click();
 | |
| });
 | |
| 
 | |
| add_task(async function removeTab() {
 | |
|   gBrowser.removeCurrentTab();
 | |
| });
 |