tor-browser

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

browser_test_data_download.js (3390B)


      1 "use strict";
      2 
      3 const kTestPath = getRootDirectory(gTestPath).replace(
      4  "chrome://mochitests/content",
      5  "http://example.com"
      6 );
      7 const kTestURI = kTestPath + "file_data_download.html";
      8 
      9 function addWindowListener(aURL) {
     10  return new Promise(resolve => {
     11    Services.wm.addListener({
     12      onOpenWindow(aXULWindow) {
     13        info("window opened, waiting for focus");
     14        Services.wm.removeListener(this);
     15        var domwindow = aXULWindow.docShell.domWindow;
     16        waitForFocus(function () {
     17          is(
     18            domwindow.document.location.href,
     19            aURL,
     20            "should have seen the right window open"
     21          );
     22          resolve(domwindow);
     23        }, domwindow);
     24      },
     25      onCloseWindow() {},
     26    });
     27  });
     28 }
     29 
     30 function waitDelay(delay) {
     31  return new Promise(resolve => {
     32    /* eslint-disable mozilla/no-arbitrary-setTimeout */
     33    window.setTimeout(resolve, delay);
     34  });
     35 }
     36 
     37 function promisePanelOpened() {
     38  if (DownloadsPanel.panel && DownloadsPanel.panel.state == "open") {
     39    return Promise.resolve();
     40  }
     41  return BrowserTestUtils.waitForEvent(DownloadsPanel.panel, "popupshown");
     42 }
     43 
     44 add_task(async function test_with_downloads_pref_disabled() {
     45  waitForExplicitFinish();
     46  await SpecialPowers.pushPrefEnv({
     47    set: [
     48      ["security.data_uri.block_toplevel_data_uri_navigations", true],
     49      ["browser.download.always_ask_before_handling_new_types", true],
     50    ],
     51  });
     52  let windowPromise = addWindowListener(
     53    "chrome://mozapps/content/downloads/unknownContentType.xhtml"
     54  );
     55  BrowserTestUtils.startLoadingURIString(gBrowser, kTestURI);
     56  let win = await windowPromise;
     57 
     58  is(
     59    win.document.getElementById("location").value,
     60    "data-foo.html",
     61    "file name of download should match"
     62  );
     63 
     64  let mainWindowActivated = BrowserTestUtils.waitForEvent(window, "activate");
     65  await BrowserTestUtils.closeWindow(win);
     66  await mainWindowActivated;
     67 });
     68 
     69 add_task(async function test_with_always_ask_pref_disabled() {
     70  waitForExplicitFinish();
     71  await SpecialPowers.pushPrefEnv({
     72    set: [
     73      ["security.data_uri.block_toplevel_data_uri_navigations", true],
     74      ["browser.download.always_ask_before_handling_new_types", false],
     75    ],
     76  });
     77  let downloadsPanelPromise = promisePanelOpened();
     78  let downloadsPromise = Downloads.getList(Downloads.PUBLIC);
     79 
     80  BrowserTestUtils.startLoadingURIString(gBrowser, kTestURI);
     81  // wait until downloadsPanel opens before continuing with test
     82  await downloadsPanelPromise;
     83  let downloadList = await downloadsPromise;
     84 
     85  is(DownloadsPanel.isPanelShowing, true, "DownloadsPanel should be open.");
     86  is(
     87    downloadList._downloads.length,
     88    1,
     89    "File should be successfully downloaded."
     90  );
     91 
     92  let [download] = downloadList._downloads;
     93  is(download.contentType, "text/html", "File contentType should be correct.");
     94  is(
     95    download.source.url,
     96    "data:text/html,<body>data download</body>",
     97    "File name should be correct."
     98  );
     99 
    100  info("cleaning up downloads");
    101  try {
    102    if (Services.appinfo.OS === "WINNT") {
    103      // We need to make the file writable to delete it on Windows.
    104      await IOUtils.setPermissions(download.target.path, 0o600);
    105    }
    106    await IOUtils.remove(download.target.path);
    107  } catch (error) {
    108    info("The file " + download.target.path + " is not removed, " + error);
    109  }
    110 
    111  await downloadList.remove(download);
    112  await download.finalize();
    113 });