--- a/browser/components/preferences/in-content/tests/browser.ini
+++ b/browser/components/preferences/in-content/tests/browser.ini
@@ -2,17 +2,16 @@
support-files =
head.js
privacypane_tests_perwindow.js
site_data_test.html
offline/offline.html
offline/manifest.appcache
[browser_applications_selection.js]
-[browser_advanced_siteData.js]
[browser_advanced_update.js]
skip-if = !updater
[browser_basic_rebuild_fonts_test.js]
[browser_bug410900.js]
[browser_bug705422.js]
[browser_bug731866.js]
[browser_bug795764_cachedisabled.js]
[browser_bug1018066_resetScrollPosition.js]
@@ -39,16 +38,18 @@ skip-if = e10s
[browser_privacypane_1.js]
[browser_privacypane_3.js]
[browser_privacypane_4.js]
[browser_privacypane_5.js]
[browser_privacypane_8.js]
[browser_sanitizeOnShutdown_prefLocked.js]
[browser_searchsuggestions.js]
[browser_security.js]
+[browser_siteData.js]
+[browser_siteData2.js]
[browser_site_login_exceptions.js]
[browser_subdialogs.js]
support-files =
subdialog.xul
subdialog2.xul
[browser_telemetry.js]
# Skip this test on Android as FHR and Telemetry are separate systems there.
skip-if = !healthreport || !telemetry || (os == 'linux' && debug) || (os == 'android')
rename from browser/components/preferences/in-content/tests/browser_advanced_siteData.js
rename to browser/components/preferences/in-content/tests/browser_siteData.js
--- a/browser/components/preferences/in-content/tests/browser_advanced_siteData.js
+++ b/browser/components/preferences/in-content/tests/browser_siteData.js
@@ -10,21 +10,18 @@ Cu.import("resource://gre/modules/XPCOMU
Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js");
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 REMOVE_DIALOG_URL = "chrome://browser/content/preferences/siteDataRemoveSelected.xul";
-
const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm", {});
const { DownloadUtils } = Cu.import("resource://gre/modules/DownloadUtils.jsm", {});
-const { SiteDataManager } = Cu.import("resource:///modules/SiteDataManager.jsm", {});
const { OfflineAppCacheHelper } = Cu.import("resource:///modules/offlineAppCache.jsm", {});
const mockOfflineAppCacheHelper = {
clear: null,
originalClear: null,
register() {
@@ -33,55 +30,16 @@ const mockOfflineAppCacheHelper = {
OfflineAppCacheHelper.clear = this.clear;
},
unregister() {
OfflineAppCacheHelper.clear = this.originalClear;
}
};
-const mockSiteDataManager = {
-
- _originalGetQuotaUsage: null,
- _originalRemoveQuotaUsage: null,
-
- _getQuotaUsage() {
- let results = [];
- this.fakeSites.forEach(site => {
- results.push({
- origin: site.principal.origin,
- usage: site.usage,
- persisted: site.persisted
- });
- });
- SiteDataManager._getQuotaUsagePromise = Promise.resolve(results);
- return SiteDataManager._getQuotaUsagePromise;
- },
-
- _removeQuotaUsage(site) {
- var target = site.principals[0].URI.host;
- this.fakeSites = this.fakeSites.filter(fakeSite => {
- return fakeSite.principal.URI.host != target;
- });
- },
-
- register() {
- this._originalGetQuotaUsage = SiteDataManager._getQuotaUsage;
- SiteDataManager._getQuotaUsage = this._getQuotaUsage.bind(this);
- this._originalRemoveQuotaUsage = SiteDataManager._removeQuotaUsage;
- SiteDataManager._removeQuotaUsage = this._removeQuotaUsage.bind(this);
- this.fakeSites = null;
- },
-
- unregister() {
- SiteDataManager._getQuotaUsage = this._originalGetQuotaUsage;
- SiteDataManager._removeQuotaUsage = this._originalRemoveQuotaUsage;
- }
-};
-
function addPersistentStoragePerm(origin) {
let uri = NetUtil.newURI(origin);
let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
Services.perms.addFromPrincipal(principal, "persistent-storage", Ci.nsIPermissionManager.ALLOW_ACTION);
}
function getPersistentStoragePermStatus(origin) {
let uri = NetUtil.newURI(origin);
@@ -121,70 +79,22 @@ const cacheUsageGetter = {
cacheUsageGetter._resolve(usage);
},
QueryInterface: XPCOMUtils.generateQI([
Components.interfaces.nsICacheStorageConsumptionObserver,
Components.interfaces.nsISupportsWeakReference
]),
};
-function openSettingsDialog() {
- let win = gBrowser.selectedBrowser.contentWindow;
- let doc = gBrowser.selectedBrowser.contentDocument;
- let settingsBtn = doc.getElementById("siteDataSettings");
- let dialogOverlay = win.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 promiseSettingsDialogClose() {
- return new Promise(resolve => {
- let win = gBrowser.selectedBrowser.contentWindow;
- let dialogOverlay = win.gSubDialog._topDialog._overlay;
- let dialogWin = win.gSubDialog._topDialog._frame.contentWindow;
- dialogWin.addEventListener("unload", function unload() {
- if (dialogWin.document.documentURI === "chrome://browser/content/preferences/siteDataSettings.xul") {
- isnot(dialogOverlay.style.visibility, "visible", "The Settings dialog should be hidden");
- resolve();
- }
- }, { once: true });
- });
-}
-
-function promiseSitesUpdated() {
- return TestUtils.topicObserved("sitedatamanager:sites-updated", () => true);
-}
-
function promiseCookiesCleared() {
return TestUtils.topicObserved("cookie-changed", (subj, data) => {
return data === "cleared";
});
}
-function assertSitesListed(doc, hosts) {
- let win = gBrowser.selectedBrowser.contentWindow;
- let frameDoc = win.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, false, "Should enable the removeSelected button");
- is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
-}
-
registerCleanupFunction(function() {
delete window.sinon;
mockOfflineAppCacheHelper.unregister();
});
// 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]]});
@@ -571,306 +481,8 @@ add_task(async function() {
searchBox.value = "";
searchBox.doCommand();
assertSitesListed(doc, fakeHosts);
mockSiteDataManager.unregister();
await BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
-
-// Test selecting and removing all sites one by one
-add_task(async function() {
- await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
- mockSiteDataManager.register();
- mockSiteDataManager.fakeSites = [
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://account.xyz.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://shopping.xyz.com"),
- persisted: false
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("http://cinema.bar.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("http://email.bar.com"),
- persisted: false
- },
- ];
- let fakeHosts = mockSiteDataManager.fakeSites.map(site => site.principal.URI.host);
-
- let updatePromise = promiseSitesUpdated();
- await openPreferencesViaOpenPreferencesAPI("advanced", "networkTab", { leaveOpen: true });
- await updatePromise;
- await openSettingsDialog();
-
- let win = gBrowser.selectedBrowser.contentWindow;
- let doc = gBrowser.selectedBrowser.contentDocument;
- let frameDoc = null;
- let saveBtn = null;
- let cancelBtn = null;
- let settingsDialogClosePromise = null;
-
- // Test the initial state
- assertSitesListed(doc, fakeHosts);
-
- // Test the "Cancel" button
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- cancelBtn = frameDoc.getElementById("cancel");
- removeAllSitesOneByOne();
- assertAllSitesNotListed();
- cancelBtn.doCommand();
- await settingsDialogClosePromise;
- await openSettingsDialog();
- assertSitesListed(doc, fakeHosts);
-
- // Test the "Save Changes" button but cancelling save
- let cancelPromise = promiseAlertDialogOpen("cancel");
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeAllSitesOneByOne();
- assertAllSitesNotListed();
- saveBtn.doCommand();
- await cancelPromise;
- await settingsDialogClosePromise;
- await openSettingsDialog();
- assertSitesListed(doc, fakeHosts);
-
- // Test the "Save Changes" button and accepting save
- let acceptPromise = promiseAlertDialogOpen("accept");
- settingsDialogClosePromise = promiseSettingsDialogClose();
- updatePromise = promiseSitesUpdated();
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeAllSitesOneByOne();
- assertAllSitesNotListed();
- saveBtn.doCommand();
- await acceptPromise;
- await settingsDialogClosePromise;
- await updatePromise;
- await openSettingsDialog();
- assertAllSitesNotListed();
-
- mockSiteDataManager.unregister();
- await BrowserTestUtils.removeTab(gBrowser.selectedTab);
-
- function removeAllSitesOneByOne() {
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- let removeBtn = frameDoc.getElementById("removeSelected");
- let sitesList = frameDoc.getElementById("sitesList");
- let sites = sitesList.getElementsByTagName("richlistitem");
- for (let i = sites.length - 1; i >= 0; --i) {
- sites[i].click();
- removeBtn.doCommand();
- }
- }
-
- function assertAllSitesNotListed() {
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- let removeBtn = frameDoc.getElementById("removeSelected");
- let removeAllBtn = frameDoc.getElementById("removeAll");
- let sitesList = frameDoc.getElementById("sitesList");
- let sites = sitesList.getElementsByTagName("richlistitem");
- is(sites.length, 0, "Should not list all sites");
- is(removeBtn.disabled, true, "Should disable the removeSelected button");
- is(removeAllBtn.disabled, true, "Should disable the removeAllBtn button");
- }
-});
-
-// Test selecting and removing partial sites
-add_task(async function() {
- await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
- mockSiteDataManager.register();
- mockSiteDataManager.fakeSites = [
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://account.xyz.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://shopping.xyz.com"),
- persisted: false
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("http://cinema.bar.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("http://email.bar.com"),
- persisted: false
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://s3-us-west-2.amazonaws.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://127.0.0.1"),
- persisted: false
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://[0:0:0:0:0:0:0:1]"),
- persisted: true
- },
- ];
- let fakeHosts = mockSiteDataManager.fakeSites.map(site => site.principal.URI.host);
-
- let updatePromise = promiseSitesUpdated();
- await openPreferencesViaOpenPreferencesAPI("advanced", "networkTab", { leaveOpen: true });
- await updatePromise;
- await openSettingsDialog();
-
- let win = gBrowser.selectedBrowser.contentWindow;
- let doc = gBrowser.selectedBrowser.contentDocument;
- let frameDoc = null;
- let saveBtn = null;
- let cancelBtn = null;
- let removeDialogOpenPromise = null;
- let settingsDialogClosePromise = null;
-
- // Test the initial state
- assertSitesListed(doc, fakeHosts);
-
- // Test the "Cancel" button
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- cancelBtn = frameDoc.getElementById("cancel");
- removeSelectedSite(fakeHosts.slice(0, 2));
- assertSitesListed(doc, fakeHosts.slice(2));
- cancelBtn.doCommand();
- await settingsDialogClosePromise;
- await openSettingsDialog();
- assertSitesListed(doc, fakeHosts);
-
- // Test the "Save Changes" button but canceling save
- removeDialogOpenPromise = promiseWindowDialogOpen("cancel", REMOVE_DIALOG_URL);
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeSelectedSite(fakeHosts.slice(0, 2));
- assertSitesListed(doc, fakeHosts.slice(2));
- saveBtn.doCommand();
- await removeDialogOpenPromise;
- await settingsDialogClosePromise;
- await openSettingsDialog();
- assertSitesListed(doc, fakeHosts);
-
- // Test the "Save Changes" button and accepting save
- removeDialogOpenPromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeSelectedSite(fakeHosts.slice(0, 2));
- assertSitesListed(doc, fakeHosts.slice(2));
- saveBtn.doCommand();
- await removeDialogOpenPromise;
- await settingsDialogClosePromise;
- await openSettingsDialog();
- assertSitesListed(doc, fakeHosts.slice(2));
-
- mockSiteDataManager.unregister();
- await BrowserTestUtils.removeTab(gBrowser.selectedTab);
-
- function removeSelectedSite(hosts) {
- frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- let removeBtn = frameDoc.getElementById("removeSelected");
- let sitesList = frameDoc.getElementById("sitesList");
- hosts.forEach(host => {
- let site = sitesList.querySelector(`richlistitem[host="${host}"]`);
- if (site) {
- site.click();
- removeBtn.doCommand();
- } else {
- ok(false, `Should not select and remove inexistent site of ${host}`);
- }
- });
- }
-});
-
-// Test searching and then removing only visible sites
-add_task(async function() {
- await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
- mockSiteDataManager.register(SiteDataManager);
- mockSiteDataManager.fakeSites = [
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://account.xyz.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("https://shopping.xyz.com"),
- persisted: false
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("http://cinema.bar.com"),
- persisted: true
- },
- {
- usage: 1024,
- principal: Services.scriptSecurityManager
- .createCodebasePrincipalFromOrigin("http://email.bar.com"),
- persisted: false
- },
- ];
- let fakeHosts = mockSiteDataManager.fakeSites.map(site => site.principal.URI.host);
-
- let updatePromise = promiseSitesUpdated();
- await openPreferencesViaOpenPreferencesAPI("advanced", "networkTab", { leaveOpen: true });
- await updatePromise;
- await openSettingsDialog();
-
- // Search "foo" to only list foo.com sites
- let win = gBrowser.selectedBrowser.contentWindow;
- let doc = gBrowser.selectedBrowser.contentDocument;
- let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
- let searchBox = frameDoc.getElementById("searchBox");
- searchBox.value = "xyz";
- searchBox.doCommand();
- assertSitesListed(doc, fakeHosts.filter(host => host.includes("xyz")));
-
- // Test only removing all visible sites listed
- updatePromise = promiseSitesUpdated();
- let acceptRemovePromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
- let settingsDialogClosePromise = promiseSettingsDialogClose();
- let removeAllBtn = frameDoc.getElementById("removeAll");
- let saveBtn = frameDoc.getElementById("save");
- removeAllBtn.doCommand();
- saveBtn.doCommand();
- await acceptRemovePromise;
- await settingsDialogClosePromise;
- await updatePromise;
- await openSettingsDialog();
- assertSitesListed(doc, fakeHosts.filter(host => !host.includes("xyz")));
-
- mockSiteDataManager.unregister();
- await BrowserTestUtils.removeTab(gBrowser.selectedTab);
-});
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_siteData2.js
@@ -0,0 +1,299 @@
+"use strict";
+
+// Test selecting and removing all sites one by one
+add_task(async function() {
+ await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
+ mockSiteDataManager.register();
+ mockSiteDataManager.fakeSites = [
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://account.xyz.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://shopping.xyz.com"),
+ persisted: false
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://cinema.bar.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://email.bar.com"),
+ persisted: false
+ },
+ ];
+ let fakeHosts = mockSiteDataManager.fakeSites.map(site => site.principal.URI.host);
+
+ let updatePromise = promiseSitesUpdated();
+ await openPreferencesViaOpenPreferencesAPI("advanced", "networkTab", { leaveOpen: true });
+ await updatePromise;
+ await openSettingsDialog();
+
+ let win = gBrowser.selectedBrowser.contentWindow;
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let frameDoc = null;
+ let saveBtn = null;
+ let cancelBtn = null;
+ let settingsDialogClosePromise = null;
+
+ // Test the initial state
+ assertSitesListed(doc, fakeHosts);
+
+ // Test the "Cancel" button
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ cancelBtn = frameDoc.getElementById("cancel");
+ removeAllSitesOneByOne();
+ assertAllSitesNotListed();
+ cancelBtn.doCommand();
+ await settingsDialogClosePromise;
+ await openSettingsDialog();
+ assertSitesListed(doc, fakeHosts);
+
+ // Test the "Save Changes" button but cancelling save
+ let cancelPromise = promiseAlertDialogOpen("cancel");
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeAllSitesOneByOne();
+ assertAllSitesNotListed();
+ saveBtn.doCommand();
+ await cancelPromise;
+ await settingsDialogClosePromise;
+ await openSettingsDialog();
+ assertSitesListed(doc, fakeHosts);
+
+ // Test the "Save Changes" button and accepting save
+ let acceptPromise = promiseAlertDialogOpen("accept");
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ updatePromise = promiseSitesUpdated();
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeAllSitesOneByOne();
+ assertAllSitesNotListed();
+ saveBtn.doCommand();
+ await acceptPromise;
+ await settingsDialogClosePromise;
+ await updatePromise;
+ await openSettingsDialog();
+ assertAllSitesNotListed();
+
+ mockSiteDataManager.unregister();
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+
+ function removeAllSitesOneByOne() {
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ let removeBtn = frameDoc.getElementById("removeSelected");
+ let sitesList = frameDoc.getElementById("sitesList");
+ let sites = sitesList.getElementsByTagName("richlistitem");
+ for (let i = sites.length - 1; i >= 0; --i) {
+ sites[i].click();
+ removeBtn.doCommand();
+ }
+ }
+
+ function assertAllSitesNotListed() {
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ let removeBtn = frameDoc.getElementById("removeSelected");
+ let removeAllBtn = frameDoc.getElementById("removeAll");
+ let sitesList = frameDoc.getElementById("sitesList");
+ let sites = sitesList.getElementsByTagName("richlistitem");
+ is(sites.length, 0, "Should not list all sites");
+ is(removeBtn.disabled, true, "Should disable the removeSelected button");
+ is(removeAllBtn.disabled, true, "Should disable the removeAllBtn button");
+ }
+});
+
+// Test selecting and removing partial sites
+add_task(async function() {
+ await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
+ mockSiteDataManager.register();
+ mockSiteDataManager.fakeSites = [
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://account.xyz.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://shopping.xyz.com"),
+ persisted: false
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://cinema.bar.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://email.bar.com"),
+ persisted: false
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://s3-us-west-2.amazonaws.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://127.0.0.1"),
+ persisted: false
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://[0:0:0:0:0:0:0:1]"),
+ persisted: true
+ },
+ ];
+ let fakeHosts = mockSiteDataManager.fakeSites.map(site => site.principal.URI.host);
+
+ let updatePromise = promiseSitesUpdated();
+ await openPreferencesViaOpenPreferencesAPI("advanced", "networkTab", { leaveOpen: true });
+ await updatePromise;
+ await openSettingsDialog();
+
+ let win = gBrowser.selectedBrowser.contentWindow;
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let frameDoc = null;
+ let saveBtn = null;
+ let cancelBtn = null;
+ let removeDialogOpenPromise = null;
+ let settingsDialogClosePromise = null;
+
+ // Test the initial state
+ assertSitesListed(doc, fakeHosts);
+
+ // Test the "Cancel" button
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ cancelBtn = frameDoc.getElementById("cancel");
+ removeSelectedSite(fakeHosts.slice(0, 2));
+ assertSitesListed(doc, fakeHosts.slice(2));
+ cancelBtn.doCommand();
+ await settingsDialogClosePromise;
+ await openSettingsDialog();
+ assertSitesListed(doc, fakeHosts);
+
+ // Test the "Save Changes" button but canceling save
+ removeDialogOpenPromise = promiseWindowDialogOpen("cancel", REMOVE_DIALOG_URL);
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeSelectedSite(fakeHosts.slice(0, 2));
+ assertSitesListed(doc, fakeHosts.slice(2));
+ saveBtn.doCommand();
+ await removeDialogOpenPromise;
+ await settingsDialogClosePromise;
+ await openSettingsDialog();
+ assertSitesListed(doc, fakeHosts);
+
+ // Test the "Save Changes" button and accepting save
+ removeDialogOpenPromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeSelectedSite(fakeHosts.slice(0, 2));
+ assertSitesListed(doc, fakeHosts.slice(2));
+ saveBtn.doCommand();
+ await removeDialogOpenPromise;
+ await settingsDialogClosePromise;
+ await openSettingsDialog();
+ assertSitesListed(doc, fakeHosts.slice(2));
+
+ mockSiteDataManager.unregister();
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+
+ function removeSelectedSite(hosts) {
+ frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ let removeBtn = frameDoc.getElementById("removeSelected");
+ let sitesList = frameDoc.getElementById("sitesList");
+ hosts.forEach(host => {
+ let site = sitesList.querySelector(`richlistitem[host="${host}"]`);
+ if (site) {
+ site.click();
+ removeBtn.doCommand();
+ } else {
+ ok(false, `Should not select and remove inexistent site of ${host}`);
+ }
+ });
+ }
+});
+
+// Test searching and then removing only visible sites
+add_task(async function() {
+ await SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
+ mockSiteDataManager.register(SiteDataManager);
+ mockSiteDataManager.fakeSites = [
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://account.xyz.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("https://shopping.xyz.com"),
+ persisted: false
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://cinema.bar.com"),
+ persisted: true
+ },
+ {
+ usage: 1024,
+ principal: Services.scriptSecurityManager
+ .createCodebasePrincipalFromOrigin("http://email.bar.com"),
+ persisted: false
+ },
+ ];
+ let fakeHosts = mockSiteDataManager.fakeSites.map(site => site.principal.URI.host);
+
+ let updatePromise = promiseSitesUpdated();
+ await openPreferencesViaOpenPreferencesAPI("advanced", "networkTab", { leaveOpen: true });
+ await updatePromise;
+ await openSettingsDialog();
+
+ // Search "foo" to only list foo.com sites
+ let win = gBrowser.selectedBrowser.contentWindow;
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
+ let searchBox = frameDoc.getElementById("searchBox");
+ searchBox.value = "xyz";
+ searchBox.doCommand();
+ assertSitesListed(doc, fakeHosts.filter(host => host.includes("xyz")));
+
+ // Test only removing all visible sites listed
+ updatePromise = promiseSitesUpdated();
+ let acceptRemovePromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
+ let settingsDialogClosePromise = promiseSettingsDialogClose();
+ let removeAllBtn = frameDoc.getElementById("removeAll");
+ let saveBtn = frameDoc.getElementById("save");
+ removeAllBtn.doCommand();
+ saveBtn.doCommand();
+ await acceptRemovePromise;
+ await settingsDialogClosePromise;
+ await updatePromise;
+ await openSettingsDialog();
+ assertSitesListed(doc, fakeHosts.filter(host => !host.includes("xyz")));
+
+ mockSiteDataManager.unregister();
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
--- a/browser/components/preferences/in-content/tests/head.js
+++ b/browser/components/preferences/in-content/tests/head.js
@@ -8,16 +8,56 @@ Components.utils.import("resource://gre/
// Thus, all of these tests should revert back to the "oldOrganization"
// before running.
Services.prefs.setBoolPref("browser.preferences.useOldOrganization", true);
registerCleanupFunction(function() {
Services.prefs.clearUserPref("browser.preferences.useOldOrganization");
});
const kDefaultWait = 2000;
+const REMOVE_DIALOG_URL = "chrome://browser/content/preferences/siteDataRemoveSelected.xul";
+const { SiteDataManager } = Cu.import("resource:///modules/SiteDataManager.jsm", {});
+const mockSiteDataManager = {
+
+ _originalGetQuotaUsage: null,
+ _originalRemoveQuotaUsage: null,
+
+ _getQuotaUsage() {
+ let results = [];
+ this.fakeSites.forEach(site => {
+ results.push({
+ origin: site.principal.origin,
+ usage: site.usage,
+ persisted: site.persisted
+ });
+ });
+ SiteDataManager._getQuotaUsagePromise = Promise.resolve(results);
+ return SiteDataManager._getQuotaUsagePromise;
+ },
+
+ _removeQuotaUsage(site) {
+ var target = site.principals[0].URI.host;
+ this.fakeSites = this.fakeSites.filter(fakeSite => {
+ return fakeSite.principal.URI.host != target;
+ });
+ },
+
+ register() {
+ this._originalGetQuotaUsage = SiteDataManager._getQuotaUsage;
+ SiteDataManager._getQuotaUsage = this._getQuotaUsage.bind(this);
+ this._originalRemoveQuotaUsage = SiteDataManager._removeQuotaUsage;
+ SiteDataManager._removeQuotaUsage = this._removeQuotaUsage.bind(this);
+ this.fakeSites = null;
+ },
+
+ unregister() {
+ SiteDataManager._getQuotaUsage = this._originalGetQuotaUsage;
+ SiteDataManager._removeQuotaUsage = this._originalRemoveQuotaUsage;
+ }
+};
function is_hidden(aElement) {
var style = aElement.ownerGlobal.getComputedStyle(aElement);
if (style.display == "none")
return true;
if (style.visibility != "visible")
return true;
@@ -185,8 +225,56 @@ function promiseWindowDialogOpen(buttonA
}
});
});
}
function promiseAlertDialogOpen(buttonAction) {
return promiseWindowDialogOpen(buttonAction, "chrome://global/content/commonDialog.xul");
}
+
+function openSettingsDialog() {
+ let win = gBrowser.selectedBrowser.contentWindow;
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let settingsBtn = doc.getElementById("siteDataSettings");
+ let dialogOverlay = win.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 win = gBrowser.selectedBrowser.contentWindow;
+ let frameDoc = win.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, false, "Should enable the removeSelected button");
+ is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
+}
+
+function promiseSitesUpdated() {
+ return TestUtils.topicObserved("sitedatamanager:sites-updated", () => true);
+}
+
+function promiseSettingsDialogClose() {
+ return new Promise(resolve => {
+ let win = gBrowser.selectedBrowser.contentWindow;
+ let dialogOverlay = win.gSubDialog._topDialog._overlay;
+ let dialogWin = win.gSubDialog._topDialog._frame.contentWindow;
+ dialogWin.addEventListener("unload", function unload() {
+ if (dialogWin.document.documentURI === "chrome://browser/content/preferences/siteDataSettings.xul") {
+ isnot(dialogOverlay.style.visibility, "visible", "The Settings dialog should be hidden");
+ resolve();
+ }
+ }, { once: true });
+ });
+}