113 lines
3.8 KiB
JavaScript
113 lines
3.8 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const PERMISSION_DIALOG =
|
|
"chrome://mozapps/content/handling/permissionDialog.xhtml";
|
|
|
|
add_setup(async function () {
|
|
// Set a new handler as default.
|
|
const protoSvc = Cc[
|
|
"@mozilla.org/uriloader/external-protocol-service;1"
|
|
].getService(Ci.nsIExternalProtocolService);
|
|
let protoInfo = protoSvc.getProtocolHandlerInfo("web+testprotocol");
|
|
protoInfo.preferredAction = protoInfo.useHelperApp;
|
|
let handler = Cc["@mozilla.org/uriloader/web-handler-app;1"].createInstance(
|
|
Ci.nsIWebHandlerApp
|
|
);
|
|
handler.uriTemplate = "https://example.com/foobar?uri=%s";
|
|
handler.name = "Test protocol";
|
|
let handlers = protoInfo.possibleApplicationHandlers;
|
|
handlers.appendElement(handler);
|
|
|
|
protoInfo.preferredApplicationHandler = handler;
|
|
protoInfo.alwaysAskBeforeHandling = false;
|
|
|
|
const handlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService(
|
|
Ci.nsIHandlerService
|
|
);
|
|
handlerSvc.store(protoInfo);
|
|
|
|
registerCleanupFunction(() => {
|
|
handlerSvc.remove(protoInfo);
|
|
});
|
|
});
|
|
|
|
add_task(async function test_promptWhileNotForeground() {
|
|
await BrowserTestUtils.withNewTab("about:blank", async browser => {
|
|
let windowOpened = BrowserTestUtils.waitForNewWindow();
|
|
await SpecialPowers.spawn(browser, [], () => {
|
|
content.eval(`window.open('about:blank', "_blank", "height=600");`);
|
|
});
|
|
let otherWin = await windowOpened;
|
|
info("Opened extra window, now start a prompt.");
|
|
|
|
// To ensure we test the delay helper correctly, shorten the delay:
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["security.dialog_enable_delay", 50]],
|
|
});
|
|
|
|
let promptPromise = BrowserTestUtils.promiseAlertDialogOpen(
|
|
null,
|
|
PERMISSION_DIALOG,
|
|
{ isSubDialog: true }
|
|
);
|
|
await SpecialPowers.spawn(browser, [], () => {
|
|
content.document.location.href = "web+testprotocol:hello";
|
|
});
|
|
info("Started opening prompt.");
|
|
let prompt = await promptPromise;
|
|
info("Opened prompt.");
|
|
let dialog = prompt.document.querySelector("dialog");
|
|
let button = dialog.getButton("accept");
|
|
is(button.getAttribute("disabled"), "true", "Button should be disabled");
|
|
|
|
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
|
await new Promise(r => setTimeout(r, 500));
|
|
is(
|
|
button.getAttribute("disabled"),
|
|
"true",
|
|
"Button should still be disabled while the dialog is in the background"
|
|
);
|
|
|
|
let buttonGetsEnabled = BrowserTestUtils.waitForMutationCondition(
|
|
button,
|
|
{ attributeFilter: ["disabled"] },
|
|
() => button.getAttribute("disabled") != "true"
|
|
);
|
|
await BrowserTestUtils.closeWindow(otherWin);
|
|
info("Waiting for button to be enabled.");
|
|
await buttonGetsEnabled;
|
|
ok(true, "The button was enabled.");
|
|
dialog.cancelDialog();
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
});
|
|
|
|
add_task(async function test_promptWhileForeground() {
|
|
await BrowserTestUtils.withNewTab("about:blank", async browser => {
|
|
let promptPromise = BrowserTestUtils.promiseAlertDialogOpen(
|
|
null,
|
|
PERMISSION_DIALOG,
|
|
{ isSubDialog: true }
|
|
);
|
|
await SpecialPowers.spawn(browser, [], () => {
|
|
content.document.location.href = "web+testprotocol:hello";
|
|
});
|
|
info("Started opening prompt.");
|
|
let prompt = await promptPromise;
|
|
info("Opened prompt.");
|
|
let dialog = prompt.document.querySelector("dialog");
|
|
let button = dialog.getButton("accept");
|
|
is(button.getAttribute("disabled"), "true", "Button should be disabled");
|
|
await BrowserTestUtils.waitForMutationCondition(
|
|
button,
|
|
{ attributeFilter: ["disabled"] },
|
|
() => button.getAttribute("disabled") != "true"
|
|
);
|
|
ok(true, "The button was enabled.");
|
|
dialog.cancelDialog();
|
|
});
|
|
});
|