Bug 1349051 - Split browser_advanced_siteData.js to browser_siteData.js and browser_siteData2.js since it was running too long. r?fischer
MozReview-Commit-ID: 8f3rSSdYNCx
--- a/browser/components/preferences/in-content/tests/browser.ini
+++ b/browser/components/preferences/in-content/tests/browser.ini
@@ -1,16 +1,15 @@
[DEFAULT]
support-files =
head.js
privacypane_tests_perwindow.js
site_data_test.html
[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]
@@ -33,15 +32,17 @@ skip-if = true || !healthreport # Bug 11
[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_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
@@ -105,28 +105,16 @@ const mockSiteDataManager = {
SiteDataManager.getSites = this.getSites.bind(this);
},
unregister() {
SiteDataManager.getSites = this._originalGetSites;
}
};
-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 removePersistentStoragePerm(origin) {
- let uri = NetUtil.newURI(origin);
- let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
- Services.perms.removeFromPrincipal(principal, "persistent-storage");
-}
-
function getPersistentStoragePermStatus(origin) {
let uri = NetUtil.newURI(origin);
let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
return Services.perms.testExactPermissionFromPrincipal(principal, "persistent-storage");
}
function getQuotaUsage(origin) {
return new Promise(resolve => {
@@ -160,69 +148,22 @@ const cacheUsageGetter = {
cacheUsageGetter._resolve(usage);
},
QueryInterface: XPCOMUtils.generateQI([
Components.interfaces.nsICacheStorageConsumptionObserver,
Components.interfaces.nsISupportsWeakReference
]),
};
-function openSettingsDialog() {
- let doc = gBrowser.selectedBrowser.contentDocument;
- let settingsBtn = doc.getElementById("siteDataSettings");
- let dialogOverlay = doc.getElementById("dialogOverlay");
- 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 doc = gBrowser.selectedBrowser.contentDocument;
- let dialogOverlay = doc.getElementById("dialogOverlay");
- let win = content.gSubDialog._frame.contentWindow;
- win.addEventListener("unload", function unload() {
- if (win.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, origins) {
- let frameDoc = doc.getElementById("dialogFrame").contentDocument;
- let removeBtn = frameDoc.getElementById("removeSelected");
- let removeAllBtn = frameDoc.getElementById("removeAll");
- let sitesList = frameDoc.getElementById("sitesList");
- let totalSitesNumber = sitesList.getElementsByTagName("richlistitem").length;
- is(totalSitesNumber, origins.length, "Should list the right sites number");
- origins.forEach(origin => {
- let site = sitesList.querySelector(`richlistitem[data-origin="${origin}"]`);
- let host = site.getAttribute("host");
- ok(origin.includes(host), `Should list the site of ${origin}`);
- });
- is(removeBtn.disabled, false, "Should enable the removeSelected button");
- is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
-}
-
registerCleanupFunction(function() {
delete window.sinon;
delete window.setImmediate;
delete window.clearImmediate;
mockOfflineAppCacheHelper.unregister();
});
add_task(function* () {
@@ -261,17 +202,17 @@ add_task(function* () {
Assert.greater(cacheUsage, 0, "The cache usage should not be 0");
Assert.greater(quotaUsage, 0, "The quota usage should not be 0");
Assert.greater(totalUsage, 0, "The total usage should not be 0");
// Test cancelling "Clear All Data" ends
// Test accepting "Clear All Data"
// Click "Clear All Data" button and then accept
let acceptPromise = promiseAlertDialogOpen("accept");
- let updatePromise = promiseSitesUpdated();
+ let updatePromise = promiseSiteDataManagerSitesUpdated();
let cookiesClearedPromise = promiseCookiesCleared();
mockOfflineAppCacheHelper.register();
clearBtn.doCommand();
yield acceptPromise;
yield updatePromise;
mockOfflineAppCacheHelper.unregister();
@@ -293,20 +234,20 @@ add_task(function* () {
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
add_task(function* () {
yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
mockSiteDataManager.register();
- let updatePromise = promiseSitesUpdated();
+ let updatePromise = promiseSiteDataManagerSitesUpdated();
yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
yield updatePromise;
- yield openSettingsDialog();
+ yield openSiteDataSettingsDialog();
let doc = gBrowser.selectedBrowser.contentDocument;
let dialogFrame = doc.getElementById("dialogFrame");
let frameDoc = dialogFrame.contentDocument;
let hostCol = frameDoc.getElementById("hostCol");
let usageCol = frameDoc.getElementById("usageCol");
let statusCol = frameDoc.getElementById("statusCol");
let sitesList = frameDoc.getElementById("sitesList");
@@ -384,20 +325,20 @@ add_task(function* () {
}
}
});
add_task(function* () {
yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
mockSiteDataManager.register();
- let updatePromise = promiseSitesUpdated();
+ let updatePromise = promiseSiteDataManagerSitesUpdated();
yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
yield updatePromise;
- yield openSettingsDialog();
+ yield openSiteDataSettingsDialog();
let doc = gBrowser.selectedBrowser.contentDocument;
let frameDoc = doc.getElementById("dialogFrame").contentDocument;
let searchBox = frameDoc.getElementById("searchBox");
let mockOrigins = Array.from(mockSiteDataManager.sites.keys());
searchBox.value = "xyz";
searchBox.doCommand();
@@ -409,241 +350,8 @@ add_task(function* () {
searchBox.value = "";
searchBox.doCommand();
assertSitesListed(doc, mockOrigins);
mockSiteDataManager.unregister();
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
-
-// Test selecting and removing all sites one by one
-add_task(function* () {
- yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
- let fakeOrigins = [
- "https://news.foo.com/",
- "https://mails.bar.com/",
- "https://videos.xyz.com/",
- "https://books.foo.com/",
- "https://account.bar.com/",
- "https://shopping.xyz.com/"
- ];
- fakeOrigins.forEach(origin => addPersistentStoragePerm(origin));
-
- let updatePromise = promiseSitesUpdated();
- yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
- yield updatePromise;
- yield openSettingsDialog();
-
- let doc = gBrowser.selectedBrowser.contentDocument;
- let frameDoc = null;
- let saveBtn = null;
- let cancelBtn = null;
- let settingsDialogClosePromise = null;
-
- // Test the initial state
- assertAllSitesListed();
-
- // Test the "Cancel" button
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- cancelBtn = frameDoc.getElementById("cancel");
- removeAllSitesOneByOne();
- assertAllSitesNotListed();
- cancelBtn.doCommand();
- yield settingsDialogClosePromise;
- yield openSettingsDialog();
- assertAllSitesListed();
-
- // Test the "Save Changes" button but cancelling save
- let cancelPromise = promiseAlertDialogOpen("cancel");
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeAllSitesOneByOne();
- assertAllSitesNotListed();
- saveBtn.doCommand();
- yield cancelPromise;
- yield settingsDialogClosePromise;
- yield openSettingsDialog();
- assertAllSitesListed();
-
- // Test the "Save Changes" button and accepting save
- let acceptPromise = promiseAlertDialogOpen("accept");
- settingsDialogClosePromise = promiseSettingsDialogClose();
- updatePromise = promiseSitesUpdated();
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeAllSitesOneByOne();
- assertAllSitesNotListed();
- saveBtn.doCommand();
- yield acceptPromise;
- yield settingsDialogClosePromise;
- yield updatePromise;
- yield openSettingsDialog();
- assertAllSitesNotListed();
-
- // Always clean up the fake origins
- fakeOrigins.forEach(origin => removePersistentStoragePerm(origin));
- yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
-
- function removeAllSitesOneByOne() {
- frameDoc = doc.getElementById("dialogFrame").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 assertAllSitesListed() {
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- let removeBtn = frameDoc.getElementById("removeSelected");
- let removeAllBtn = frameDoc.getElementById("removeAll");
- let sitesList = frameDoc.getElementById("sitesList");
- let sites = sitesList.getElementsByTagName("richlistitem");
- is(sites.length, fakeOrigins.length, "Should list all sites");
- is(removeBtn.disabled, false, "Should enable the removeSelected button");
- is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
- }
-
- function assertAllSitesNotListed() {
- frameDoc = doc.getElementById("dialogFrame").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(function* () {
- yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
- let fakeOrigins = [
- "https://news.foo.com/",
- "https://mails.bar.com/",
- "https://videos.xyz.com/",
- "https://books.foo.com/",
- "https://account.bar.com/",
- "https://shopping.xyz.com/"
- ];
- fakeOrigins.forEach(origin => addPersistentStoragePerm(origin));
-
- let updatePromise = promiseSitesUpdated();
- yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
- yield updatePromise;
- yield openSettingsDialog();
-
- 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, fakeOrigins);
-
- // Test the "Cancel" button
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- cancelBtn = frameDoc.getElementById("cancel");
- removeSelectedSite(fakeOrigins.slice(0, 4));
- assertSitesListed(doc, fakeOrigins.slice(4));
- cancelBtn.doCommand();
- yield settingsDialogClosePromise;
- yield openSettingsDialog();
- assertSitesListed(doc, fakeOrigins);
-
- // Test the "Save Changes" button but canceling save
- removeDialogOpenPromise = promiseWindowDialogOpen("cancel", REMOVE_DIALOG_URL);
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeSelectedSite(fakeOrigins.slice(0, 4));
- assertSitesListed(doc, fakeOrigins.slice(4));
- saveBtn.doCommand();
- yield removeDialogOpenPromise;
- yield settingsDialogClosePromise;
- yield openSettingsDialog();
- assertSitesListed(doc, fakeOrigins);
-
- // Test the "Save Changes" button and accepting save
- removeDialogOpenPromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
- settingsDialogClosePromise = promiseSettingsDialogClose();
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- saveBtn = frameDoc.getElementById("save");
- removeSelectedSite(fakeOrigins.slice(0, 4));
- assertSitesListed(doc, fakeOrigins.slice(4));
- saveBtn.doCommand();
- yield removeDialogOpenPromise;
- yield settingsDialogClosePromise;
- yield openSettingsDialog();
- assertSitesListed(doc, fakeOrigins.slice(4));
-
- // Always clean up the fake origins
- fakeOrigins.forEach(origin => removePersistentStoragePerm(origin));
- yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
-
- function removeSelectedSite(origins) {
- frameDoc = doc.getElementById("dialogFrame").contentDocument;
- let removeBtn = frameDoc.getElementById("removeSelected");
- let sitesList = frameDoc.getElementById("sitesList");
- origins.forEach(origin => {
- let site = sitesList.querySelector(`richlistitem[data-origin="${origin}"]`);
- if (site) {
- site.click();
- removeBtn.doCommand();
- } else {
- ok(false, `Should not select and remove inexisted site of ${origin}`);
- }
- });
- }
-});
-
-add_task(function* () {
- yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
- let fakeOrigins = [
- "https://news.foo.com/",
- "https://books.foo.com/",
- "https://mails.bar.com/",
- "https://account.bar.com/",
- "https://videos.xyz.com/",
- "https://shopping.xyz.com/"
- ];
- fakeOrigins.forEach(origin => addPersistentStoragePerm(origin));
-
- let updatePromise = promiseSitesUpdated();
- yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
- yield updatePromise;
- yield openSettingsDialog();
-
- // Search "foo" to only list foo.com sites
- let doc = gBrowser.selectedBrowser.contentDocument;
- let frameDoc = doc.getElementById("dialogFrame").contentDocument;
- let searchBox = frameDoc.getElementById("searchBox");
- searchBox.value = "foo";
- searchBox.doCommand();
- assertSitesListed(doc, fakeOrigins.slice(0, 2));
-
- // 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();
- yield acceptRemovePromise;
- yield settingsDialogClosePromise;
- yield updatePromise;
- yield openSettingsDialog();
- assertSitesListed(doc, fakeOrigins.slice(2));
-
- // Always clean up the fake origins
- fakeOrigins.forEach(origin => removePersistentStoragePerm(origin));
- yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
-});
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_siteData2.js
@@ -0,0 +1,256 @@
+"use strict";
+
+const REMOVE_DIALOG_URL = "chrome://browser/content/preferences/siteDataRemoveSelected.xul";
+
+// Test selecting and removing all sites one by one
+add_task(function* () {
+ yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
+ let fakeOrigins = [
+ "https://news.foo.com/",
+ "https://mails.bar.com/",
+ "https://videos.xyz.com/",
+ "https://books.foo.com/",
+ "https://account.bar.com/",
+ "https://shopping.xyz.com/"
+ ];
+ fakeOrigins.forEach(origin => addPersistentStoragePerm(origin));
+
+ let updatePromise = promiseSiteDataManagerSitesUpdated();
+ yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
+ yield updatePromise;
+ yield openSiteDataSettingsDialog();
+
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let frameDoc = null;
+ let saveBtn = null;
+ let cancelBtn = null;
+ let settingsDialogClosePromise = null;
+
+ // Test the initial state
+ assertAllSitesListed();
+
+ // Test the "Cancel" button
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ cancelBtn = frameDoc.getElementById("cancel");
+ removeAllSitesOneByOne();
+ assertAllSitesNotListed();
+ cancelBtn.doCommand();
+ yield settingsDialogClosePromise;
+ yield openSiteDataSettingsDialog();
+ assertAllSitesListed();
+
+ // Test the "Save Changes" button but cancelling save
+ let cancelPromise = promiseAlertDialogOpen("cancel");
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeAllSitesOneByOne();
+ assertAllSitesNotListed();
+ saveBtn.doCommand();
+ yield cancelPromise;
+ yield settingsDialogClosePromise;
+ yield openSiteDataSettingsDialog();
+ assertAllSitesListed();
+
+ // Test the "Save Changes" button and accepting save
+ let acceptPromise = promiseAlertDialogOpen("accept");
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ updatePromise = promiseSiteDataManagerSitesUpdated();
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeAllSitesOneByOne();
+ assertAllSitesNotListed();
+ saveBtn.doCommand();
+ yield acceptPromise;
+ yield settingsDialogClosePromise;
+ yield updatePromise;
+ yield openSiteDataSettingsDialog();
+ assertAllSitesNotListed();
+
+ // Always clean up the fake origins
+ fakeOrigins.forEach(origin => removePersistentStoragePerm(origin));
+ yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+
+ function removeAllSitesOneByOne() {
+ frameDoc = doc.getElementById("dialogFrame").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 assertAllSitesListed() {
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ let removeBtn = frameDoc.getElementById("removeSelected");
+ let removeAllBtn = frameDoc.getElementById("removeAll");
+ let sitesList = frameDoc.getElementById("sitesList");
+ let sites = sitesList.getElementsByTagName("richlistitem");
+ is(sites.length, fakeOrigins.length, "Should list all sites");
+ is(removeBtn.disabled, false, "Should enable the removeSelected button");
+ is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
+ }
+
+ function assertAllSitesNotListed() {
+ frameDoc = doc.getElementById("dialogFrame").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(function* () {
+ yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
+ let fakeOrigins = [
+ "https://news.foo.com/",
+ "https://mails.bar.com/",
+ "https://videos.xyz.com/",
+ "https://books.foo.com/",
+ "https://account.bar.com/",
+ "https://shopping.xyz.com/"
+ ];
+ fakeOrigins.forEach(origin => addPersistentStoragePerm(origin));
+
+ let updatePromise = promiseSiteDataManagerSitesUpdated();
+ yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
+ yield updatePromise;
+ yield openSiteDataSettingsDialog();
+
+ 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, fakeOrigins);
+
+ // Test the "Cancel" button
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ cancelBtn = frameDoc.getElementById("cancel");
+ removeSelectedSite(fakeOrigins.slice(0, 4));
+ assertSitesListed(doc, fakeOrigins.slice(4));
+ cancelBtn.doCommand();
+ yield settingsDialogClosePromise;
+ yield openSiteDataSettingsDialog();
+ assertSitesListed(doc, fakeOrigins);
+
+ // Test the "Save Changes" button but canceling save
+ removeDialogOpenPromise = promiseWindowDialogOpen("cancel", REMOVE_DIALOG_URL);
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeSelectedSite(fakeOrigins.slice(0, 4));
+ assertSitesListed(doc, fakeOrigins.slice(4));
+ saveBtn.doCommand();
+ yield removeDialogOpenPromise;
+ yield settingsDialogClosePromise;
+ yield openSiteDataSettingsDialog();
+ assertSitesListed(doc, fakeOrigins);
+
+ // Test the "Save Changes" button and accepting save
+ removeDialogOpenPromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
+ settingsDialogClosePromise = promiseSettingsDialogClose();
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ saveBtn = frameDoc.getElementById("save");
+ removeSelectedSite(fakeOrigins.slice(0, 4));
+ assertSitesListed(doc, fakeOrigins.slice(4));
+ saveBtn.doCommand();
+ yield removeDialogOpenPromise;
+ yield settingsDialogClosePromise;
+ yield openSiteDataSettingsDialog();
+ assertSitesListed(doc, fakeOrigins.slice(4));
+
+ // Always clean up the fake origins
+ fakeOrigins.forEach(origin => removePersistentStoragePerm(origin));
+ yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+
+ function removeSelectedSite(origins) {
+ frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ let removeBtn = frameDoc.getElementById("removeSelected");
+ let sitesList = frameDoc.getElementById("sitesList");
+ origins.forEach(origin => {
+ let site = sitesList.querySelector(`richlistitem[data-origin="${origin}"]`);
+ if (site) {
+ site.click();
+ removeBtn.doCommand();
+ } else {
+ ok(false, `Should not select and remove inexisted site of ${origin}`);
+ }
+ });
+ }
+});
+
+add_task(function* () {
+ yield SpecialPowers.pushPrefEnv({set: [["browser.storageManager.enabled", true]]});
+ let fakeOrigins = [
+ "https://news.foo.com/",
+ "https://books.foo.com/",
+ "https://mails.bar.com/",
+ "https://account.bar.com/",
+ "https://videos.xyz.com/",
+ "https://shopping.xyz.com/"
+ ];
+ fakeOrigins.forEach(origin => addPersistentStoragePerm(origin));
+
+ let updatePromise = promiseSiteDataManagerSitesUpdated();
+ yield openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
+ yield updatePromise;
+ yield openSiteDataSettingsDialog();
+
+ // Search "foo" to only list foo.com sites
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ let searchBox = frameDoc.getElementById("searchBox");
+ searchBox.value = "foo";
+ searchBox.doCommand();
+ assertSitesListed(doc, fakeOrigins.slice(0, 2));
+
+ // Test only removing all visible sites listed
+ updatePromise = promiseSiteDataManagerSitesUpdated();
+ let acceptRemovePromise = promiseWindowDialogOpen("accept", REMOVE_DIALOG_URL);
+ let settingsDialogClosePromise = promiseSettingsDialogClose();
+ let removeAllBtn = frameDoc.getElementById("removeAll");
+ let saveBtn = frameDoc.getElementById("save");
+ removeAllBtn.doCommand();
+ saveBtn.doCommand();
+ yield acceptRemovePromise;
+ yield settingsDialogClosePromise;
+ yield updatePromise;
+ yield openSiteDataSettingsDialog();
+ assertSitesListed(doc, fakeOrigins.slice(2));
+
+ // Always clean up the fake origins
+ fakeOrigins.forEach(origin => removePersistentStoragePerm(origin));
+ yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+function promiseSettingsDialogClose() {
+ return new Promise(resolve => {
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let dialogOverlay = doc.getElementById("dialogOverlay");
+ let win = content.gSubDialog._frame.contentWindow;
+ win.addEventListener("unload", function unload() {
+ if (win.document.documentURI === "chrome://browser/content/preferences/siteDataSettings.xul") {
+ isnot(dialogOverlay.style.visibility, "visible", "The Settings dialog should be hidden");
+ resolve();
+ }
+ }, { once: true });
+ });
+}
+
+function removePersistentStoragePerm(origin) {
+ let uri = NetUtil.newURI(origin);
+ let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
+ Services.perms.removeFromPrincipal(principal, "persistent-storage");
+}
--- a/browser/components/preferences/in-content/tests/head.js
+++ b/browser/components/preferences/in-content/tests/head.js
@@ -174,8 +174,47 @@ function promiseWindowDialogOpen(buttonA
}
});
});
}
function promiseAlertDialogOpen(buttonAction) {
return promiseWindowDialogOpen(buttonAction, "chrome://global/content/commonDialog.xul");
}
+
+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 promiseSiteDataManagerSitesUpdated() {
+ return TestUtils.topicObserved("sitedatamanager:sites-updated", () => true);
+}
+
+function openSiteDataSettingsDialog() {
+ let doc = gBrowser.selectedBrowser.contentDocument;
+ let settingsBtn = doc.getElementById("siteDataSettings");
+ let dialogOverlay = doc.getElementById("dialogOverlay");
+ 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, origins) {
+ let frameDoc = doc.getElementById("dialogFrame").contentDocument;
+ let removeBtn = frameDoc.getElementById("removeSelected");
+ let removeAllBtn = frameDoc.getElementById("removeAll");
+ let sitesList = frameDoc.getElementById("sitesList");
+ let totalSitesNumber = sitesList.getElementsByTagName("richlistitem").length;
+ is(totalSitesNumber, origins.length, "Should list the right sites number");
+ origins.forEach(origin => {
+ let site = sitesList.querySelector(`richlistitem[data-origin="${origin}"]`);
+ let host = site.getAttribute("host");
+ ok(origin.includes(host), `Should list the site of ${origin}`);
+ });
+ is(removeBtn.disabled, false, "Should enable the removeSelected button");
+ is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
+}