From 7264beb9afd51e98b545954e479230198033edcb Mon Sep 17 00:00:00 2001 From: Johann Hofmann Date: Tue, 13 Mar 2018 10:41:38 +0100 Subject: [PATCH] Bug 1445188 - Move site data tests into their own subdirectory. r=jaws This commit is mostly about moving files but also contains a few test cleanups. MozReview-Commit-ID: AkDhFxlGdCT --HG-- rename : browser/components/preferences/in-content/tests/browser_clearSiteData.js => browser/components/preferences/in-content/tests/siteData/browser_clearSiteData.js rename : browser/components/preferences/in-content/tests/browser_siteData.js => browser/components/preferences/in-content/tests/siteData/browser_siteData.js rename : browser/components/preferences/in-content/tests/browser_siteData2.js => browser/components/preferences/in-content/tests/siteData/browser_siteData2.js rename : browser/components/preferences/in-content/tests/browser_siteData3.js => browser/components/preferences/in-content/tests/siteData/browser_siteData3.js rename : browser/components/preferences/in-content/tests/head.js => browser/components/preferences/in-content/tests/siteData/head.js rename : browser/components/preferences/in-content/tests/offline/manifest.appcache => browser/components/preferences/in-content/tests/siteData/offline/manifest.appcache rename : browser/components/preferences/in-content/tests/offline/offline.html => browser/components/preferences/in-content/tests/siteData/offline/offline.html rename : browser/components/preferences/in-content/tests/service_worker_test.html => browser/components/preferences/in-content/tests/siteData/service_worker_test.html rename : browser/components/preferences/in-content/tests/service_worker_test.js => browser/components/preferences/in-content/tests/siteData/service_worker_test.js rename : browser/components/preferences/in-content/tests/site_data_test.html => browser/components/preferences/in-content/tests/siteData/site_data_test.html extra : rebase_source : 5e715469de30f7f1ae956c272c254cdc4426f605 --- .../preferences/in-content/tests/browser.ini | 10 - .../preferences/in-content/tests/head.js | 150 ----------- .../in-content/tests/siteData/browser.ini | 14 ++ .../{ => siteData}/browser_clearSiteData.js | 13 +- .../tests/{ => siteData}/browser_siteData.js | 26 +- .../tests/{ => siteData}/browser_siteData2.js | 18 +- .../tests/{ => siteData}/browser_siteData3.js | 5 - .../in-content/tests/siteData/head.js | 237 ++++++++++++++++++ .../{ => siteData}/offline/manifest.appcache | 0 .../tests/{ => siteData}/offline/offline.html | 0 .../{ => siteData}/service_worker_test.html | 0 .../{ => siteData}/service_worker_test.js | 0 .../tests/{ => siteData}/site_data_test.html | 0 browser/components/preferences/moz.build | 3 +- 14 files changed, 264 insertions(+), 212 deletions(-) create mode 100644 browser/components/preferences/in-content/tests/siteData/browser.ini rename browser/components/preferences/in-content/tests/{ => siteData}/browser_clearSiteData.js (89%) rename browser/components/preferences/in-content/tests/{ => siteData}/browser_siteData.js (87%) rename browser/components/preferences/in-content/tests/{ => siteData}/browser_siteData2.js (92%) rename browser/components/preferences/in-content/tests/{ => siteData}/browser_siteData3.js (95%) create mode 100644 browser/components/preferences/in-content/tests/siteData/head.js rename browser/components/preferences/in-content/tests/{ => siteData}/offline/manifest.appcache (100%) rename browser/components/preferences/in-content/tests/{ => siteData}/offline/offline.html (100%) rename browser/components/preferences/in-content/tests/{ => siteData}/service_worker_test.html (100%) rename browser/components/preferences/in-content/tests/{ => siteData}/service_worker_test.js (100%) rename browser/components/preferences/in-content/tests/{ => siteData}/site_data_test.html (100%) diff --git a/browser/components/preferences/in-content/tests/browser.ini b/browser/components/preferences/in-content/tests/browser.ini index 31008c549f53..5060f3034a4f 100644 --- a/browser/components/preferences/in-content/tests/browser.ini +++ b/browser/components/preferences/in-content/tests/browser.ini @@ -5,13 +5,8 @@ prefs = support-files = head.js privacypane_tests_perwindow.js - site_data_test.html - service_worker_test.html - service_worker_test.js addons/set_homepage.xpi addons/set_newtab.xpi - offline/offline.html - offline/manifest.appcache [browser_applications_selection.js] skip-if = os == 'linux' # bug 1382057 @@ -45,7 +40,6 @@ skip-if = os != "win" || (os == "win" && os_version == "6.1") # This test tests the windows-specific app selection dialog, so can't run on non-Windows. # Skip the test on Window 7, see the detail at Bug 1381706. [browser_checkspelling.js] -[browser_clearSiteData.js] [browser_connection.js] [browser_connection_bug388287.js] [browser_cookies_exceptions.js] @@ -82,10 +76,6 @@ run-if = nightly_build [browser_searchsuggestions.js] [browser_security-1.js] [browser_security-2.js] -[browser_siteData.js] -skip-if = (os == 'linux' && debug) # Bug 1439332 -[browser_siteData2.js] -[browser_siteData3.js] [browser_spotlight.js] [browser_site_login_exceptions.js] [browser_permissions_dialog.js] diff --git a/browser/components/preferences/in-content/tests/head.js b/browser/components/preferences/in-content/tests/head.js index d12a36e73bfc..7d2c48d9b6f7 100644 --- a/browser/components/preferences/in-content/tests/head.js +++ b/browser/components/preferences/in-content/tests/head.js @@ -3,8 +3,6 @@ ChromeUtils.import("resource://gre/modules/Promise.jsm", this); -XPCOMUtils.defineLazyServiceGetter(this, "serviceWorkerManager", "@mozilla.org/serviceworkers/manager;1", "nsIServiceWorkerManager"); - const kDefaultWait = 2000; function is_hidden(aElement) { @@ -144,46 +142,6 @@ function openPreferencesViaOpenPreferencesAPI(aPane, aOptions) { }); } -function promiseWindowDialogOpen(buttonAction, url) { - return BrowserTestUtils.promiseAlertDialogOpen(buttonAction, url); -} - -function promiseAlertDialogOpen(buttonAction) { - return BrowserTestUtils.promiseAlertDialogOpen(buttonAction); -} - -function promiseSiteDataManagerSitesUpdated() { - return TestUtils.topicObserved("sitedatamanager:sites-updated", () => true); -} - -function openSiteDataSettingsDialog() { - let doc = gBrowser.selectedBrowser.contentDocument; - let settingsBtn = doc.getElementById("siteDataSettings"); - let dialogOverlay = content.gSubDialog._preloadDialog._overlay; - let dialogLoadPromise = promiseLoadSubDialog("chrome://browser/content/preferences/siteDataSettings.xul"); - let dialogInitPromise = TestUtils.topicObserved("sitedata-settings-init", () => true); - let fullyLoadPromise = Promise.all([dialogLoadPromise, dialogInitPromise]).then(() => { - is(dialogOverlay.style.visibility, "visible", "The Settings dialog should be visible"); - }); - settingsBtn.doCommand(); - return fullyLoadPromise; -} - -function assertSitesListed(doc, hosts) { - let frameDoc = content.gSubDialog._topDialog._frame.contentDocument; - let removeBtn = frameDoc.getElementById("removeSelected"); - let removeAllBtn = frameDoc.getElementById("removeAll"); - let sitesList = frameDoc.getElementById("sitesList"); - let totalSitesNumber = sitesList.getElementsByTagName("richlistitem").length; - is(totalSitesNumber, hosts.length, "Should list the right sites number"); - hosts.forEach(host => { - let site = sitesList.querySelector(`richlistitem[host="${host}"]`); - ok(site, `Should list the site of ${host}`); - }); - is(removeBtn.disabled, true, "Should disable the removeSelected button"); - is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button"); -} - async function evaluateSearchResults(keyword, searchReults) { searchReults = Array.isArray(searchReults) ? searchReults : [searchReults]; searchReults.push("header-searchResults"); @@ -206,111 +164,3 @@ async function evaluateSearchResults(keyword, searchReults) { } } -const mockSiteDataManager = { - - _SiteDataManager: null, - _originalQMS: null, - _originalRemoveQuotaUsage: null, - - getUsage(onUsageResult) { - let result = this.fakeSites.map(site => ({ - origin: site.principal.origin, - usage: site.usage, - persisted: site.persisted, - lastAccessed: site.lastAccessed, - })); - onUsageResult({ result, resultCode: Cr.NS_OK }); - }, - - _removeQuotaUsage(site) { - var target = site.principals[0].URI.host; - this.fakeSites = this.fakeSites.filter(fakeSite => { - return fakeSite.principal.URI.host != target; - }); - }, - - register(SiteDataManager, fakeSites) { - this._SiteDataManager = SiteDataManager; - this._originalQMS = this._SiteDataManager._qms; - this._SiteDataManager._qms = this; - this._originalRemoveQuotaUsage = this._SiteDataManager._removeQuotaUsage; - this._SiteDataManager._removeQuotaUsage = this._removeQuotaUsage.bind(this); - // Add some fake data. - this.fakeSites = fakeSites; - for (let site of fakeSites) { - if (!site.principal) { - site.principal = Services.scriptSecurityManager - .createCodebasePrincipalFromOrigin(site.origin); - } - - let uri = site.principal.URI; - try { - site.baseDomain = Services.eTLD.getBaseDomainFromHost(uri.host); - } catch (e) { - site.baseDomain = uri.host; - } - - // Add some cookies if needed. - for (let i = 0; i < (site.cookies || 0); i++) { - Services.cookies.add(uri.host, uri.pathQueryRef, Cu.now(), i, - false, false, false, Date.now() + 1000 * 60 * 60); - } - } - }, - - async unregister() { - await this._SiteDataManager.removeAll(); - this.fakeSites = null; - this._SiteDataManager._qms = this._originalQMS; - this._SiteDataManager._removeQuotaUsage = this._originalRemoveQuotaUsage; - } -}; - -function getQuotaUsage(origin) { - return new Promise(resolve => { - let uri = NetUtil.newURI(origin); - let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {}); - Services.qms.getUsageForPrincipal(principal, request => resolve(request.result.usage)); - }); -} - -function promiseCookiesCleared() { - return TestUtils.topicObserved("cookie-changed", (subj, data) => { - return data === "cleared"; - }); -} - -async function loadServiceWorkerTestPage(url) { - let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url); - await BrowserTestUtils.waitForCondition(() => { - return ContentTask.spawn(tab.linkedBrowser, {}, () => - content.document.body.getAttribute("data-test-service-worker-registered") === "true"); - }, `Fail to load service worker test ${url}`); - await BrowserTestUtils.removeTab(tab); -} - -function promiseServiceWorkersCleared() { - return BrowserTestUtils.waitForCondition(() => { - let serviceWorkers = serviceWorkerManager.getAllRegistrations(); - if (serviceWorkers.length == 0) { - ok(true, "Cleared all service workers"); - return true; - } - return false; - }, "Should clear all service workers"); -} - -function promiseServiceWorkerRegisteredFor(url) { - return BrowserTestUtils.waitForCondition(() => { - try { - let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(url); - let sw = serviceWorkerManager.getRegistrationByPrincipal(principal, principal.URI.spec); - if (sw) { - ok(true, `Found the service worker registered for ${url}`); - return true; - } - } catch (e) {} - return false; - }, `Should register service worker for ${url}`); -} - diff --git a/browser/components/preferences/in-content/tests/siteData/browser.ini b/browser/components/preferences/in-content/tests/siteData/browser.ini new file mode 100644 index 000000000000..fe3d8e4dfffa --- /dev/null +++ b/browser/components/preferences/in-content/tests/siteData/browser.ini @@ -0,0 +1,14 @@ +[DEFAULT] +support-files = + head.js + site_data_test.html + service_worker_test.html + service_worker_test.js + offline/offline.html + offline/manifest.appcache + +[browser_clearSiteData.js] +[browser_siteData.js] +skip-if = (os == 'linux' && debug) # Bug 1439332 +[browser_siteData2.js] +[browser_siteData3.js] diff --git a/browser/components/preferences/in-content/tests/browser_clearSiteData.js b/browser/components/preferences/in-content/tests/siteData/browser_clearSiteData.js similarity index 89% rename from browser/components/preferences/in-content/tests/browser_clearSiteData.js rename to browser/components/preferences/in-content/tests/siteData/browser_clearSiteData.js index 6f1f10d77c25..13e761783412 100644 --- a/browser/components/preferences/in-content/tests/browser_clearSiteData.js +++ b/browser/components/preferences/in-content/tests/siteData/browser_clearSiteData.js @@ -5,17 +5,6 @@ ChromeUtils.import("resource:///modules/SitePermissions.jsm"); -const { SiteDataManager } = ChromeUtils.import("resource:///modules/SiteDataManager.jsm", {}); -const { DownloadUtils } = ChromeUtils.import("resource://gre/modules/DownloadUtils.jsm", {}); - -const TEST_QUOTA_USAGE_HOST = "example.com"; -const TEST_QUOTA_USAGE_ORIGIN = "https://" + TEST_QUOTA_USAGE_HOST; -const TEST_QUOTA_USAGE_URL = TEST_QUOTA_USAGE_ORIGIN + "/browser/browser/components/preferences/in-content/tests/site_data_test.html"; -const TEST_OFFLINE_HOST = "example.org"; -const TEST_OFFLINE_ORIGIN = "https://" + TEST_OFFLINE_HOST; -const TEST_OFFLINE_URL = TEST_OFFLINE_ORIGIN + "/browser/browser/components/preferences/in-content/tests/offline/offline.html"; -const TEST_SERVICE_WORKER_URL = TEST_OFFLINE_ORIGIN + "/browser/browser/components/preferences/in-content/tests/service_worker_test.html"; - async function testClearData(clearSiteData, clearCache) { let quotaURI = Services.io.newURI(TEST_QUOTA_USAGE_ORIGIN); SitePermissions.set(quotaURI, "persistent-storage", SitePermissions.ALLOW); @@ -89,7 +78,7 @@ async function testClearData(clearSiteData, clearCache) { let updatePromise; let cookiesClearedPromise; if (clearSiteData) { - acceptPromise = promiseAlertDialogOpen("accept"); + acceptPromise = BrowserTestUtils.promiseAlertDialogOpen("accept"); updatePromise = promiseSiteDataManagerSitesUpdated(); cookiesClearedPromise = promiseCookiesCleared(); } diff --git a/browser/components/preferences/in-content/tests/browser_siteData.js b/browser/components/preferences/in-content/tests/siteData/browser_siteData.js similarity index 87% rename from browser/components/preferences/in-content/tests/browser_siteData.js rename to browser/components/preferences/in-content/tests/siteData/browser_siteData.js index 2318525fded4..53fa4393e455 100644 --- a/browser/components/preferences/in-content/tests/browser_siteData.js +++ b/browser/components/preferences/in-content/tests/siteData/browser_siteData.js @@ -3,22 +3,8 @@ "use strict"; -const TEST_QUOTA_USAGE_HOST = "example.com"; -const TEST_QUOTA_USAGE_ORIGIN = "https://" + TEST_QUOTA_USAGE_HOST; -const TEST_QUOTA_USAGE_URL = TEST_QUOTA_USAGE_ORIGIN + "/browser/browser/components/preferences/in-content/tests/site_data_test.html"; -const TEST_OFFLINE_HOST = "example.org"; -const TEST_OFFLINE_ORIGIN = "https://" + TEST_OFFLINE_HOST; -const TEST_OFFLINE_URL = TEST_OFFLINE_ORIGIN + "/browser/browser/components/preferences/in-content/tests/offline/offline.html"; -const TEST_SERVICE_WORKER_URL = TEST_OFFLINE_ORIGIN + "/browser/browser/components/preferences/in-content/tests/service_worker_test.html"; -const REMOVE_DIALOG_URL = "chrome://browser/content/preferences/siteDataRemoveSelected.xul"; - -const { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm", {}); -const { DownloadUtils } = ChromeUtils.import("resource://gre/modules/DownloadUtils.jsm", {}); -const { SiteDataManager } = ChromeUtils.import("resource:///modules/SiteDataManager.jsm", {}); -const { OfflineAppCacheHelper } = ChromeUtils.import("resource:///modules/offlineAppCache.jsm", {}); - function getPersistentStoragePermStatus(origin) { - let uri = NetUtil.newURI(origin); + let uri = Services.io.newURI(origin); let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {}); return Services.perms.testExactPermissionFromPrincipal(principal, "persistent-storage"); } @@ -26,8 +12,6 @@ function getPersistentStoragePermStatus(origin) { // Test listing site using quota usage or site using appcache // This is currently disabled because of bug 1414751. add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); - // Open a test site which would save into appcache await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_OFFLINE_URL); await BrowserTestUtils.removeTab(gBrowser.selectedTab); @@ -71,7 +55,6 @@ add_task(async function() { // Test buttons are disabled and loading message shown while updating sites add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); let updatedPromise = promiseSiteDataManagerSitesUpdated(); await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); await updatedPromise; @@ -118,7 +101,6 @@ add_task(async function() { // Test clearing service wroker through the settings panel add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); // Register a test service worker await loadServiceWorkerTestPage(TEST_SERVICE_WORKER_URL); await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); @@ -126,7 +108,7 @@ add_task(async function() { await promiseServiceWorkerRegisteredFor(TEST_SERVICE_WORKER_URL); // Open the Site Data Settings panel and remove the site await openSiteDataSettingsDialog(); - let acceptRemovePromise = promiseAlertDialogOpen("accept"); + let acceptRemovePromise = BrowserTestUtils.promiseAlertDialogOpen("accept"); let updatePromise = promiseSiteDataManagerSitesUpdated(); ContentTask.spawn(gBrowser.selectedBrowser, { TEST_OFFLINE_HOST }, args => { let host = args.TEST_OFFLINE_HOST; @@ -186,7 +168,7 @@ add_task(async function() { // Open the site data manager and remove one site. await openSiteDataSettingsDialog(); - let removeDialogOpenPromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL); + let removeDialogOpenPromise = BrowserTestUtils.promiseAlertDialogOpen("accept", REMOVE_DIALOG_URL); await ContentTask.spawn(gBrowser.selectedBrowser, {creationDate1, creationDate2}, function(args) { let frameDoc = content.gSubDialog._topDialog._frame.contentDocument; @@ -221,7 +203,7 @@ add_task(async function() { // Open the site data manager and remove another site. await openSiteDataSettingsDialog(); - let acceptRemovePromise = promiseAlertDialogOpen("accept"); + let acceptRemovePromise = BrowserTestUtils.promiseAlertDialogOpen("accept"); await ContentTask.spawn(gBrowser.selectedBrowser, {creationDate1}, function(args) { let frameDoc = content.gSubDialog._topDialog._frame.contentDocument; diff --git a/browser/components/preferences/in-content/tests/browser_siteData2.js b/browser/components/preferences/in-content/tests/siteData/browser_siteData2.js similarity index 92% rename from browser/components/preferences/in-content/tests/browser_siteData2.js rename to browser/components/preferences/in-content/tests/siteData/browser_siteData2.js index 5263ece73ce2..666bb5c37957 100644 --- a/browser/components/preferences/in-content/tests/browser_siteData2.js +++ b/browser/components/preferences/in-content/tests/siteData/browser_siteData2.js @@ -1,6 +1,4 @@ "use strict"; -const { SiteDataManager } = ChromeUtils.import("resource:///modules/SiteDataManager.jsm", {}); -const REMOVE_DIALOG_URL = "chrome://browser/content/preferences/siteDataRemoveSelected.xul"; /* eslint-disable mozilla/no-cpows-in-tests */ @@ -31,7 +29,6 @@ function assertAllSitesNotListed(win) { // Test selecting and removing all sites one by one add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); mockSiteDataManager.register(SiteDataManager, [ { usage: 1024, @@ -83,7 +80,7 @@ add_task(async function() { assertSitesListed(doc, fakeHosts); // Test the "Save Changes" button but cancelling save - let cancelPromise = promiseAlertDialogOpen("cancel"); + let cancelPromise = BrowserTestUtils.promiseAlertDialogOpen("cancel"); settingsDialogClosePromise = promiseSettingsDialogClose(); frameDoc = win.gSubDialog._topDialog._frame.contentDocument; saveBtn = frameDoc.getElementById("save"); @@ -98,7 +95,7 @@ add_task(async function() { assertSitesListed(doc, fakeHosts); // Test the "Save Changes" button and accepting save - let acceptPromise = promiseAlertDialogOpen("accept"); + let acceptPromise = BrowserTestUtils.promiseAlertDialogOpen("accept"); settingsDialogClosePromise = promiseSettingsDialogClose(); updatePromise = promiseSiteDataManagerSitesUpdated(); frameDoc = win.gSubDialog._topDialog._frame.contentDocument; @@ -129,7 +126,6 @@ add_task(async function() { // Test selecting and removing partial sites add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); mockSiteDataManager.register(SiteDataManager, [ { usage: 1024, @@ -197,7 +193,7 @@ add_task(async function() { assertSitesListed(doc, fakeHosts); // Test the "Save Changes" button but canceling save - removeDialogOpenPromise = promiseWindowDialogOpen("cancel", REMOVE_DIALOG_URL); + removeDialogOpenPromise = BrowserTestUtils.promiseAlertDialogOpen("cancel", REMOVE_DIALOG_URL); settingsDialogClosePromise = promiseSettingsDialogClose(); frameDoc = win.gSubDialog._topDialog._frame.contentDocument; saveBtn = frameDoc.getElementById("save"); @@ -212,7 +208,7 @@ add_task(async function() { assertSitesListed(doc, fakeHosts); // Test the "Save Changes" button and accepting save - removeDialogOpenPromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL); + removeDialogOpenPromise = BrowserTestUtils.promiseAlertDialogOpen("accept", REMOVE_DIALOG_URL); settingsDialogClosePromise = promiseSettingsDialogClose(); frameDoc = win.gSubDialog._topDialog._frame.contentDocument; saveBtn = frameDoc.getElementById("save"); @@ -247,7 +243,6 @@ add_task(async function() { // Test searching and then removing only visible sites add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); mockSiteDataManager.register(SiteDataManager, [ { usage: 1024, @@ -288,7 +283,7 @@ add_task(async function() { // Test only removing all visible sites listed updatePromise = promiseSiteDataManagerSitesUpdated(); - let acceptRemovePromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL); + let acceptRemovePromise = BrowserTestUtils.promiseAlertDialogOpen("accept", REMOVE_DIALOG_URL); let settingsDialogClosePromise = promiseSettingsDialogClose(); let removeAllBtn = frameDoc.getElementById("removeAll"); let saveBtn = frameDoc.getElementById("save"); @@ -306,7 +301,6 @@ add_task(async function() { // Test dynamically clearing all site data add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); mockSiteDataManager.register(SiteDataManager, [ { usage: 1024, @@ -346,7 +340,7 @@ add_task(async function() { let win = gBrowser.selectedBrowser.contentWindow; let frameDoc = win.gSubDialog._topDialog._frame.contentDocument; updatePromise = promiseSiteDataManagerSitesUpdated(); - let acceptRemovePromise = promiseAlertDialogOpen("accept"); + let acceptRemovePromise = BrowserTestUtils.promiseAlertDialogOpen("accept"); let settingsDialogClosePromise = promiseSettingsDialogClose(); let removeAllBtn = frameDoc.getElementById("removeAll"); let saveBtn = frameDoc.getElementById("save"); diff --git a/browser/components/preferences/in-content/tests/browser_siteData3.js b/browser/components/preferences/in-content/tests/siteData/browser_siteData3.js similarity index 95% rename from browser/components/preferences/in-content/tests/browser_siteData3.js rename to browser/components/preferences/in-content/tests/siteData/browser_siteData3.js index e71bd1a21a9e..8c924dea6423 100644 --- a/browser/components/preferences/in-content/tests/browser_siteData3.js +++ b/browser/components/preferences/in-content/tests/siteData/browser_siteData3.js @@ -1,10 +1,7 @@ "use strict"; -const { SiteDataManager } = ChromeUtils.import("resource:///modules/SiteDataManager.jsm", {}); -const { DownloadUtils } = ChromeUtils.import("resource://gre/modules/DownloadUtils.jsm", {}); // Test not displaying sites which store 0 byte and don't have persistent storage. add_task(async function() { - await SpecialPowers.pushPrefEnv({ set: [["browser.storageManager.enabled", true]] }); mockSiteDataManager.register(SiteDataManager, [ { usage: 0, @@ -48,7 +45,6 @@ add_task(async function() { // Test grouping and listing sites across scheme, port and origin attributes by host add_task(async function() { - await SpecialPowers.pushPrefEnv({ set: [["browser.storageManager.enabled", true]] }); const quotaUsage = 1024; mockSiteDataManager.register(SiteDataManager, [ { @@ -107,7 +103,6 @@ add_task(async function() { // Test sorting add_task(async function() { - await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]}); mockSiteDataManager.register(SiteDataManager, [ { usage: 1024, diff --git a/browser/components/preferences/in-content/tests/siteData/head.js b/browser/components/preferences/in-content/tests/siteData/head.js new file mode 100644 index 000000000000..e107062cb19b --- /dev/null +++ b/browser/components/preferences/in-content/tests/siteData/head.js @@ -0,0 +1,237 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const TEST_QUOTA_USAGE_HOST = "example.com"; +const TEST_QUOTA_USAGE_ORIGIN = "https://" + TEST_QUOTA_USAGE_HOST; +const TEST_QUOTA_USAGE_URL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", TEST_QUOTA_USAGE_ORIGIN) + "/site_data_test.html"; +const TEST_OFFLINE_HOST = "example.org"; +const TEST_OFFLINE_ORIGIN = "https://" + TEST_OFFLINE_HOST; +const TEST_OFFLINE_URL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", TEST_OFFLINE_ORIGIN) + "/offline/offline.html"; +const TEST_SERVICE_WORKER_URL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", TEST_OFFLINE_ORIGIN) + "/service_worker_test.html"; + +const REMOVE_DIALOG_URL = "chrome://browser/content/preferences/siteDataRemoveSelected.xul"; + +const { DownloadUtils } = ChromeUtils.import("resource://gre/modules/DownloadUtils.jsm", {}); +const { SiteDataManager } = ChromeUtils.import("resource:///modules/SiteDataManager.jsm", {}); +const { OfflineAppCacheHelper } = ChromeUtils.import("resource:///modules/offlineAppCache.jsm", {}); + +XPCOMUtils.defineLazyServiceGetter(this, "serviceWorkerManager", "@mozilla.org/serviceworkers/manager;1", "nsIServiceWorkerManager"); + +function promiseSiteDataManagerSitesUpdated() { + return TestUtils.topicObserved("sitedatamanager:sites-updated", () => true); +} + +function is_hidden(aElement) { + var style = aElement.ownerGlobal.getComputedStyle(aElement); + if (style.display == "none") + return true; + if (style.visibility != "visible") + return true; + + // Hiding a parent element will hide all its children + if (aElement.parentNode != aElement.ownerDocument) + return is_hidden(aElement.parentNode); + + return false; +} + +function is_element_visible(aElement, aMsg) { + isnot(aElement, null, "Element should not be null, when checking visibility"); + ok(!is_hidden(aElement), aMsg); +} + +function is_element_hidden(aElement, aMsg) { + isnot(aElement, null, "Element should not be null, when checking visibility"); + ok(is_hidden(aElement), aMsg); +} + +function promiseLoadSubDialog(aURL) { + return new Promise((resolve, reject) => { + content.gSubDialog._dialogStack.addEventListener("dialogopen", function dialogopen(aEvent) { + if (aEvent.detail.dialog._frame.contentWindow.location == "about:blank") + return; + content.gSubDialog._dialogStack.removeEventListener("dialogopen", dialogopen); + + is(aEvent.detail.dialog._frame.contentWindow.location.toString(), aURL, + "Check the proper URL is loaded"); + + // Check visibility + is_element_visible(aEvent.detail.dialog._overlay, "Overlay is visible"); + + // Check that stylesheets were injected + let expectedStyleSheetURLs = aEvent.detail.dialog._injectedStyleSheets.slice(0); + for (let styleSheet of aEvent.detail.dialog._frame.contentDocument.styleSheets) { + let i = expectedStyleSheetURLs.indexOf(styleSheet.href); + if (i >= 0) { + info("found " + styleSheet.href); + expectedStyleSheetURLs.splice(i, 1); + } + } + is(expectedStyleSheetURLs.length, 0, "All expectedStyleSheetURLs should have been found"); + + // Wait for the next event tick to make sure the remaining part of the + // testcase runs after the dialog gets ready for input. + executeSoon(() => resolve(aEvent.detail.dialog._frame.contentWindow)); + }); + }); +} + +function openPreferencesViaOpenPreferencesAPI(aPane, aOptions) { + return new Promise(resolve => { + let finalPrefPaneLoaded = TestUtils.topicObserved("sync-pane-loaded", () => true); + gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank"); + openPreferences(aPane); + let newTabBrowser = gBrowser.selectedBrowser; + + newTabBrowser.addEventListener("Initialized", function() { + newTabBrowser.contentWindow.addEventListener("load", async function() { + let win = gBrowser.contentWindow; + let selectedPane = win.history.state; + await finalPrefPaneLoaded; + if (!aOptions || !aOptions.leaveOpen) + gBrowser.removeCurrentTab(); + resolve({ selectedPane }); + }, { once: true }); + }, { capture: true, once: true }); + + }); +} + +function openSiteDataSettingsDialog() { + let doc = gBrowser.selectedBrowser.contentDocument; + let settingsBtn = doc.getElementById("siteDataSettings"); + let dialogOverlay = content.gSubDialog._preloadDialog._overlay; + let dialogLoadPromise = promiseLoadSubDialog("chrome://browser/content/preferences/siteDataSettings.xul"); + let dialogInitPromise = TestUtils.topicObserved("sitedata-settings-init", () => true); + let fullyLoadPromise = Promise.all([dialogLoadPromise, dialogInitPromise]).then(() => { + is(dialogOverlay.style.visibility, "visible", "The Settings dialog should be visible"); + }); + settingsBtn.doCommand(); + return fullyLoadPromise; +} + +function assertSitesListed(doc, hosts) { + let frameDoc = content.gSubDialog._topDialog._frame.contentDocument; + let removeBtn = frameDoc.getElementById("removeSelected"); + let removeAllBtn = frameDoc.getElementById("removeAll"); + let sitesList = frameDoc.getElementById("sitesList"); + let totalSitesNumber = sitesList.getElementsByTagName("richlistitem").length; + is(totalSitesNumber, hosts.length, "Should list the right sites number"); + hosts.forEach(host => { + let site = sitesList.querySelector(`richlistitem[host="${host}"]`); + ok(site, `Should list the site of ${host}`); + }); + is(removeBtn.disabled, true, "Should disable the removeSelected button"); + is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button"); +} + +const mockSiteDataManager = { + + _SiteDataManager: null, + _originalQMS: null, + _originalRemoveQuotaUsage: null, + + getUsage(onUsageResult) { + let result = this.fakeSites.map(site => ({ + origin: site.principal.origin, + usage: site.usage, + persisted: site.persisted, + lastAccessed: site.lastAccessed, + })); + onUsageResult({ result, resultCode: Cr.NS_OK }); + }, + + _removeQuotaUsage(site) { + var target = site.principals[0].URI.host; + this.fakeSites = this.fakeSites.filter(fakeSite => { + return fakeSite.principal.URI.host != target; + }); + }, + + register(siteDataManager, fakeSites) { + this._SiteDataManager = siteDataManager; + this._originalQMS = this._SiteDataManager._qms; + this._SiteDataManager._qms = this; + this._originalRemoveQuotaUsage = this._SiteDataManager._removeQuotaUsage; + this._SiteDataManager._removeQuotaUsage = this._removeQuotaUsage.bind(this); + // Add some fake data. + this.fakeSites = fakeSites; + for (let site of fakeSites) { + if (!site.principal) { + site.principal = Services.scriptSecurityManager + .createCodebasePrincipalFromOrigin(site.origin); + } + + let uri = site.principal.URI; + try { + site.baseDomain = Services.eTLD.getBaseDomainFromHost(uri.host); + } catch (e) { + site.baseDomain = uri.host; + } + + // Add some cookies if needed. + for (let i = 0; i < (site.cookies || 0); i++) { + Services.cookies.add(uri.host, uri.pathQueryRef, Cu.now(), i, + false, false, false, Date.now() + 1000 * 60 * 60); + } + } + }, + + async unregister() { + await this._SiteDataManager.removeAll(); + this.fakeSites = null; + this._SiteDataManager._qms = this._originalQMS; + this._SiteDataManager._removeQuotaUsage = this._originalRemoveQuotaUsage; + } +}; + +function getQuotaUsage(origin) { + return new Promise(resolve => { + let uri = NetUtil.newURI(origin); + let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {}); + Services.qms.getUsageForPrincipal(principal, request => resolve(request.result.usage)); + }); +} + +function promiseCookiesCleared() { + return TestUtils.topicObserved("cookie-changed", (subj, data) => { + return data === "cleared"; + }); +} + +async function loadServiceWorkerTestPage(url) { + let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url); + await BrowserTestUtils.waitForCondition(() => { + return ContentTask.spawn(tab.linkedBrowser, {}, () => + content.document.body.getAttribute("data-test-service-worker-registered") === "true"); + }, `Fail to load service worker test ${url}`); + await BrowserTestUtils.removeTab(tab); +} + +function promiseServiceWorkersCleared() { + return BrowserTestUtils.waitForCondition(() => { + let serviceWorkers = serviceWorkerManager.getAllRegistrations(); + if (serviceWorkers.length == 0) { + ok(true, "Cleared all service workers"); + return true; + } + return false; + }, "Should clear all service workers"); +} + +function promiseServiceWorkerRegisteredFor(url) { + return BrowserTestUtils.waitForCondition(() => { + try { + let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(url); + let sw = serviceWorkerManager.getRegistrationByPrincipal(principal, principal.URI.spec); + if (sw) { + ok(true, `Found the service worker registered for ${url}`); + return true; + } + } catch (e) {} + return false; + }, `Should register service worker for ${url}`); +} + diff --git a/browser/components/preferences/in-content/tests/offline/manifest.appcache b/browser/components/preferences/in-content/tests/siteData/offline/manifest.appcache similarity index 100% rename from browser/components/preferences/in-content/tests/offline/manifest.appcache rename to browser/components/preferences/in-content/tests/siteData/offline/manifest.appcache diff --git a/browser/components/preferences/in-content/tests/offline/offline.html b/browser/components/preferences/in-content/tests/siteData/offline/offline.html similarity index 100% rename from browser/components/preferences/in-content/tests/offline/offline.html rename to browser/components/preferences/in-content/tests/siteData/offline/offline.html diff --git a/browser/components/preferences/in-content/tests/service_worker_test.html b/browser/components/preferences/in-content/tests/siteData/service_worker_test.html similarity index 100% rename from browser/components/preferences/in-content/tests/service_worker_test.html rename to browser/components/preferences/in-content/tests/siteData/service_worker_test.html diff --git a/browser/components/preferences/in-content/tests/service_worker_test.js b/browser/components/preferences/in-content/tests/siteData/service_worker_test.js similarity index 100% rename from browser/components/preferences/in-content/tests/service_worker_test.js rename to browser/components/preferences/in-content/tests/siteData/service_worker_test.js diff --git a/browser/components/preferences/in-content/tests/site_data_test.html b/browser/components/preferences/in-content/tests/siteData/site_data_test.html similarity index 100% rename from browser/components/preferences/in-content/tests/site_data_test.html rename to browser/components/preferences/in-content/tests/siteData/site_data_test.html diff --git a/browser/components/preferences/moz.build b/browser/components/preferences/moz.build index 7e1e8b94a39f..4199c6a1404b 100644 --- a/browser/components/preferences/moz.build +++ b/browser/components/preferences/moz.build @@ -9,7 +9,8 @@ DIRS += [ ] BROWSER_CHROME_MANIFESTS += [ - 'in-content/tests/browser.ini' + 'in-content/tests/browser.ini', + 'in-content/tests/siteData/browser.ini' ] for var in ('MOZ_APP_NAME', 'MOZ_MACBUNDLE_NAME'):