tor-browser

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

browser_fullscreen-document-mutation-race.js (3262B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 requestLongerTimeout(2);
      7 
      8 // Import helpers
      9 Services.scriptloader.loadSubScript(
     10  "chrome://mochitests/content/browser/dom/base/test/fullscreen/fullscreen_helpers.js",
     11  this
     12 );
     13 
     14 add_setup(async function () {
     15  await pushPrefs(
     16    ["test.wait300msAfterTabSwitch", true],
     17    ["full-screen-api.transition-duration.enter", "0 0"],
     18    ["full-screen-api.transition-duration.leave", "0 0"],
     19    ["full-screen-api.allow-trusted-requests-only", false]
     20  );
     21 });
     22 
     23 async function startTests(setupFun, name) {
     24  TEST_URLS.forEach(url => {
     25    add_task(async () => {
     26      info(`Test ${name}, url: ${url}`);
     27      await BrowserTestUtils.withNewTab(
     28        {
     29          gBrowser,
     30          url,
     31        },
     32        async function (browser) {
     33          let promiseFsState = Promise.all([
     34            setupFun(browser),
     35            waitForFullscreenState(document, false, true),
     36          ]);
     37          // Trigger click event in inner most iframe
     38          SpecialPowers.spawn(
     39            browser.browsingContext.children[0].children[0],
     40            [],
     41            function () {
     42              content.setTimeout(() => {
     43                content.document.getElementById("div").click();
     44              }, 0);
     45            }
     46          );
     47          await promiseFsState;
     48 
     49          // Ensure the browser exits fullscreen state.
     50          ok(
     51            !window.fullScreen,
     52            "The chrome window should not be in fullscreen"
     53          );
     54          ok(
     55            !document.documentElement.hasAttribute("inDOMFullscreen"),
     56            "The chrome document should not be in fullscreen"
     57          );
     58        }
     59      );
     60    });
     61  });
     62 }
     63 
     64 function RemoveElementFromRemoteDocument(aBrowsingContext, aElementId) {
     65  return SpecialPowers.spawn(
     66    aBrowsingContext,
     67    [aElementId],
     68    async function (id) {
     69      content.document.addEventListener(
     70        "fullscreenchange",
     71        function () {
     72          content.document.getElementById(id).remove();
     73        },
     74        { once: true }
     75      );
     76    }
     77  );
     78 }
     79 
     80 startTests(async browser => {
     81  // toplevel
     82  let promise = waitRemoteFullscreenExitEvents([
     83    // browsingContext, name
     84    [browser.browsingContext, "toplevel"],
     85  ]);
     86  await RemoveElementFromRemoteDocument(browser.browsingContext, "div");
     87  return promise;
     88 }, "document_mutation_toplevel");
     89 
     90 startTests(async browser => {
     91  // middle iframe
     92  let promise = waitRemoteFullscreenExitEvents([
     93    // browsingContext, name
     94    [browser.browsingContext, "toplevel"],
     95    [browser.browsingContext.children[0], "middle"],
     96  ]);
     97  await RemoveElementFromRemoteDocument(
     98    browser.browsingContext.children[0],
     99    "div"
    100  );
    101  return promise;
    102 }, "document_mutation_middle_frame");
    103 
    104 startTests(async browser => {
    105  // innermost iframe
    106  let promise = waitRemoteFullscreenExitEvents([
    107    // browsingContext, name
    108    [browser.browsingContext, "toplevel"],
    109    [browser.browsingContext.children[0], "middle"],
    110    [browser.browsingContext.children[0].children[0], "inner"],
    111  ]);
    112  await RemoveElementFromRemoteDocument(
    113    browser.browsingContext.children[0].children[0],
    114    "div"
    115  );
    116  return promise;
    117 }, "document_mutation_inner_frame");