mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-10-31 16:28:05 +02:00 
			
		
		
		
	 623a4bb9e6
			
		
	
	
		623a4bb9e6
		
	
	
	
	
		
			
			The OGG Theora files have been replaced with functionally equivalent WebM containing VP9. Differential Revision: https://phabricator.services.mozilla.com/D204641
		
			
				
	
	
		
			225 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var MockFilePicker = SpecialPowers.MockFilePicker;
 | |
| MockFilePicker.init(window.browsingContext);
 | |
| 
 | |
| function waitForNewWindow() {
 | |
|   return new Promise(resolve => {
 | |
|     var listener = {
 | |
|       onOpenWindow: aXULWindow => {
 | |
|         info("Download window shown...");
 | |
|         Services.wm.removeListener(listener);
 | |
| 
 | |
|         function downloadOnLoad() {
 | |
|           domwindow.removeEventListener("load", downloadOnLoad, true);
 | |
| 
 | |
|           is(
 | |
|             domwindow.document.location.href,
 | |
|             "chrome://mozapps/content/downloads/unknownContentType.xhtml",
 | |
|             "Download page appeared"
 | |
|           );
 | |
|           resolve(domwindow);
 | |
|         }
 | |
| 
 | |
|         var domwindow = aXULWindow.docShell.domWindow;
 | |
|         domwindow.addEventListener("load", downloadOnLoad, true);
 | |
|       },
 | |
|       onCloseWindow: () => {},
 | |
|     };
 | |
| 
 | |
|     Services.wm.addListener(listener);
 | |
|     registerCleanupFunction(() => {
 | |
|       try {
 | |
|         Services.wm.removeListener(listener);
 | |
|       } catch (e) {}
 | |
|     });
 | |
|   });
 | |
| }
 | |
| 
 | |
| async function waitForFilePickerTest(link, name) {
 | |
|   let filePickerShownPromise = new Promise(resolve => {
 | |
|     MockFilePicker.showCallback = function (fp) {
 | |
|       ok(true, "Filepicker shown.");
 | |
|       is(name, fp.defaultString, " filename matches download name");
 | |
|       setTimeout(resolve, 0);
 | |
|       return Ci.nsIFilePicker.returnCancel;
 | |
|     };
 | |
|   });
 | |
| 
 | |
|   SpecialPowers.spawn(gBrowser.selectedBrowser, [link], contentLink => {
 | |
|     content.document.getElementById(contentLink).click();
 | |
|   });
 | |
| 
 | |
|   await filePickerShownPromise;
 | |
| 
 | |
|   await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
 | |
|     Assert.equal(
 | |
|       content.document.getElementById("unload-flag").textContent,
 | |
|       "Okay",
 | |
|       "beforeunload shouldn't have fired"
 | |
|     );
 | |
|   });
 | |
| }
 | |
| 
 | |
