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 });