browser_promptDelays.js (3882B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const PERMISSION_DIALOG = 7 "chrome://mozapps/content/handling/permissionDialog.xhtml"; 8 9 add_setup(async function () { 10 // Set a new handler as default. 11 const protoSvc = Cc[ 12 "@mozilla.org/uriloader/external-protocol-service;1" 13 ].getService(Ci.nsIExternalProtocolService); 14 let protoInfo = protoSvc.getProtocolHandlerInfo("web+testprotocol"); 15 protoInfo.preferredAction = protoInfo.useHelperApp; 16 let handler = Cc["@mozilla.org/uriloader/web-handler-app;1"].createInstance( 17 Ci.nsIWebHandlerApp 18 ); 19 handler.uriTemplate = "https://example.com/foobar?uri=%s"; 20 handler.name = "Test protocol"; 21 let handlers = protoInfo.possibleApplicationHandlers; 22 handlers.appendElement(handler); 23 24 protoInfo.preferredApplicationHandler = handler; 25 protoInfo.alwaysAskBeforeHandling = false; 26 27 const handlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService( 28 Ci.nsIHandlerService 29 ); 30 handlerSvc.store(protoInfo); 31 32 registerCleanupFunction(() => { 33 handlerSvc.remove(protoInfo); 34 }); 35 }); 36 37 add_task(async function test_promptWhileNotForeground() { 38 await BrowserTestUtils.withNewTab("about:blank", async browser => { 39 let windowOpened = BrowserTestUtils.waitForNewWindow(); 40 await SpecialPowers.spawn(browser, [], () => { 41 content.eval(`window.open('about:blank', "_blank", "height=600");`); 42 }); 43 let otherWin = await windowOpened; 44 info("Opened extra window, now start a prompt."); 45 46 // To ensure we test the delay helper correctly, shorten the delay: 47 await SpecialPowers.pushPrefEnv({ 48 set: [["security.dialog_enable_delay", 50]], 49 }); 50 51 let promptPromise = BrowserTestUtils.promiseAlertDialogOpen( 52 null, 53 PERMISSION_DIALOG, 54 { isSubDialog: true } 55 ); 56 await SpecialPowers.spawn(browser, [], () => { 57 content.document.location.href = "web+testprotocol:hello"; 58 }); 59 info("Started opening prompt."); 60 let prompt = await promptPromise; 61 info("Opened prompt."); 62 let dialog = prompt.document.querySelector("dialog"); 63 let button = dialog.getButton("accept"); 64 is(button.getAttribute("disabled"), "true", "Button should be disabled"); 65 66 // eslint-disable-next-line mozilla/no-arbitrary-setTimeout 67 await new Promise(r => setTimeout(r, 500)); 68 is( 69 button.getAttribute("disabled"), 70 "true", 71 "Button should still be disabled while the dialog is in the background" 72 ); 73 74 let buttonGetsEnabled = BrowserTestUtils.waitForMutationCondition( 75 button, 76 { attributeFilter: ["disabled"] }, 77 () => button.getAttribute("disabled") != "true" 78 ); 79 await BrowserTestUtils.closeWindow(otherWin); 80 info("Waiting for button to be enabled."); 81 await buttonGetsEnabled; 82 ok(true, "The button was enabled."); 83 dialog.cancelDialog(); 84 85 await SpecialPowers.popPrefEnv(); 86 }); 87 }); 88 89 add_task(async function test_promptWhileForeground() { 90 await BrowserTestUtils.withNewTab("about:blank", async browser => { 91 let promptPromise = BrowserTestUtils.promiseAlertDialogOpen( 92 null, 93 PERMISSION_DIALOG, 94 { isSubDialog: true } 95 ); 96 await SpecialPowers.spawn(browser, [], () => { 97 content.document.location.href = "web+testprotocol:hello"; 98 }); 99 info("Started opening prompt."); 100 let prompt = await promptPromise; 101 info("Opened prompt."); 102 let dialog = prompt.document.querySelector("dialog"); 103 let button = dialog.getButton("accept"); 104 is(button.getAttribute("disabled"), "true", "Button should be disabled"); 105 await BrowserTestUtils.waitForMutationCondition( 106 button, 107 { attributeFilter: ["disabled"] }, 108 () => button.getAttribute("disabled") != "true" 109 ); 110 ok(true, "The button was enabled."); 111 dialog.cancelDialog(); 112 }); 113 });