Bug 1361170 - Split browser_advanced_siteData.js in to two tests because it was running too long. r?jaws draft
authorHemant Singh Patwal <hemantsingh1612@gmail.com>
Thu, 29 Jun 2017 07:56:58 +0530
changeset 601712 d7c9ef5860835dc6fca785aa9a1038242e6b38b3
parent 594149 da66c4a05fda49d457d9411a7092fed87cf9e53a
child 635386 31d83dba046eaced58dd5b0e3aee4b29d256f016
push id66198
push userbmo:hemantsingh1612@gmail.com
push dateThu, 29 Jun 2017 02:27:44 +0000
reviewersjaws
bugs1361170
milestone56.0a1
Bug 1361170 - Split browser_advanced_siteData.js in to two tests because it was running too long. r?jaws MozReview-Commit-ID: 1HrM9ydWQlF
browser/components/preferences/in-content/tests/browser.ini
browser/components/preferences/in-content/tests/browser_advanced_siteData.js
browser/components/preferences/in-content/tests/browser_siteData.js
browser/components/preferences/in-content/tests/browser_siteData2.js
browser/components/preferences/in-content/tests/head.js
--- 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 });
+  });
+}