tor-browser

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

browser_onbeforeunload_nested_with_delay.js (1824B)


      1 "use strict";
      2 
      3 add_task(async function () {
      4  const outer =
      5    "http://mochi.test:8888/browser/docshell/test/browser/file_onbeforeunload_nested_outer.html";
      6  await BrowserTestUtils.withNewTab(outer, async browser => {
      7    let inner = browser.browsingContext.children[0];
      8 
      9    // Install a beforeunload event handler that resolves a promise.
     10    await SpecialPowers.spawn(inner, [], () => {
     11      let { promise, resolve } = Promise.withResolvers();
     12      content.addEventListener(
     13        "beforeunload",
     14        e => {
     15          e.preventDefault();
     16          resolve();
     17        },
     18        {
     19          once: true,
     20        }
     21      );
     22      content.beforeunloadPromise = promise;
     23    });
     24 
     25    // Get the promise for the beforeunload handler so we can wait for it.
     26    let beforeunloadFired = SpecialPowers.spawn(
     27      browser.browsingContext.children[0],
     28      [],
     29      () => {
     30        return content.beforeunloadPromise;
     31      }
     32    );
     33 
     34    // Register whether a load has started.
     35    let loaded = BrowserTestUtils.browserLoaded(browser).then(() => "loaded");
     36 
     37    // This is rather fragile, but we need to make sure we don't start a
     38    // speculative load in the parent so let's give it the time to be done.
     39    let timeout = new Promise(resolve =>
     40      // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
     41      setTimeout(() => resolve("timeout"), 3000)
     42    );
     43 
     44    // Need to add some user interaction for beforeunload.
     45    await BrowserTestUtils.synthesizeMouse("body", 0, 0, {}, inner, true);
     46 
     47    // Try to start a speculative load in the parent.
     48    BrowserTestUtils.startLoadingURIString(browser, "https://example.com/");
     49 
     50    await beforeunloadFired;
     51 
     52    is(
     53      await Promise.race([loaded, timeout]),
     54      "timeout",
     55      "Timed out because the load was blocked by beforeunload."
     56    );
     57  });
     58 });