forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			148 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
	
		
			4.3 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/permissions.xhtml";
 | |
| 
 | |
| let sitePermissionsDialog;
 | |
| 
 | |
| let principal = Services.scriptSecurityManager.createContentPrincipal(
 | |
|   Services.io.newURI("http://www.example.com"),
 | |
|   {}
 | |
| );
 | |
| let pbPrincipal = Services.scriptSecurityManager.principalWithOA(principal, {
 | |
|   privateBrowsingId: 1,
 | |
| });
 | |
| let principalB = Services.scriptSecurityManager.createContentPrincipal(
 | |
|   Services.io.newURI("https://example.org"),
 | |
|   {}
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * Replaces the default permissions defined in browser/app/permissions with our
 | |
|  * own test-only permissions and instructs the permission manager to import
 | |
|  * them.
 | |
|  */
 | |
| async function addDefaultTestPermissions() {
 | |
|   // create a file in the temp directory with the defaults.
 | |
|   let file = Services.dirsvc.get("TmpD", Ci.nsIFile);
 | |
|   file.append("test_default_permissions");
 | |
| 
 | |
|   await IOUtils.writeUTF8(
 | |
|     file.path,
 | |
|     `origin\tinstall\t1\t${principal.origin}\norigin\tinstall\t1\t${pbPrincipal.origin}\n`
 | |
|   );
 | |
| 
 | |
|   // Change the default permission file path.
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [
 | |
|       ["permissions.manager.defaultsUrl", Services.io.newFileURI(file).spec],
 | |
|     ],
 | |
|   });
 | |
| 
 | |
|   // Call the permission manager to reload default permissions from file.
 | |
|   Services.obs.notifyObservers(null, "testonly-reload-permissions-from-disk");
 | |
| 
 | |
|   registerCleanupFunction(async () => {
 | |
|     // Clean up temporary default permission file.
 | |
|     await IOUtils.remove(file.path);
 | |
| 
 | |
|     // Restore non-test default permissions.
 | |
|     await SpecialPowers.popPrefEnv();
 | |
|     Services.obs.notifyObservers(null, "testonly-reload-permissions-from-disk");
 | |
|   });
 | |
| }
 | |
| 
 | |
| async function openPermissionsDialog() {
 | |
|   let dialogOpened = promiseLoadSubDialog(PERMISSIONS_URL);
 | |
| 
 | |
|   await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function() {
 | |
|     let doc = content.document;
 | |
|     let settingsButton = doc.getElementById("addonExceptions");
 | |
|     settingsButton.click();
 | |
|   });
 | |
| 
 | |
|   sitePermissionsDialog = await dialogOpened;
 | |
|   await sitePermissionsDialog.document.mozSubdialogReady;
 | |
| }
 | |
| 
 | |
| add_setup(async function() {
 | |
|   await addDefaultTestPermissions();
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that default (persistent) private browsing permissions can be removed.
 | |
|  */
 | |
| add_task(async function removeAll() {
 | |
|   await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
 | |
|   await openPermissionsDialog();
 | |
| 
 | |
|   let doc = sitePermissionsDialog.document;
 | |
|   let richlistbox = doc.getElementById("permissionsBox");
 | |
| 
 | |
|   // First item in the richlistbox contains column headers.
 | |
|   Assert.equal(
 | |
|     richlistbox.itemCount,
 | |
|     2,
 | |
|     "Should have the two default permission entries initially."
 | |
|   );
 | |
| 
 | |
|   info("Adding a new non-default install permission");
 | |
|   PermissionTestUtils.add(principalB, "install", Services.perms.ALLOW_ACTION);
 | |
| 
 | |
|   info("Waiting for the permission to appear in the list.");
 | |
|   await BrowserTestUtils.waitForMutationCondition(
 | |
|     richlistbox,
 | |
|     { childList: true },
 | |
|     () => richlistbox.itemCount == 3
 | |
|   );
 | |
| 
 | |
|   info("Clicking remove all.");
 | |
|   doc.getElementById("removeAllPermissions").click();
 | |
| 
 | |
|   info("Waiting for all list items to be cleared.");
 | |
|   await BrowserTestUtils.waitForMutationCondition(
 | |
|     richlistbox,
 | |
|     { childList: true },
 | |
|     () => richlistbox.itemCount == 0
 | |
|   );
 | |
| 
 | |
|   let dialogClosePromise = BrowserTestUtils.waitForEvent(
 | |
|     sitePermissionsDialog,
 | |
|     "dialogclosing",
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   info("Accepting dialog to apply the changes.");
 | |
|   doc
 | |
|     .querySelector("dialog")
 | |
|     .getButton("accept")
 | |
|     .click();
 | |
| 
 | |
|   info("Waiting for dialog to close.");
 | |
|   await dialogClosePromise;
 | |
| 
 | |
|   info("Waiting for all permissions to be removed.");
 | |
|   await TestUtils.waitForCondition(
 | |
|     () =>
 | |
|       PermissionTestUtils.getPermissionObject(principal, "install") == null &&
 | |
|       PermissionTestUtils.getPermissionObject(pbPrincipal, "install") == null &&
 | |
|       PermissionTestUtils.getPermissionObject(principalB, "install") == null
 | |
|   );
 | |
| 
 | |
|   info("Opening the permissions dialog again.");
 | |
|   await openPermissionsDialog();
 | |
| 
 | |
|   Assert.equal(
 | |
|     richlistbox.itemCount,
 | |
|     0,
 | |
|     "Permission list should still be empty."
 | |
|   );
 | |
| 
 | |
|   // Cleanup
 | |
|   BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | |
|   Services.perms.removeAll();
 | |
| });
 | 
