forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			327 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			327 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
// Test not displaying sites which store 0 byte and don't have persistent storage.
 | 
						|
add_task(async function test_exclusions() {
 | 
						|
  let hosts = await addTestData([
 | 
						|
    {
 | 
						|
      usage: 0,
 | 
						|
      origin: "https://account.xyz.com",
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 0,
 | 
						|
      origin: "https://shopping.xyz.com",
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 1024,
 | 
						|
      origin: "http://cinema.bar.com",
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 1024,
 | 
						|
      origin: "http://email.bar.com",
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 0,
 | 
						|
      origin: "http://cookies.bar.com",
 | 
						|
      cookies: 5,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
  ]);
 | 
						|
 | 
						|
  let updatePromise = promiseSiteDataManagerSitesUpdated();
 | 
						|
  let doc = gBrowser.selectedBrowser.contentDocument;
 | 
						|
  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
 | 
						|
  await updatePromise;
 | 
						|
  await openSiteDataSettingsDialog();
 | 
						|
  assertSitesListed(
 | 
						|
    doc,
 | 
						|
    hosts.filter(host => host != "shopping.xyz.com")
 | 
						|
  );
 | 
						|
 | 
						|
  await SiteDataTestUtils.clear();
 | 
						|
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | 
						|
});
 | 
						|
 | 
						|
// Test grouping and listing sites across scheme, port and origin attributes by base domain.
 | 
						|
add_task(async function test_grouping() {
 | 
						|
  let quotaUsage = 7000000;
 | 
						|
  let testData = [
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "https://account.xyz.com^userContextId=1",
 | 
						|
      cookies: 2,
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "https://account.xyz.com",
 | 
						|
      cookies: 1,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "https://account.xyz.com:123",
 | 
						|
      cookies: 1,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "http://account.xyz.com",
 | 
						|
      cookies: 1,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "http://search.xyz.com",
 | 
						|
      cookies: 3,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "http://advanced.search.xyz.com",
 | 
						|
      cookies: 3,
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: quotaUsage,
 | 
						|
      origin: "http://xyz.com",
 | 
						|
      cookies: 1,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
  ];
 | 
						|
  await addTestData(testData);
 | 
						|
 | 
						|
  let updatedPromise = promiseSiteDataManagerSitesUpdated();
 | 
						|
  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
 | 
						|
  await updatedPromise;
 | 
						|
  await openSiteDataSettingsDialog();
 | 
						|
  let win = gBrowser.selectedBrowser.contentWindow;
 | 
						|
  let dialogFrame = win.gSubDialog._topDialog._frame;
 | 
						|
  let frameDoc = dialogFrame.contentDocument;
 | 
						|
 | 
						|
  let siteItems = frameDoc.getElementsByTagName("richlistitem");
 | 
						|
  is(
 | 
						|
    siteItems.length,
 | 
						|
    1,
 | 
						|
    "Should group sites across scheme, port and origin attributes"
 | 
						|
  );
 | 
						|
 | 
						|
  let columns = siteItems[0].querySelectorAll(".item-box > label");
 | 
						|
 | 
						|
  let expected = "xyz.com";
 | 
						|
  is(columns[0].value, expected, "Should group and list sites by host");
 | 
						|
 | 
						|
  let cookieCount = testData.reduce((count, { cookies }) => count + cookies, 0);
 | 
						|
  is(
 | 
						|
    columns[1].value,
 | 
						|
    cookieCount.toString(),
 | 
						|
    "Should group cookies across scheme, port and origin attributes"
 | 
						|
  );
 | 
						|
 | 
						|
  let [value, unit] = DownloadUtils.convertByteUnits(quotaUsage * 4);
 | 
						|
  let l10nAttributes = frameDoc.l10n.getAttributes(columns[2]);
 | 
						|
  is(
 | 
						|
    l10nAttributes.id,
 | 
						|
    "site-storage-persistent",
 | 
						|
    "Should show the site as persistent if one origin is persistent."
 | 
						|
  );
 | 
						|
  // The shown quota can be slightly larger than the raw data we put in (though it should
 | 
						|
  // never be smaller), but that doesn't really matter to us since we only want to test that
 | 
						|
  // the site data dialog accumulates this into a single column.
 | 
						|
  ok(
 | 
						|
    parseFloat(l10nAttributes.args.value) >= parseFloat(value),
 | 
						|
    "Should show the correct accumulated quota size."
 | 
						|
  );
 | 
						|
  is(
 | 
						|
    l10nAttributes.args.unit,
 | 
						|
    unit,
 | 
						|
    "Should show the correct quota size unit."
 | 
						|
  );
 | 
						|
 | 
						|
  await SiteDataTestUtils.clear();
 | 
						|
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | 
						|
});
 | 
						|
 | 
						|
// Test sorting
 | 
						|
add_task(async function test_sorting() {
 | 
						|
  let testData = [
 | 
						|
    {
 | 
						|
      usage: 1024,
 | 
						|
      origin: "https://account.xyz.com",
 | 
						|
      cookies: 6,
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 1024 * 2,
 | 
						|
      origin: "https://books.foo.com",
 | 
						|
      cookies: 0,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 1024 * 3,
 | 
						|
      origin: "http://cinema.bar.com",
 | 
						|
      cookies: 3,
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 1024 * 3,
 | 
						|
      origin: "http://vod.bar.com",
 | 
						|
      cookies: 2,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
  ];
 | 
						|
 | 
						|
  await addTestData(testData);
 | 
						|
 | 
						|
  let updatePromise = promiseSiteDataManagerSitesUpdated();
 | 
						|
 | 
						|
  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
 | 
						|
  await updatePromise;
 | 
						|
  await openSiteDataSettingsDialog();
 | 
						|
 | 
						|
  let dialog = content.gSubDialog._topDialog;
 | 
						|
  let dialogFrame = dialog._frame;
 | 
						|
  let frameDoc = dialogFrame.contentDocument;
 | 
						|
  let hostCol = frameDoc.getElementById("hostCol");
 | 
						|
  let usageCol = frameDoc.getElementById("usageCol");
 | 
						|
  let cookiesCol = frameDoc.getElementById("cookiesCol");
 | 
						|
  let sitesList = frameDoc.getElementById("sitesList");
 | 
						|
 | 
						|
  function getHostOrder() {
 | 
						|
    let siteItems = sitesList.getElementsByTagName("richlistitem");
 | 
						|
    return Array.from(siteItems).map(item => item.getAttribute("host"));
 | 
						|
  }
 | 
						|
 | 
						|
  // Test default sorting by usage, descending.
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["bar.com", "foo.com", "xyz.com"],
 | 
						|
    "Has sorted descending by usage"
 | 
						|
  );
 | 
						|
 | 
						|
  // Test sorting on the usage column
 | 
						|
  usageCol.click();
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["xyz.com", "foo.com", "bar.com"],
 | 
						|
    "Has sorted ascending by usage"
 | 
						|
  );
 | 
						|
  usageCol.click();
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["bar.com", "foo.com", "xyz.com"],
 | 
						|
    "Has sorted descending by usage"
 | 
						|
  );
 | 
						|
 | 
						|
  // Test sorting on the host column
 | 
						|
  hostCol.click();
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["bar.com", "foo.com", "xyz.com"],
 | 
						|
    "Has sorted ascending by base domain"
 | 
						|
  );
 | 
						|
  hostCol.click();
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["xyz.com", "foo.com", "bar.com"],
 | 
						|
    "Has sorted descending by base domain"
 | 
						|
  );
 | 
						|
 | 
						|
  // Test sorting on the cookies column
 | 
						|
  cookiesCol.click();
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["foo.com", "bar.com", "xyz.com"],
 | 
						|
    "Has sorted ascending by cookies"
 | 
						|
  );
 | 
						|
  cookiesCol.click();
 | 
						|
  Assert.deepEqual(
 | 
						|
    getHostOrder(),
 | 
						|
    ["xyz.com", "bar.com", "foo.com"],
 | 
						|
    "Has sorted descending by cookies"
 | 
						|
  );
 | 
						|
 | 
						|
  await SiteDataTestUtils.clear();
 | 
						|
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | 
						|
});
 | 
						|
 | 
						|
