browser_bug1798178.js (2667B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 Services.scriptloader.loadSubScript( 7 "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js", 8 this 9 ); 10 11 const TEST_URL = 12 getRootDirectory(gTestPath).replace( 13 "chrome://mochitests/content", 14 "https://example.com" 15 ) + "file_bug1798178.html"; 16 17 let MockFilePicker = SpecialPowers.MockFilePicker; 18 MockFilePicker.init(window.browsingContext); 19 20 function createTemporarySaveDirectory() { 21 let saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile); 22 saveDir.append("testsavedir"); 23 if (!saveDir.exists()) { 24 info("create testsavedir!"); 25 saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755); 26 } 27 info("return from createTempSaveDir: " + saveDir.path); 28 return saveDir; 29 } 30 31 add_task(async function test_save_link_cross_origin() { 32 await SpecialPowers.pushPrefEnv({ 33 set: [["browser.opaqueResponseBlocking", true]], 34 }); 35 await BrowserTestUtils.withNewTab(TEST_URL, async browser => { 36 let menu = document.getElementById("contentAreaContextMenu"); 37 let popupShown = BrowserTestUtils.waitForEvent(menu, "popupshown"); 38 BrowserTestUtils.synthesizeMouseAtCenter( 39 "a[href]", 40 { type: "contextmenu", button: 2 }, 41 browser 42 ); 43 await popupShown; 44 45 let filePickerShow = new Promise(r => { 46 MockFilePicker.showCallback = function (fp) { 47 ok(true, "filepicker should be shown"); 48 info("MockFilePicker showCallback"); 49 50 let fileName = fp.defaultString; 51 destFile = tempDir.clone(); 52 destFile.append(fileName); 53 54 MockFilePicker.setFiles([destFile]); 55 MockFilePicker.filterIndex = 1; // kSaveAsType_URL 56 57 info("MockFilePicker showCallback done"); 58 r(); 59 }; 60 }); 61 62 info("Let's create a temporary dir"); 63 let tempDir = createTemporarySaveDirectory(); 64 let destFile; 65 66 MockFilePicker.displayDirectory = tempDir; 67 68 let transferCompletePromise = new Promise(resolve => { 69 function onTransferComplete(downloadSuccess) { 70 ok(downloadSuccess, "File should have been downloaded successfully"); 71 resolve(); 72 } 73 mockTransferCallback = onTransferComplete; 74 mockTransferRegisterer.register(); 75 }); 76 77 let saveLinkCommand = document.getElementById("context-savelink"); 78 info("saveLinkCommand: " + saveLinkCommand); 79 saveLinkCommand.doCommand(); 80 81 await filePickerShow; 82 83 let popupHiddenPromise = BrowserTestUtils.waitForEvent(menu, "popuphidden"); 84 menu.hidePopup(); 85 await popupHiddenPromise; 86 87 await transferCompletePromise; 88 }); 89 });