tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser_siteData3.js (8983B)


      1 "use strict";
      2 
      3 // Test not displaying sites which store 0 byte and don't have persistent storage.
      4 add_task(async function test_exclusions() {
      5  let hosts = await addTestData([
      6    {
      7      usage: 0,
      8      origin: "https://account.xyz.com",
      9      persisted: true,
     10    },
     11    {
     12      usage: 0,
     13      origin: "https://shopping.xyz.com",
     14      persisted: false,
     15    },
     16    {
     17      usage: 1024,
     18      origin: "http://cinema.bar.com",
     19      persisted: true,
     20    },
     21    {
     22      usage: 1024,
     23      origin: "http://email.bar.com",
     24      persisted: false,
     25    },
     26    {
     27      usage: 0,
     28      origin: "http://cookies.bar.com",
     29      cookies: 5,
     30      persisted: false,
     31    },
     32  ]);
     33 
     34  let updatePromise = promiseSiteDataManagerSitesUpdated();
     35  let doc = gBrowser.selectedBrowser.contentDocument;
     36  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
     37  await updatePromise;
     38  await openSiteDataSettingsDialog();
     39  assertSitesListed(
     40    doc,
     41    hosts.filter(host => host != "shopping.xyz.com")
     42  );
     43 
     44  await SiteDataTestUtils.clear();
     45  BrowserTestUtils.removeTab(gBrowser.selectedTab);
     46 });
     47 
     48 // Test grouping and listing sites across scheme, port and origin attributes by base domain.
     49 add_task(async function test_grouping() {
     50  let quotaUsage = 7000000;
     51  let testData = [
     52    {
     53      usage: quotaUsage,
     54      origin: "https://account.xyz.com^userContextId=1",
     55      cookies: 2,
     56      persisted: true,
     57    },
     58    {
     59      usage: quotaUsage,
     60      origin: "https://account.xyz.com",
     61      cookies: 1,
     62      persisted: false,
     63    },
     64    {
     65      usage: quotaUsage,
     66      origin: "https://account.xyz.com:123",
     67      cookies: 1,
     68      persisted: false,
     69    },
     70    {
     71      usage: quotaUsage,
     72      origin: "http://account.xyz.com",
     73      cookies: 1,
     74      persisted: false,
     75    },
     76    {
     77      usage: quotaUsage,
     78      origin: "http://search.xyz.com",
     79      cookies: 3,
     80      persisted: false,
     81    },
     82    {
     83      usage: quotaUsage,
     84      origin: "http://advanced.search.xyz.com",
     85      cookies: 3,
     86      persisted: true,
     87    },
     88    {
     89      usage: quotaUsage,
     90      origin: "http://xyz.com",
     91      cookies: 1,
     92      persisted: false,
     93    },
     94  ];
     95  await addTestData(testData);
     96 
     97  let updatedPromise = promiseSiteDataManagerSitesUpdated();
     98  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
     99  await updatedPromise;
    100  await openSiteDataSettingsDialog();
    101  let win = gBrowser.selectedBrowser.contentWindow;
    102  let dialogFrame = win.gSubDialog._topDialog._frame;
    103  let frameDoc = dialogFrame.contentDocument;
    104 
    105  let siteItems = frameDoc.getElementsByTagName("richlistitem");
    106  is(
    107    siteItems.length,
    108    1,
    109    "Should group sites across scheme, port and origin attributes"
    110  );
    111 
    112  let columns = siteItems[0].querySelectorAll(".item-box > label");
    113 
    114  let expected = "xyz.com";
    115  is(columns[0].value, expected, "Should group and list sites by host");
    116 
    117  let cookieCount = testData.reduce((count, { cookies }) => count + cookies, 0);
    118  is(
    119    columns[1].value,
    120    cookieCount.toString(),
    121    "Should group cookies across scheme, port and origin attributes"
    122  );
    123 
    124  let [value, unit] = DownloadUtils.convertByteUnits(quotaUsage * 4);
    125  let l10nAttributes = frameDoc.l10n.getAttributes(columns[2]);
    126  is(
    127    l10nAttributes.id,
    128    "site-storage-persistent",
    129    "Should show the site as persistent if one origin is persistent."
    130  );
    131  // The shown quota can be slightly larger than the raw data we put in (though it should
    132  // never be smaller), but that doesn't really matter to us since we only want to test that
    133  // the site data dialog accumulates this into a single column.
    134  Assert.greaterOrEqual(
    135    parseFloat(l10nAttributes.args.value),
    136    parseFloat(value),
    137    "Should show the correct accumulated quota size."
    138  );
    139  is(
    140    l10nAttributes.args.unit,
    141    unit,
    142    "Should show the correct quota size unit."
    143  );
    144 
    145  await SiteDataTestUtils.clear();
    146  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    147 });
    148 
    149 // Test sorting
    150 add_task(async function test_sorting() {
    151  let testData = [
    152    {
    153      usage: 1024,
    154      origin: "https://account.xyz.com",
    155      cookies: 6,
    156      persisted: true,
    157    },
    158    {
    159      usage: 1024 * 2,
    160      origin: "https://books.foo.com",
    161      cookies: 0,
    162      persisted: false,
    163    },
    164    {
    165      usage: 1024 * 3,
    166      origin: "http://cinema.bar.com",
    167      cookies: 3,
    168      persisted: true,
    169    },
    170    {
    171      usage: 1024 * 3,
    172      origin: "http://vod.bar.com",
    173      cookies: 2,
    174      persisted: false,
    175    },
    176  ];
    177 
    178  await addTestData(testData);
    179 
    180  let updatePromise = promiseSiteDataManagerSitesUpdated();
    181 
    182  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    183  await updatePromise;
    184  await openSiteDataSettingsDialog();
    185 
    186  let dialog = content.gSubDialog._topDialog;
    187  let dialogFrame = dialog._frame;
    188  let frameDoc = dialogFrame.contentDocument;
    189  let hostCol = frameDoc.getElementById("hostCol");
    190  let usageCol = frameDoc.getElementById("usageCol");
    191  let cookiesCol = frameDoc.getElementById("cookiesCol");
    192  let sitesList = frameDoc.getElementById("sitesList");
    193 
    194  function getHostOrder() {
    195    let siteItems = sitesList.getElementsByTagName("richlistitem");
    196    return Array.from(siteItems).map(item => item.getAttribute("host"));
    197  }
    198 
    199  // Test default sorting by usage, descending.
    200  Assert.deepEqual(
    201    getHostOrder(),
    202    ["bar.com", "foo.com", "xyz.com"],
    203    "Has sorted descending by usage"
    204  );
    205 
    206  // Test sorting on the usage column
    207  usageCol.click();
    208  Assert.deepEqual(
    209    getHostOrder(),
    210    ["xyz.com", "foo.com", "bar.com"],
    211    "Has sorted ascending by usage"
    212  );
    213  usageCol.click();
    214  Assert.deepEqual(
    215    getHostOrder(),
    216    ["bar.com", "foo.com", "xyz.com"],
    217    "Has sorted descending by usage"
    218  );
    219 
    220  // Test sorting on the host column
    221  hostCol.click();
    222  Assert.deepEqual(
    223    getHostOrder(),
    224    ["bar.com", "foo.com", "xyz.com"],
    225    "Has sorted ascending by base domain"
    226  );
    227  hostCol.click();
    228  Assert.deepEqual(
    229    getHostOrder(),
    230    ["xyz.com", "foo.com", "bar.com"],
    231    "Has sorted descending by base domain"
    232  );
    233 
    234  // Test sorting on the cookies column
    235  cookiesCol.click();
    236  Assert.deepEqual(
    237    getHostOrder(),
    238    ["foo.com", "bar.com", "xyz.com"],
    239    "Has sorted ascending by cookies"
    240  );
    241  cookiesCol.click();
    242  Assert.deepEqual(
    243    getHostOrder(),
    244    ["xyz.com", "bar.com", "foo.com"],
    245    "Has sorted descending by cookies"
    246  );
    247 
    248  await SiteDataTestUtils.clear();
    249  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    250 });
    251 
    252 // Test single entry removal
    253 add_task(async function test_single_entry_removal() {
    254  let testData = await addTestData([
    255    {
    256      usage: 1024,
    257      origin: "https://xyz.com",
    258      cookies: 6,
    259      persisted: true,
    260    },
    261    {
    262      usage: 1024 * 3,
    263      origin: "http://bar.com",
    264      cookies: 2,
    265      persisted: false,
    266    },
    267  ]);
    268 
    269  let updatePromise = promiseSiteDataManagerSitesUpdated();
    270  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    271  await updatePromise;
    272  await openSiteDataSettingsDialog();
    273 
    274  let dialog = content.gSubDialog._topDialog;
    275  let dialogFrame = dialog._frame;
    276  let frameDoc = dialogFrame.contentDocument;
    277 
    278  let sitesList = frameDoc.getElementById("sitesList");
    279  let host = testData[0];
    280  let site = sitesList.querySelector(`richlistitem[host="${host}"]`);
    281  sitesList.addItemToSelection(site);
    282  frameDoc.getElementById("removeSelected").doCommand();
    283  let saveChangesButton = frameDoc.querySelector("dialog").getButton("accept");
    284  let dialogOpened = BrowserTestUtils.promiseAlertDialogOpen(
    285    null,
    286    REMOVE_DIALOG_URL
    287  );
    288  setTimeout(() => saveChangesButton.doCommand(), 0);
    289  let dialogWin = await dialogOpened;
    290  let rootElement = dialogWin.document.getElementById(
    291    "SiteDataRemoveSelectedDialog"
    292  );
    293  is(rootElement.classList.length, 1, "There should only be one class set");
    294  is(
    295    rootElement.classList[0],
    296    "single-entry",
    297    "The only class set should be single-entry (to hide the list)"
    298  );
    299  let description = dialogWin.document.getElementById("removing-description");
    300  is(
    301    description.getAttribute("data-l10n-id"),
    302    "site-data-removing-single-desc",
    303    "The description for single site should be selected"
    304  );
    305 
    306  let removalList = dialogWin.document.getElementById("removalList");
    307  is(
    308    BrowserTestUtils.isVisible(removalList),
    309    false,
    310    "The removal list should be invisible"
    311  );
    312  let removeButton = dialogWin.document
    313    .querySelector("dialog")
    314    .getButton("accept");
    315  let dialogClosed = BrowserTestUtils.waitForEvent(dialogWin, "unload");
    316  updatePromise = promiseSiteDataManagerSitesUpdated();
    317  removeButton.doCommand();
    318  await dialogClosed;
    319  await updatePromise;
    320  await openSiteDataSettingsDialog();
    321 
    322  dialog = content.gSubDialog._topDialog;
    323  dialogFrame = dialog._frame;
    324  frameDoc = dialogFrame.contentDocument;
    325  assertSitesListed(frameDoc, testData.slice(1));
    326  await SiteDataTestUtils.clear();
    327  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    328 });