| async function testLink(link, name) {
 | |
|   info("Checking " + link + " with name: " + name);
 | |
| 
 | |
|   if (
 | |
|     Services.prefs.getBoolPref(
 | |
|       "browser.download.always_ask_before_handling_new_types",
 | |
|       false
 | |
|     )
 | |
|   ) {
 | |
|     let winPromise = waitForNewWindow();
 | |
| 
 | |
|     SpecialPowers.spawn(gBrowser.selectedBrowser, [link], contentLink => {
 | |
|       content.document.getElementById(contentLink).click();
 | |
|     });
 | |
| 
 | |
|     let win = await winPromise;
 | |
| 
 | |
|     await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
 | |
|       Assert.equal(
 | |
|         content.document.getElementById("unload-flag").textContent,
 | |
|         "Okay",
 | |
|         "beforeunload shouldn't have fired"
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     is(
 | |
|       win.document.getElementById("location").value,
 | |
|       name,
 | |
|       `file name should match (${link})`
 | |
|     );
 | |
| 
 | |
|     await BrowserTestUtils.closeWindow(win);
 | |
|   } else {
 | |
|     await waitForFilePickerTest(link, name);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Cross-origin URL does not trigger a download
 | |
| async function testLocation(link) {
 | |
|   let tabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
 | |
| 
 | |
|   SpecialPowers.spawn(gBrowser.selectedBrowser, [link], contentLink => {
 | |
|     content.document.getElementById(contentLink).click();
 | |
|   });
 | |
| 
 | |
|   let tab = await tabPromise;
 | |
|   BrowserTestUtils.removeTab(tab);
 | |
| }
 | |
| 
 | |
| async function runTest(url) {
 | |
|   let tab = BrowserTestUtils.addTab(gBrowser, url);
 | |
|   gBrowser.selectedTab = tab;
 | |
| 
 | |
|   let browser = gBrowser.getBrowserForTab(tab);
 | |
|   await BrowserTestUtils.browserLoaded(browser);
 | |
| 
 | |
|   await testLink("link1", "test.txt");
 | |
|   await testLink("link2", "video.webm");
 | |
|   await testLink("link3", "just some video.webm");
 | |
|   await testLink("link4", "with-target.txt");
 | |
|   await testLink("link5", "javascript.html");
 | |
|   await testLink("link6", "test.blob");
 | |
|   await testLink("link7", "test.file");
 | |
|   await testLink("link8", "download_page_3.txt");
 | |
|   await testLink("link9", "download_page_3.txt");
 | |
|   await testLink("link10", "download_page_4.txt");
 | |
|   await testLink("link11", "download_page_4.txt");
 | |
|   // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | |
|   await testLocation("link12", "http://example.com/");
 | |
| 
 | |
|   // Check that we enforce the correct extension if the website's
 | |
|   // is bogus or missing. These extensions can differ slightly (ogx vs ogg,
 | |
|   // htm vs html) on different OSes.
 | |
|   let webmExtension = getMIMEInfoForType("video/webm").primaryExtension;
 | |
|   await testLink("link13", "no file extension." + webmExtension);
 | |
| 
 | |
|   // See https://bugzilla.mozilla.org/show_bug.cgi?id=1690051#c8
 | |
|   if (AppConstants.platform != "win") {
 | |
|     const PREF = "browser.download.sanitize_non_media_extensions";
 | |
|     ok(Services.prefs.getBoolPref(PREF), "pref is set before");
 | |
| 
 | |
|     // Check that ics (iCal) extension is changed/fixed when the pref is true.
 | |
|     await testLink("link14", "dummy.ics");
 | |
| 
 | |
|     // And not changed otherwise.
 | |
|     Services.prefs.setBoolPref(PREF, false);
 | |
|     await testLink("link14", "dummy.not-ics");
 | |
|     Services.prefs.clearUserPref(PREF);
 | |
|   }
 | |
| 
 | |
|   await testLink("link15", "download_page_3.txt");
 | |
|   await testLink("link16", "download_page_3.txt");
 | |
|   await testLink("link17", "download_page_4.txt");
 | |
|   await testLink("link18", "download_page_4.txt");
 | |
|   await testLink("link19", "download_page_4.txt");
 | |
|   await testLink("link20", "download_page_4.txt");
 | |
|   await testLink("link21", "download_page_4.txt");
 | |
|   await testLink("link22", "download_page_4.txt");
 | |
| 
 | |
|   BrowserTestUtils.removeTab(tab);
 | |
| }
 | |
| 
 | |
| async function setDownloadDir() {
 | |
|   let tmpDir = PathUtils.join(
 | |
|     PathUtils.tempDir,
 | |
|     "testsavedir" + Math.floor(Math.random() * 2 ** 32)
 | |
|   );
 | |
|   // Create this dir if it doesn't exist (ignores existing dirs)
 | |
|   await IOUtils.makeDirectory(tmpDir);
 | |
|   registerCleanupFunction(async function () {
 | |
|     try {
 | |
|       await IOUtils.remove(tmpDir, { recursive: true });
 | |
|     } catch (e) {
 | |
|       console.error(e);
 | |
|     }
 | |
|     Services.prefs.clearUserPref("browser.download.folderList");
 | |
|     Services.prefs.clearUserPref("browser.download.dir");
 | |
|   });
 | |
|   Services.prefs.setIntPref("browser.download.folderList", 2);
 | |
|   Services.prefs.setCharPref("browser.download.dir", tmpDir);
 | |
| }
 | |
| 
 | |
| add_task(async function () {
 | |
|   requestLongerTimeout(3);
 | |
|   waitForExplicitFinish();
 | |
| 
 | |
|   await setDownloadDir();
 | |
| 
 | |
|   info(
 | |
|     "Test with browser.download.always_ask_before_handling_new_types enabled."
 | |
|   );
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [
 | |
|       ["browser.download.always_ask_before_handling_new_types", true],
 | |
|       ["browser.download.useDownloadDir", true],
 | |
|     ],
 | |
|   });
 | |
| 
 | |
|   await runTest(
 | |
|     "http://mochi.test:8888/browser/browser/base/content/test/general/download_page.html"
 | |
|   );
 | |
|   await runTest(
 | |
|     "https://example.com:443/browser/browser/base/content/test/general/download_page.html"
 | |
|   );
 | |
| 
 | |
|   info(
 | |
|     "Test with browser.download.always_ask_before_handling_new_types disabled."
 | |
|   );
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [
 | |
|       ["browser.download.always_ask_before_handling_new_types", false],
 | |
|       ["browser.download.useDownloadDir", false],
 | |
|     ],
 | |
|   });
 | |
| 
 | |
|   await runTest(
 | |
|     "http://mochi.test:8888/browser/browser/base/content/test/general/download_page.html"
 | |
|   );
 | |
|   await runTest(
 | |
|     "https://example.com:443/browser/browser/base/content/test/general/download_page.html"
 | |
|   );
 | |
| 
 | |
|   MockFilePicker.cleanup();
 | |
| });
 |