browser_save_video.js (3989B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 var MockFilePicker = SpecialPowers.MockFilePicker; 5 6 /** 7 * TestCase for bug 564387 8 * <https://bugzilla.mozilla.org/show_bug.cgi?id=564387> 9 */ 10 async function testSaveVideo(isUsingHeader = true) { 11 MockFilePicker.init(window.browsingContext); 12 var fileName; 13 14 let loadPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); 15 BrowserTestUtils.startLoadingURIString( 16 gBrowser, 17 "http://mochi.test:8888/browser/browser/base/content/test/general/web_video.html" 18 ); 19 await loadPromise; 20 21 let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown"); 22 23 await BrowserTestUtils.synthesizeMouseAtCenter( 24 "#video1", 25 { type: "contextmenu", button: 2 }, 26 gBrowser.selectedBrowser 27 ); 28 info("context menu click on video1"); 29 30 await popupShownPromise; 31 32 info("context menu opened on video1"); 33 34 // Create the folder the video will be saved into. 35 var destDir = createTemporarySaveDirectory(); 36 var destFile = destDir.clone(); 37 38 MockFilePicker.displayDirectory = destDir; 39 MockFilePicker.showCallback = function (fp) { 40 fileName = fp.defaultString; 41 destFile.append(fileName); 42 MockFilePicker.setFiles([destFile]); 43 MockFilePicker.filterIndex = 1; // kSaveAsType_URL 44 }; 45 46 let transferCompletePromise = new Promise(resolve => { 47 function onTransferComplete(downloadSuccess) { 48 ok( 49 downloadSuccess, 50 "Video file should have been downloaded successfully" 51 ); 52 53 if (isUsingHeader) { 54 is( 55 fileName, 56 "web-video1-expectedName.webm", 57 "Video file name is correctly retrieved from Content-Disposition http header" 58 ); 59 } 60 resolve(); 61 } 62 63 mockTransferCallback = onTransferComplete; 64 mockTransferRegisterer.register(); 65 }); 66 67 // Wrap in try...finally to ensure we clean up mocks and temp files. 68 // We can't use registerCleanupFunction easily because we need to clean up 69 // inside each task as well. 70 try { 71 // Select "Save Video As" option from context menu 72 var saveVideoCommand = document.getElementById("context-savevideo"); 73 saveVideoCommand.doCommand(); 74 info("context-savevideo command executed"); 75 76 let contextMenu = document.getElementById("contentAreaContextMenu"); 77 let popupHiddenPromise = BrowserTestUtils.waitForEvent( 78 contextMenu, 79 "popuphidden" 80 ); 81 contextMenu.hidePopup(); 82 await popupHiddenPromise; 83 84 await transferCompletePromise; 85 } finally { 86 mockTransferRegisterer.unregister(); 87 MockFilePicker.cleanup(); 88 destDir.remove(true); 89 } 90 } 91 92 Services.scriptloader.loadSubScript( 93 "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js", 94 this 95 ); 96 97 function createTemporarySaveDirectory() { 98 var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile); 99 saveDir.append("testsavedir"); 100 if (!saveDir.exists()) { 101 saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755); 102 } 103 return saveDir; 104 } 105 106 add_task(async function test_save_video_normal() { 107 return testSaveVideo(); 108 }); 109 110 /** 111 * Check that saving the file also works if the initial request times out. 112 */ 113 add_task(async function test_save_video_timed_out_request() { 114 await SpecialPowers.pushPrefEnv({ 115 set: [["browser.download.saveLinkAsFilenameTimeout", 0]], 116 }); 117 /* 118 * Note that this cannot rely on the header (we're deliberately trying to 119 * test the case where we don't get the headers), but also cannot 120 * assume that it is never present. That is, if network bits are very very 121 * fast and/or our cancellation timeout fires late, we might be testing 122 * the same thing as the previous test. So we just don't bother asserting 123 * anything about the filename coming from the header - we just want to 124 * make sure that the file is still saved in this case. 125 */ 126 await testSaveVideo(/* isUsingHeader */ false); 127 await SpecialPowers.popPrefEnv(); 128 });