michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: Components.utils.import("resource://gre/modules/PlacesUtils.jsm"); michael@0: Components.utils.import("resource://gre/modules/NetUtil.jsm"); michael@0: michael@0: const ABOUT_PERMISSIONS_SPEC = "about:permissions"; michael@0: michael@0: const TEST_URI_1 = NetUtil.newURI("http://mozilla.com/"); michael@0: const TEST_URI_2 = NetUtil.newURI("http://mozilla.org/"); michael@0: michael@0: const TEST_PRINCIPAL_1 = Services.scriptSecurityManager.getNoAppCodebasePrincipal(TEST_URI_1); michael@0: const TEST_PRINCIPAL_2 = Services.scriptSecurityManager.getNoAppCodebasePrincipal(TEST_URI_2); michael@0: michael@0: // values from DefaultPermissions object michael@0: const PERM_UNKNOWN = 0; michael@0: const PERM_ALLOW = 1; michael@0: const PERM_DENY = 2; michael@0: // cookie specific permissions michael@0: const PERM_FIRST_PARTY_ONLY = 9; michael@0: michael@0: // used to set permissions on test sites michael@0: const TEST_PERMS = { michael@0: "password": PERM_ALLOW, michael@0: "cookie": PERM_ALLOW, michael@0: "geo": PERM_UNKNOWN, michael@0: "indexedDB": PERM_UNKNOWN, michael@0: "popup": PERM_DENY, michael@0: "fullscreen" : PERM_UNKNOWN, michael@0: "camera": PERM_UNKNOWN, michael@0: "microphone": PERM_UNKNOWN michael@0: }; michael@0: michael@0: const NO_GLOBAL_ALLOW = [ michael@0: "geo", michael@0: "indexedDB", michael@0: "fullscreen" michael@0: ]; michael@0: michael@0: // number of managed permissions in the interface michael@0: const TEST_PERMS_COUNT = 8; michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: registerCleanupFunction(cleanUp); michael@0: michael@0: // add test history visit michael@0: addVisits(TEST_URI_1, function() { michael@0: // set permissions ourselves to avoid problems with different defaults michael@0: // from test harness configuration michael@0: for (let type in TEST_PERMS) { michael@0: if (type == "password") { michael@0: Services.logins.setLoginSavingEnabled(TEST_URI_2.prePath, true); michael@0: } else { michael@0: // set permissions on a site without history visits to test enumerateServices michael@0: Services.perms.addFromPrincipal(TEST_PRINCIPAL_2, type, TEST_PERMS[type]); michael@0: } michael@0: } michael@0: michael@0: // open about:permissions michael@0: gBrowser.selectedTab = gBrowser.addTab("about:permissions"); michael@0: }); michael@0: michael@0: function observer() { michael@0: Services.obs.removeObserver(observer, "browser-permissions-initialized"); michael@0: runNextTest(); michael@0: } michael@0: Services.obs.addObserver(observer, "browser-permissions-initialized", false); michael@0: } michael@0: michael@0: function cleanUp() { michael@0: for (let type in TEST_PERMS) { michael@0: if (type != "password") { michael@0: Services.perms.removeFromPrincipal(TEST_PRINCIPAL_1, type); michael@0: Services.perms.removeFromPrincipal(TEST_PRINCIPAL_2, type); michael@0: } michael@0: } michael@0: michael@0: gBrowser.removeTab(gBrowser.selectedTab); michael@0: } michael@0: michael@0: function runNextTest() { michael@0: if (gTestIndex == tests.length) { michael@0: waitForClearHistory(finish); michael@0: return; michael@0: } michael@0: michael@0: let nextTest = tests[gTestIndex++]; michael@0: info("[" + nextTest.name + "] running test"); michael@0: nextTest(); michael@0: } michael@0: michael@0: var gSitesList; michael@0: var gHeaderDeck; michael@0: var gSiteLabel; michael@0: michael@0: var gTestIndex = 0; michael@0: var tests = [ michael@0: function test_page_load() { michael@0: is(gBrowser.currentURI.spec, ABOUT_PERMISSIONS_SPEC, "about:permissions loaded"); michael@0: michael@0: gSitesList = gBrowser.contentDocument.getElementById("sites-list"); michael@0: ok(gSitesList, "got sites list"); michael@0: michael@0: gHeaderDeck = gBrowser.contentDocument.getElementById("header-deck"); michael@0: ok(gHeaderDeck, "got header deck"); michael@0: michael@0: gSiteLabel = gBrowser.contentDocument.getElementById("site-label"); michael@0: ok(gSiteLabel, "got site label"); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_sites_list() { michael@0: is(gSitesList.firstChild.id, "all-sites-item", michael@0: "all sites is the first item in the sites list"); michael@0: michael@0: ok(getSiteItem(TEST_URI_1.host), "site item from places db exists"); michael@0: ok(getSiteItem(TEST_URI_2.host), "site item from enumerating services exists"); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_filter_sites_list() { michael@0: // set filter to test host michael@0: let sitesFilter = gBrowser.contentDocument.getElementById("sites-filter"); michael@0: sitesFilter.value = TEST_URI_1.host; michael@0: sitesFilter.doCommand(); michael@0: michael@0: // make sure correct sites are collapsed/showing michael@0: let testSite1 = getSiteItem(TEST_URI_1.host); michael@0: ok(!testSite1.collapsed, "test site 1 is not collapsed"); michael@0: let testSite2 = getSiteItem(TEST_URI_2.host); michael@0: ok(testSite2.collapsed, "test site 2 is collapsed"); michael@0: michael@0: // clear filter michael@0: sitesFilter.value = ""; michael@0: sitesFilter.doCommand(); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_all_sites() { michael@0: // "All Sites" item should be selected when the page is first loaded michael@0: is(gSitesList.selectedItem, gBrowser.contentDocument.getElementById("all-sites-item"), michael@0: "all sites item is selected"); michael@0: michael@0: let defaultsHeader = gBrowser.contentDocument.getElementById("defaults-header"); michael@0: is(defaultsHeader, gHeaderDeck.selectedPanel, michael@0: "correct header shown for all sites"); michael@0: michael@0: ok(gBrowser.contentDocument.getElementById("passwords-count").hidden, michael@0: "passwords count is hidden"); michael@0: ok(gBrowser.contentDocument.getElementById("cookies-count").hidden, michael@0: "cookies count is hidden"); michael@0: michael@0: // Test to make sure "Allow" items hidden for certain permission types michael@0: NO_GLOBAL_ALLOW.forEach(function(aType) { michael@0: let menuitem = gBrowser.contentDocument.getElementById(aType + "-" + PERM_ALLOW); michael@0: ok(menuitem.hidden, aType + " allow menuitem hidden for all sites"); michael@0: }); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_all_sites_permission() { michael@0: // apply the old default of allowing all cookies michael@0: Services.prefs.setIntPref("network.cookie.cookieBehavior", 0); michael@0: michael@0: // there should be no user-set pref for cookie behavior michael@0: is(Services.prefs.getIntPref("network.cookie.cookieBehavior"), PERM_UNKNOWN, michael@0: "network.cookie.cookieBehavior is expected default"); michael@0: michael@0: // the default behavior is to allow cookies michael@0: let cookieMenulist = getPermissionMenulist("cookie"); michael@0: is(cookieMenulist.value, PERM_ALLOW, michael@0: "menulist correctly shows that cookies are allowed"); michael@0: michael@0: // set the pref to block cookies michael@0: Services.prefs.setIntPref("network.cookie.cookieBehavior", PERM_DENY); michael@0: // check to make sure this change is reflected in the UI michael@0: is(cookieMenulist.value, PERM_DENY, "menulist correctly shows that cookies are blocked"); michael@0: michael@0: // clear the pref michael@0: Services.prefs.clearUserPref("network.cookie.cookieBehavior"); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_manage_all_passwords() { michael@0: // make sure "Manage All Passwords..." button opens the correct dialog michael@0: addWindowListener("chrome://passwordmgr/content/passwordManager.xul", runNextTest); michael@0: gBrowser.contentDocument.getElementById("passwords-manage-all-button").doCommand(); michael@0: michael@0: }, michael@0: michael@0: function test_manage_all_cookies() { michael@0: // make sure "Manage All Cookies..." button opens the correct dialog michael@0: addWindowListener("chrome://browser/content/preferences/cookies.xul", runNextTest); michael@0: gBrowser.contentDocument.getElementById("cookies-manage-all-button").doCommand(); michael@0: }, michael@0: michael@0: function test_select_site() { michael@0: // select the site that has the permissions we set at the beginning of the test michael@0: let testSiteItem = getSiteItem(TEST_URI_2.host); michael@0: gSitesList.selectedItem = testSiteItem; michael@0: michael@0: let siteHeader = gBrowser.contentDocument.getElementById("site-header"); michael@0: is(siteHeader, gHeaderDeck.selectedPanel, michael@0: "correct header shown for a specific site"); michael@0: is(gSiteLabel.value, TEST_URI_2.host, "header updated for selected site"); michael@0: michael@0: ok(!gBrowser.contentDocument.getElementById("passwords-count").hidden, michael@0: "passwords count is not hidden"); michael@0: ok(!gBrowser.contentDocument.getElementById("cookies-count").hidden, michael@0: "cookies count is not hidden"); michael@0: michael@0: // Test to make sure "Allow" items are *not* hidden for certain permission types michael@0: NO_GLOBAL_ALLOW.forEach(function(aType) { michael@0: let menuitem = gBrowser.contentDocument.getElementById(aType + "-" + PERM_ALLOW); michael@0: ok(!menuitem.hidden, aType + " allow menuitem not hidden for single site"); michael@0: }); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_permissions() { michael@0: let menulists = gBrowser.contentDocument.getElementsByClassName("pref-menulist"); michael@0: is(menulists.length, TEST_PERMS_COUNT, "got expected number of managed permissions"); michael@0: michael@0: for (let i = 0; i < menulists.length; i++) { michael@0: let permissionMenulist = menulists.item(i); michael@0: let permissionType = permissionMenulist.getAttribute("type"); michael@0: michael@0: // permissions should reflect what we set at the beginning of the test michael@0: is(permissionMenulist.value, TEST_PERMS[permissionType], michael@0: "got expected value for " + permissionType + " permission"); michael@0: } michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_permission_change() { michael@0: let geoMenulist = getPermissionMenulist("geo"); michael@0: is(geoMenulist.value, PERM_UNKNOWN, "menulist correctly shows that geolocation permission is unspecified"); michael@0: michael@0: // change a permission programatically michael@0: Services.perms.addFromPrincipal(TEST_PRINCIPAL_2, "geo", PERM_DENY); michael@0: // check to make sure this change is reflected in the UI michael@0: is(geoMenulist.value, PERM_DENY, "menulist shows that geolocation is blocked"); michael@0: michael@0: // change a permisssion in the UI michael@0: let geoAllowItem = gBrowser.contentDocument.getElementById("geo-" + PERM_ALLOW); michael@0: geoMenulist.selectedItem = geoAllowItem; michael@0: geoMenulist.doCommand(); michael@0: // check to make sure this change is reflected in the permission manager michael@0: is(Services.perms.testPermissionFromPrincipal(TEST_PRINCIPAL_2, "geo"), PERM_ALLOW, michael@0: "permission manager shows that geolocation is allowed"); michael@0: michael@0: michael@0: // change a site-specific cookie permission, just for fun michael@0: let cookieMenuList = getPermissionMenulist("cookie"); michael@0: let cookieItem = gBrowser.contentDocument.getElementById("cookie-" + PERM_FIRST_PARTY_ONLY); michael@0: cookieMenuList.selectedItem = cookieItem; michael@0: cookieMenuList.doCommand(); michael@0: is(cookieMenuList.value, PERM_FIRST_PARTY_ONLY, "menulist correctly shows that " + michael@0: "first party only cookies are allowed"); michael@0: is(Services.perms.testPermissionFromPrincipal(TEST_PRINCIPAL_2, "cookie"), michael@0: PERM_FIRST_PARTY_ONLY, "permission manager shows that first party cookies " + michael@0: "are allowed"); michael@0: michael@0: runNextTest(); michael@0: }, michael@0: michael@0: function test_forget_site() { michael@0: // click "Forget About This Site" button michael@0: gBrowser.contentDocument.getElementById("forget-site-button").doCommand(); michael@0: waitForClearHistory(function() { michael@0: is(gSiteLabel.value, "", "site label cleared"); michael@0: michael@0: let allSitesItem = gBrowser.contentDocument.getElementById("all-sites-item"); michael@0: is(gSitesList.selectedItem, allSitesItem, michael@0: "all sites item selected after forgetting selected site"); michael@0: michael@0: // check to make sure site is gone from sites list michael@0: let testSiteItem = getSiteItem(TEST_URI_2.host); michael@0: ok(!testSiteItem, "site removed from sites list"); michael@0: michael@0: // check to make sure we forgot all permissions corresponding to site michael@0: for (let type in TEST_PERMS) { michael@0: if (type == "password") { michael@0: ok(Services.logins.getLoginSavingEnabled(TEST_URI_2.prePath), michael@0: "password saving should be enabled by default"); michael@0: } else { michael@0: is(Services.perms.testPermissionFromPrincipal(TEST_PRINCIPAL_2, type), PERM_UNKNOWN, michael@0: type + " permission should not be set for test site 2"); michael@0: } michael@0: } michael@0: michael@0: runNextTest(); michael@0: }); michael@0: } michael@0: ]; michael@0: michael@0: function getPermissionMenulist(aType) { michael@0: return gBrowser.contentDocument.getElementById(aType + "-menulist"); michael@0: } michael@0: michael@0: function getSiteItem(aHost) { michael@0: return gBrowser.contentDocument. michael@0: querySelector(".site[value='" + aHost + "']"); michael@0: } michael@0: michael@0: function addWindowListener(aURL, aCallback) { michael@0: Services.wm.addListener({ michael@0: onOpenWindow: function(aXULWindow) { michael@0: info("window opened, waiting for focus"); michael@0: Services.wm.removeListener(this); michael@0: michael@0: var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor) michael@0: .getInterface(Ci.nsIDOMWindow); michael@0: waitForFocus(function() { michael@0: is(domwindow.document.location.href, aURL, "should have seen the right window open"); michael@0: domwindow.close(); michael@0: aCallback(); michael@0: }, domwindow); michael@0: }, michael@0: onCloseWindow: function(aXULWindow) { }, michael@0: onWindowTitleChange: function(aXULWindow, aNewTitle) { } michael@0: }); michael@0: } michael@0: michael@0: // copied from toolkit/components/places/tests/head_common.js michael@0: function waitForClearHistory(aCallback) { michael@0: let observer = { michael@0: observe: function(aSubject, aTopic, aData) { michael@0: Services.obs.removeObserver(this, PlacesUtils.TOPIC_EXPIRATION_FINISHED); michael@0: aCallback(); michael@0: } michael@0: }; michael@0: Services.obs.addObserver(observer, PlacesUtils.TOPIC_EXPIRATION_FINISHED, false); michael@0: PlacesUtils.bhistory.removeAllPages(); michael@0: }