tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });