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>