browser_contextmenu_save_blocked.js (2452B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 var MockFilePicker = SpecialPowers.MockFilePicker; 7 MockFilePicker.init(window.browsingContext); 8 9 function mockPromptService() { 10 let { prompt } = Services; 11 let promptService = { 12 QueryInterface: ChromeUtils.generateQI(["nsIPromptService"]), 13 alert: () => {}, 14 }; 15 Services.prompt = promptService; 16 registerCleanupFunction(() => { 17 Services.prompt = prompt; 18 }); 19 return promptService; 20 } 21 22 add_setup(async function () { 23 await SpecialPowers.pushPrefEnv({ 24 set: [["test.wait300msAfterTabSwitch", true]], 25 }); 26 }); 27 28 add_task(async function test_save_link_blocked_by_extension() { 29 let ext = ExtensionTestUtils.loadExtension({ 30 manifest: { 31 browser_specific_settings: { gecko: { id: "cancel@test" } }, 32 name: "Cancel Test", 33 permissions: ["webRequest", "webRequestBlocking", "<all_urls>"], 34 }, 35 36 background() { 37 // eslint-disable-next-line no-undef 38 browser.webRequest.onBeforeRequest.addListener( 39 details => { 40 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 41 return { cancel: details.url === "http://example.com/" }; 42 }, 43 { urls: ["*://*/*"] }, 44 ["blocking"] 45 ); 46 }, 47 }); 48 await ext.startup(); 49 50 await BrowserTestUtils.withNewTab( 51 `data:text/html;charset=utf-8,<a href="http://example.com">Download</a>`, 52 async browser => { 53 let menu = document.getElementById("contentAreaContextMenu"); 54 let popupShown = BrowserTestUtils.waitForEvent(menu, "popupshown"); 55 BrowserTestUtils.synthesizeMouseAtCenter( 56 "a[href]", 57 { type: "contextmenu", button: 2 }, 58 browser 59 ); 60 await popupShown; 61 62 await new Promise(resolve => { 63 let promptService = mockPromptService(); 64 promptService.alert = (window, title, msg) => { 65 is( 66 msg, 67 "The download cannot be saved because it is blocked by Cancel Test.", 68 "prompt should be shown" 69 ); 70 setTimeout(resolve, 0); 71 }; 72 73 MockFilePicker.showCallback = function () { 74 ok(false, "filepicker should never been shown"); 75 setTimeout(resolve, 0); 76 return Ci.nsIFilePicker.returnCancel; 77 }; 78 menu.activateItem(menu.querySelector("#context-savelink")); 79 }); 80 } 81 ); 82 83 await ext.unload(); 84 });