tor-browser

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

test_ext_downloads_event_page.html (3368B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5  <title>Downloads Events Test</title>
      6  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
      7  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
      8  <script type="text/javascript" src="head.js"></script>
      9  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
     10 </head>
     11 <body>
     12 
     13 <script type="text/javascript">
     14 "use strict";
     15 
     16 add_task(async function test_downloads_event_page() {
     17  const apiEvents = ["onChanged"];
     18  const apiNs = "downloads";
     19  const extension = ExtensionTestUtils.loadExtension({
     20    useAddonManager: "permanent",
     21    manifest: {
     22 		browser_specific_settings: { gecko: { id: "eventpage@downloads" } },
     23      permissions: ["downloads"],
     24      background: { persistent: false },
     25    },
     26    background() {
     27      browser.downloads.onChanged.addListener(() => {
     28        browser.test.sendMessage("onChanged");
     29        browser.test.notifyPass("downloads-events");
     30      });
     31      browser.test.sendMessage("ready");
     32    },
     33  });
     34 
     35  // on startup, onChanged event listener should not be primed
     36  await extension.startup();
     37  info("Wait for event page to be started");
     38  await extension.awaitMessage("ready");
     39  await assertPersistentListeners(extension, apiNs, apiEvents, { primed: false });
     40 
     41  // when the extension is killed, onChanged event listener should be primed
     42  info("Terminate event page");
     43  await extension.terminateBackground();
     44  await assertPersistentListeners(extension, apiNs, apiEvents, { primed: true });
     45 
     46  // fire download-changed event and onChanged event listener should not be primed
     47  info("Wait for download-changed to be emitted");
     48  await SpecialPowers.spawnChrome([], async () => {
     49    const { DownloadTracker } = ChromeUtils.importESModule(
     50      "resource://gre/modules/GeckoViewWebExtension.sys.mjs"
     51    );
     52 
     53    const delta = {
     54      filename: "test.gif",
     55      id: 4,
     56      mime: "image/gif",
     57      totalBytes: 5,
     58    };
     59 
     60    // Mocks DownloadItem from mobile/shared/components/extensions/ext-downloads.js
     61    const downloadItem = {
     62      byExtensionId: "download-onChanged@tests.mozilla.org",
     63      byExtensionName: "Download",
     64      bytesReceived: 0,
     65      canResume: false,
     66      danger: "safe",
     67      exists: false,
     68      fileSize: -1,
     69      filename: "test.gif",
     70      id: 4,
     71      incognito: false,
     72      mime: "image/gif",
     73      paused: false,
     74      referrer: "",
     75      startTime: 1680818149350,
     76      state: "in_progress",
     77      totalBytes: 5,
     78      url: "http://localhost:4245/assets/www/images/test.gif",
     79    };
     80 
     81    // WebExtension.DownloadDelegate has not been overridden in
     82    // TestRunnerActivity (used by mochitests), so the downloads API
     83    // does not actually work. In this test, we are only interested in
     84    // whether or not dispatching an event would wake up the event page,
     85    // so we artificially trigger a fake onChanged event to test that.
     86    DownloadTracker.emit("download-changed", { delta, downloadItem });
     87  });
     88 
     89  info("Triggered download change, expecting downloads.onChanged event");
     90 
     91  await extension.awaitMessage("ready");
     92  await extension.awaitMessage("onChanged");
     93  await extension.awaitFinish("downloads-events");
     94  await assertPersistentListeners(extension, apiNs, apiEvents, { primed: false });
     95 
     96  await extension.unload();
     97 });
     98 
     99 </script>
    100 
    101 </body>
    102 </html>