tor-browser

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

browser_siteData2.js (14545B)


      1 "use strict";
      2 
      3 function assertAllSitesNotListed(win) {
      4  let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
      5  let removeBtn = frameDoc.getElementById("removeSelected");
      6  let removeAllBtn = frameDoc.getElementById("removeAll");
      7  let sitesList = frameDoc.getElementById("sitesList");
      8  let sites = sitesList.getElementsByTagName("richlistitem");
      9  is(sites.length, 0, "Should not list all sites");
     10  is(removeBtn.disabled, true, "Should disable the removeSelected button");
     11  is(removeAllBtn.disabled, true, "Should disable the removeAllBtn button");
     12 }
     13 
     14 // Test selecting and removing all sites one by one
     15 add_task(async function test_selectRemove() {
     16  let hosts = await addTestData([
     17    {
     18      usage: 1024,
     19      origin: "https://account.xyz.com",
     20      persisted: true,
     21    },
     22    {
     23      usage: 1024,
     24      origin: "https://shopping.xyz.com",
     25    },
     26    {
     27      usage: 1024,
     28      origin: "http://cinema.bar.com",
     29      persisted: true,
     30    },
     31    {
     32      usage: 1024,
     33      origin: "http://email.bar.com",
     34    },
     35  ]);
     36 
     37  let updatePromise = promiseSiteDataManagerSitesUpdated();
     38 
     39  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
     40  await updatePromise;
     41  await openSiteDataSettingsDialog();
     42 
     43  let win = gBrowser.selectedBrowser.contentWindow;
     44  let doc = gBrowser.selectedBrowser.contentDocument;
     45  let frameDoc = null;
     46  let saveBtn = null;
     47  let cancelBtn = null;
     48  let settingsDialogClosePromise = null;
     49 
     50  // Test the initial state
     51  assertSitesListed(doc, hosts);
     52 
     53  // Test the "Cancel" button
     54  settingsDialogClosePromise = promiseSettingsDialogClose();
     55  frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
     56  cancelBtn = frameDoc.querySelector("dialog").getButton("cancel");
     57  removeAllSitesOneByOne();
     58  assertAllSitesNotListed(win);
     59  cancelBtn.doCommand();
     60  await settingsDialogClosePromise;
     61  await openSiteDataSettingsDialog();
     62  assertSitesListed(doc, hosts);
     63 
     64  // Test the "Save Changes" button but cancelling save
     65  let cancelPromise = BrowserTestUtils.promiseAlertDialogOpen("cancel");
     66  settingsDialogClosePromise = promiseSettingsDialogClose();
     67  frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
     68  saveBtn = frameDoc.querySelector("dialog").getButton("accept");
     69  cancelBtn = frameDoc.querySelector("dialog").getButton("cancel");
     70  removeAllSitesOneByOne();
     71  assertAllSitesNotListed(win);
     72  saveBtn.doCommand();
     73  await cancelPromise;
     74  cancelBtn.doCommand();
     75  await settingsDialogClosePromise;
     76  await openSiteDataSettingsDialog();
     77  assertSitesListed(doc, hosts);
     78 
     79  // Test the "Save Changes" button and accepting save
     80  let acceptPromise = BrowserTestUtils.promiseAlertDialogOpen("accept");
     81  settingsDialogClosePromise = promiseSettingsDialogClose();
     82  updatePromise = promiseSiteDataManagerSitesUpdated();
     83  frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
     84  saveBtn = frameDoc.querySelector("dialog").getButton("accept");
     85  removeAllSitesOneByOne();
     86  assertAllSitesNotListed(win);
     87  saveBtn.doCommand();
     88  await acceptPromise;
     89  await settingsDialogClosePromise;
     90  await updatePromise;
     91  await openSiteDataSettingsDialog();
     92  assertAllSitesNotListed(win);
     93 
     94  await SiteDataTestUtils.clear();
     95  BrowserTestUtils.removeTab(gBrowser.selectedTab);
     96 
     97  function removeAllSitesOneByOne() {
     98    frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
     99    let removeBtn = frameDoc.getElementById("removeSelected");
    100    let sitesList = frameDoc.getElementById("sitesList");
    101    let sites = sitesList.getElementsByTagName("richlistitem");
    102    for (let i = sites.length - 1; i >= 0; --i) {
    103      sites[i].click();
    104      removeBtn.doCommand();
    105    }
    106  }
    107 });
    108 
    109 // Test selecting and removing partial sites
    110 add_task(async function test_removePartialSites() {
    111  let hosts = await addTestData([
    112    {
    113      usage: 1024,
    114      origin: "https://account.xyz.com",
    115      persisted: true,
    116    },
    117    {
    118      usage: 1024,
    119      origin: "https://shopping.xyz.com",
    120      persisted: false,
    121    },
    122    {
    123      usage: 1024,
    124      origin: "http://cinema.bar.com",
    125      persisted: true,
    126    },
    127    {
    128      usage: 1024,
    129      origin: "http://email.bar.com",
    130      persisted: false,
    131    },
    132    {
    133      usage: 1024,
    134      origin: "https://s3-us-west-2.amazonaws.com",
    135      persisted: true,
    136    },
    137    {
    138      usage: 1024,
    139      origin: "https://127.0.0.1",
    140      persisted: false,
    141    },
    142  ]);
    143 
    144  let updatePromise = promiseSiteDataManagerSitesUpdated();
    145 
    146  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    147  await updatePromise;
    148  await openSiteDataSettingsDialog();
    149 
    150  let win = gBrowser.selectedBrowser.contentWindow;
    151  let doc = gBrowser.selectedBrowser.contentDocument;
    152  let frameDoc = null;
    153  let saveBtn = null;
    154  let cancelBtn = null;
    155  let removeDialogOpenPromise = null;
    156  let settingsDialogClosePromise = null;
    157 
    158  // Test the initial state
    159  assertSitesListed(doc, hosts);
    160 
    161  // Test the "Cancel" button
    162  settingsDialogClosePromise = promiseSettingsDialogClose();
    163  frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    164  cancelBtn = frameDoc.querySelector("dialog").getButton("cancel");
    165  removeSelectedSite(hosts.slice(0, 2));
    166  assertSitesListed(doc, hosts.slice(2));
    167  cancelBtn.doCommand();
    168  await settingsDialogClosePromise;
    169  await openSiteDataSettingsDialog();
    170  assertSitesListed(doc, hosts);
    171 
    172  // Test the "Save Changes" button but canceling save
    173  removeDialogOpenPromise = BrowserTestUtils.promiseAlertDialogOpen(
    174    "cancel",
    175    REMOVE_DIALOG_URL
    176  );
    177  settingsDialogClosePromise = promiseSettingsDialogClose();
    178  frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    179  saveBtn = frameDoc.querySelector("dialog").getButton("accept");
    180  cancelBtn = frameDoc.querySelector("dialog").getButton("cancel");
    181  removeSelectedSite(hosts.slice(0, 2));
    182  assertSitesListed(doc, hosts.slice(2));
    183  saveBtn.doCommand();
    184  await removeDialogOpenPromise;
    185  cancelBtn.doCommand();
    186  await settingsDialogClosePromise;
    187  await openSiteDataSettingsDialog();
    188  assertSitesListed(doc, hosts);
    189 
    190  // Test the "Save Changes" button and accepting save
    191  removeDialogOpenPromise = BrowserTestUtils.promiseAlertDialogOpen(
    192    "accept",
    193    REMOVE_DIALOG_URL
    194  );
    195  settingsDialogClosePromise = promiseSettingsDialogClose();
    196  updatePromise = promiseSiteDataManagerSitesUpdated();
    197  frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    198  saveBtn = frameDoc.querySelector("dialog").getButton("accept");
    199  removeSelectedSite(hosts.slice(0, 2));
    200  assertSitesListed(doc, hosts.slice(2));
    201  saveBtn.doCommand();
    202  await removeDialogOpenPromise;
    203  await settingsDialogClosePromise;
    204  await updatePromise;
    205  await openSiteDataSettingsDialog();
    206  assertSitesListed(doc, hosts.slice(2));
    207 
    208  await SiteDataTestUtils.clear();
    209  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    210 
    211  function removeSelectedSite(removeHosts) {
    212    frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    213    let removeBtn = frameDoc.getElementById("removeSelected");
    214    is(
    215      removeBtn.disabled,
    216      true,
    217      "Should start with disabled removeSelected button"
    218    );
    219    let sitesList = frameDoc.getElementById("sitesList");
    220    removeHosts.forEach(host => {
    221      let site = sitesList.querySelector(`richlistitem[host="${host}"]`);
    222      if (site) {
    223        site.click();
    224        let currentSelectedIndex = sitesList.selectedIndex;
    225        is(
    226          removeBtn.disabled,
    227          false,
    228          "Should enable the removeSelected button"
    229        );
    230        removeBtn.doCommand();
    231        let newSelectedIndex = sitesList.selectedIndex;
    232        if (currentSelectedIndex >= sitesList.itemCount) {
    233          is(newSelectedIndex, currentSelectedIndex - 1);
    234        } else {
    235          is(newSelectedIndex, currentSelectedIndex);
    236        }
    237      } else {
    238        ok(false, `Should not select and remove inexistent site of ${host}`);
    239      }
    240    });
    241  }
    242 });
    243 
    244 // Test searching and then removing only visible sites
    245 add_task(async function () {
    246  let hosts = await addTestData([
    247    {
    248      usage: 1024,
    249      origin: "https://account.xyz.com",
    250      persisted: true,
    251    },
    252    {
    253      usage: 1024,
    254      origin: "https://shopping.xyz.com",
    255      persisted: false,
    256    },
    257    {
    258      usage: 1024,
    259      origin: "http://cinema.bar.com",
    260      persisted: true,
    261    },
    262    {
    263      usage: 1024,
    264      origin: "http://email.bar.com",
    265      persisted: false,
    266    },
    267  ]);
    268 
    269  let updatePromise = promiseSiteDataManagerSitesUpdated();
    270 
    271  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    272  await updatePromise;
    273  await openSiteDataSettingsDialog();
    274 
    275  // Search "foo" to only list foo.com sites
    276  let win = gBrowser.selectedBrowser.contentWindow;
    277  let doc = gBrowser.selectedBrowser.contentDocument;
    278  let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    279  let searchBox = frameDoc.getElementById("searchBox");
    280  await new Promise(resolve => {
    281    searchBox.addEventListener("MozInputSearch:search", resolve, {
    282      once: true,
    283    });
    284    searchBox.select();
    285    EventUtils.sendString("xyz");
    286  });
    287  assertSitesListed(
    288    doc,
    289    hosts.filter(host => host.includes("xyz"))
    290  );
    291 
    292  // Test only removing all visible sites listed
    293  updatePromise = promiseSiteDataManagerSitesUpdated();
    294  let acceptRemovePromise = BrowserTestUtils.promiseAlertDialogOpen(
    295    "accept",
    296    REMOVE_DIALOG_URL
    297  );
    298  let settingsDialogClosePromise = promiseSettingsDialogClose();
    299  let removeAllBtn = frameDoc.getElementById("removeAll");
    300  let saveBtn = frameDoc.querySelector("dialog").getButton("accept");
    301  removeAllBtn.doCommand();
    302  saveBtn.doCommand();
    303  await acceptRemovePromise;
    304  await settingsDialogClosePromise;
    305  await updatePromise;
    306  await openSiteDataSettingsDialog();
    307  assertSitesListed(
    308    doc,
    309    hosts.filter(host => !host.includes("xyz"))
    310  );
    311 
    312  await SiteDataTestUtils.clear();
    313  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    314 });
    315 
    316 // Test dynamically clearing all site data
    317 add_task(async function () {
    318  let hosts = await addTestData([
    319    {
    320      usage: 1024,
    321      origin: "https://account.xyz.com",
    322      persisted: true,
    323    },
    324    {
    325      usage: 1024,
    326      origin: "https://shopping.xyz.com",
    327      persisted: false,
    328    },
    329  ]);
    330 
    331  let updatePromise = promiseSiteDataManagerSitesUpdated();
    332 
    333  // Test the initial state
    334  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    335  await updatePromise;
    336  await openSiteDataSettingsDialog();
    337  let doc = gBrowser.selectedBrowser.contentDocument;
    338  assertSitesListed(doc, hosts);
    339 
    340  await addTestData([
    341    {
    342      usage: 1024,
    343      origin: "http://cinema.bar.com",
    344      persisted: true,
    345    },
    346    {
    347      usage: 1024,
    348      origin: "http://email.bar.com",
    349      persisted: false,
    350    },
    351  ]);
    352 
    353  // Test clearing all site data dynamically
    354  let win = gBrowser.selectedBrowser.contentWindow;
    355  let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    356  updatePromise = promiseSiteDataManagerSitesUpdated();
    357  let acceptRemovePromise = BrowserTestUtils.promiseAlertDialogOpen("accept");
    358  let settingsDialogClosePromise = promiseSettingsDialogClose();
    359  let removeAllBtn = frameDoc.getElementById("removeAll");
    360  let saveBtn = frameDoc.querySelector("dialog").getButton("accept");
    361  removeAllBtn.doCommand();
    362  saveBtn.doCommand();
    363  await acceptRemovePromise;
    364  await settingsDialogClosePromise;
    365  await updatePromise;
    366  await openSiteDataSettingsDialog();
    367  assertAllSitesNotListed(win);
    368 
    369  await SiteDataTestUtils.clear();
    370  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    371 });
    372 
    373 // Tests clearing search box content via backspace does not delete site data
    374 add_task(async function () {
    375  let hosts = await addTestData([
    376    {
    377      usage: 1024,
    378      origin: "https://account.xyz.com",
    379      persisted: true,
    380    },
    381    {
    382      usage: 1024,
    383      origin: "https://shopping.xyz.com",
    384      persisted: false,
    385    },
    386    {
    387      usage: 1024,
    388      origin: "http://cinema.bar.com",
    389      persisted: true,
    390    },
    391    {
    392      usage: 1024,
    393      origin: "http://email.bar.com",
    394      persisted: false,
    395    },
    396  ]);
    397 
    398  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    399  await openSiteDataSettingsDialog();
    400 
    401  let win = gBrowser.selectedBrowser.contentWindow;
    402  let doc = gBrowser.selectedBrowser.contentDocument;
    403  let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    404  let searchBox = frameDoc.getElementById("searchBox");
    405  await new Promise(resolve => {
    406    searchBox.addEventListener("MozInputSearch:search", resolve, {
    407      once: true,
    408    });
    409    searchBox.select();
    410    EventUtils.sendString("xyz");
    411  });
    412  assertSitesListed(
    413    doc,
    414    hosts.filter(host => host.includes("xyz"))
    415  );
    416 
    417  // Make sure the focus is on the search box
    418  searchBox.focus();
    419  if (AppConstants.platform == "macosx") {
    420    EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
    421  } else {
    422    EventUtils.synthesizeKey("VK_DELETE", {}, win);
    423  }
    424  assertSitesListed(
    425    doc,
    426    hosts.filter(host => host.includes("xyz"))
    427  );
    428 
    429  await SiteDataTestUtils.clear();
    430  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    431 });
    432 
    433 // Tests remove site data via backspace
    434 add_task(async function () {
    435  let hosts = await addTestData([
    436    {
    437      usage: 1024,
    438      origin: "https://account.xyz.com",
    439      persisted: true,
    440    },
    441    {
    442      usage: 1024,
    443      origin: "https://shopping.xyz.com",
    444      persisted: false,
    445    },
    446    {
    447      usage: 1024,
    448      origin: "http://cinema.bar.com",
    449      persisted: true,
    450    },
    451    {
    452      usage: 1024,
    453      origin: "http://email.bar.com",
    454      persisted: false,
    455    },
    456  ]);
    457 
    458  await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
    459  await openSiteDataSettingsDialog();
    460 
    461  let win = gBrowser.selectedBrowser.contentWindow;
    462  let doc = gBrowser.selectedBrowser.contentDocument;
    463  let frameDoc = win.gSubDialog._topDialog._frame.contentDocument;
    464  // Test initial state
    465  assertSitesListed(doc, hosts);
    466 
    467  let sitesList = frameDoc.getElementById("sitesList");
    468  let site = sitesList.querySelector(`richlistitem[host="xyz.com"]`);
    469  if (site) {
    470    // Move the focus from the search box to the list and select an item
    471    sitesList.focus();
    472    site.click();
    473    if (AppConstants.platform == "macosx") {
    474      EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
    475    } else {
    476      EventUtils.synthesizeKey("VK_DELETE", {}, win);
    477    }
    478  }
    479 
    480  assertSitesListed(
    481    doc,
    482    hosts.filter(host => !host.includes("xyz"))
    483  );
    484 
    485  await SiteDataTestUtils.clear();
    486  BrowserTestUtils.removeTab(gBrowser.selectedTab);
    487 });