// Test single entry removal
 | 
						|
add_task(async function test_single_entry_removal() {
 | 
						|
  let testData = await addTestData([
 | 
						|
    {
 | 
						|
      usage: 1024,
 | 
						|
      origin: "https://xyz.com",
 | 
						|
      cookies: 6,
 | 
						|
      persisted: true,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      usage: 1024 * 3,
 | 
						|
      origin: "http://bar.com",
 | 
						|
      cookies: 2,
 | 
						|
      persisted: false,
 | 
						|
    },
 | 
						|
  ]);
 | 
						|
 | 
						|
  let updatePromise = promiseSiteDataManagerSitesUpdated();
 | 
						|
  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
 | 
						|
  await updatePromise;
 | 
						|
  await openSiteDataSettingsDialog();
 | 
						|
 | 
						|
  let dialog = content.gSubDialog._topDialog;
 | 
						|
  let dialogFrame = dialog._frame;
 | 
						|
  let frameDoc = dialogFrame.contentDocument;
 | 
						|
 | 
						|
  let sitesList = frameDoc.getElementById("sitesList");
 | 
						|
  let host = testData[0];
 | 
						|
  let site = sitesList.querySelector(`richlistitem[host="${host}"]`);
 | 
						|
  sitesList.addItemToSelection(site);
 | 
						|
  frameDoc.getElementById("removeSelected").doCommand();
 | 
						|
  let saveChangesButton = frameDoc.querySelector("dialog").getButton("accept");
 | 
						|
  let dialogOpened = BrowserTestUtils.promiseAlertDialogOpen(
 | 
						|
    null,
 | 
						|
    REMOVE_DIALOG_URL
 | 
						|
  );
 | 
						|
  setTimeout(() => saveChangesButton.doCommand(), 0);
 | 
						|
  let dialogWin = await dialogOpened;
 | 
						|
  let rootElement = dialogWin.document.getElementById(
 | 
						|
    "SiteDataRemoveSelectedDialog"
 | 
						|
  );
 | 
						|
  is(rootElement.classList.length, 1, "There should only be one class set");
 | 
						|
  is(
 | 
						|
    rootElement.classList[0],
 | 
						|
    "single-entry",
 | 
						|
    "The only class set should be single-entry (to hide the list)"
 | 
						|
  );
 | 
						|
  let description = dialogWin.document.getElementById("removing-description");
 | 
						|
  is(
 | 
						|
    description.getAttribute("data-l10n-id"),
 | 
						|
    "site-data-removing-single-desc",
 | 
						|
    "The description for single site should be selected"
 | 
						|
  );
 | 
						|
 | 
						|
  let removalList = dialogWin.document.getElementById("removalList");
 | 
						|
  is(
 | 
						|
    BrowserTestUtils.is_visible(removalList),
 | 
						|
    false,
 | 
						|
    "The removal list should be invisible"
 | 
						|
  );
 | 
						|
  let removeButton = dialogWin.document
 | 
						|
    .querySelector("dialog")
 | 
						|
    .getButton("accept");
 | 
						|
  let dialogClosed = BrowserTestUtils.waitForEvent(dialogWin, "unload");
 | 
						|
  updatePromise = promiseSiteDataManagerSitesUpdated();
 | 
						|
  removeButton.doCommand();
 | 
						|
  await dialogClosed;
 | 
						|
  await updatePromise;
 | 
						|
  await openSiteDataSettingsDialog();
 | 
						|
 | 
						|
  dialog = content.gSubDialog._topDialog;
 | 
						|
  dialogFrame = dialog._frame;
 | 
						|
  frameDoc = dialogFrame.contentDocument;
 | 
						|
  assertSitesListed(frameDoc, testData.slice(1));
 | 
						|
  await SiteDataTestUtils.clear();
 | 
						|
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | 
						|
});
 |