browser_save_video_frame.js (3157B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const VIDEO_URL = 5 "http://mochi.test:8888/browser/browser/base/content/test/general/web_video.html"; 6 7 /** 8 * mockTransfer.js provides a utility that lets us mock out 9 * the "Save File" dialog. 10 */ 11 Services.scriptloader.loadSubScript( 12 "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js", 13 this 14 ); 15 16 /** 17 * Creates and returns an nsIFile for a new temporary save 18 * directory. 19 * 20 * @return nsIFile 21 */ 22 function createTemporarySaveDirectory() { 23 let saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile); 24 saveDir.append("testsavedir"); 25 if (!saveDir.exists()) { 26 saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755); 27 } 28 return saveDir; 29 } 30 /** 31 * MockTransfer exposes a "mockTransferCallback" global which 32 * allows us to define a callback to be called once the mock file 33 * selector has selected where to save the file. 34 */ 35 function waitForTransferComplete() { 36 return new Promise(resolve => { 37 mockTransferCallback = () => { 38 ok(true, "Transfer completed"); 39 mockTransferCallback = () => {}; 40 resolve(); 41 }; 42 }); 43 } 44 45 /** 46 * Loads a page with a <video> element, right-clicks it and chooses 47 * to save a frame screenshot to the disk. Completes once we've 48 * verified that the frame has been saved to disk. 49 */ 50 add_task(async function () { 51 let MockFilePicker = SpecialPowers.MockFilePicker; 52 MockFilePicker.init(window.browsingContext); 53 54 // Create the folder the video will be saved into. 55 let destDir = createTemporarySaveDirectory(); 56 let destFile = destDir.clone(); 57 58 MockFilePicker.displayDirectory = destDir; 59 MockFilePicker.showCallback = function (fp) { 60 destFile.append(fp.defaultString); 61 MockFilePicker.setFiles([destFile]); 62 MockFilePicker.filterIndex = 1; // kSaveAsType_URL 63 }; 64 65 mockTransferRegisterer.register(); 66 67 // Make sure that we clean these things up when we're done. 68 registerCleanupFunction(function () { 69 mockTransferRegisterer.unregister(); 70 MockFilePicker.cleanup(); 71 destDir.remove(true); 72 }); 73 74 let tab = BrowserTestUtils.addTab(gBrowser); 75 gBrowser.selectedTab = tab; 76 let browser = tab.linkedBrowser; 77 info("Loading video tab"); 78 await BrowserTestUtils.loadURIString({ 79 browser: tab.linkedBrowser, 80 uriString: VIDEO_URL, 81 }); 82 info("Video tab loaded."); 83 84 let context = document.getElementById("contentAreaContextMenu"); 85 let popupPromise = promisePopupShown(context); 86 87 info("Synthesizing right-click on video element"); 88 await BrowserTestUtils.synthesizeMouseAtCenter( 89 "#video1", 90 { type: "contextmenu", button: 2 }, 91 browser 92 ); 93 info("Waiting for popup to fire popupshown."); 94 await popupPromise; 95 info("Popup fired popupshown"); 96 97 let saveSnapshotCommand = document.getElementById("context-video-saveimage"); 98 let promiseTransfer = waitForTransferComplete(); 99 info("Firing save snapshot command"); 100 saveSnapshotCommand.doCommand(); 101 context.hidePopup(); 102 info("Waiting for transfer completion"); 103 await promiseTransfer; 104 info("Transfer complete"); 105 gBrowser.removeTab(tab); 106 });