tor-browser

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

browser_fullscreen-document-mutation.js (3296B)


      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(testFun, 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 = waitForFullscreenState(document, true);
     34          // Trigger click event in inner most iframe
     35          SpecialPowers.spawn(
     36            browser.browsingContext.children[0].children[0],
     37            [],
     38            function () {
     39              content.setTimeout(() => {
     40                content.document.getElementById("div").click();
     41              }, 0);
     42            }
     43          );
     44          await promiseFsState;
     45 
     46          // This should exit fullscreen
     47          promiseFsState = waitForFullscreenState(document, false);
     48          await testFun(browser);
     49          await promiseFsState;
     50 
     51          // Ensure the browser exits fullscreen state.
     52          ok(
     53            !window.fullScreen,
     54            "The chrome window should not be in fullscreen"
     55          );
     56          ok(
     57            !document.documentElement.hasAttribute("inDOMFullscreen"),
     58            "The chrome document should not be in fullscreen"
     59          );
     60        }
     61      );
     62    });
     63  });
     64 }
     65 
     66 function RemoveElementFromRemoteDocument(aBrowsingContext, aElementId) {
     67  return SpecialPowers.spawn(
     68    aBrowsingContext,
     69    [aElementId],
     70    async function (id) {
     71      content.document.getElementById(id).remove();
     72    }
     73  );
     74 }
     75 
     76 startTests(async browser => {
     77  let promiseRemoteFsState = waitRemoteFullscreenExitEvents([
     78    // browsingContext, name
     79    [browser.browsingContext, "toplevel"],
     80  ]);
     81  // toplevel
     82  await RemoveElementFromRemoteDocument(browser.browsingContext, "div");
     83  await promiseRemoteFsState;
     84 }, "document_mutation_toplevel");
     85 
     86 startTests(async browser => {
     87  let promiseRemoteFsState = waitRemoteFullscreenExitEvents([
     88    // browsingContext, name
     89    [browser.browsingContext, "toplevel"],
     90    [browser.browsingContext.children[0], "middle"],
     91  ]);
     92  // middle iframe
     93  await RemoveElementFromRemoteDocument(
     94    browser.browsingContext.children[0],
     95    "div"
     96  );
     97  await promiseRemoteFsState;
     98 }, "document_mutation_middle_frame");
     99 
    100 startTests(async browser => {
    101  let promiseRemoteFsState = waitRemoteFullscreenExitEvents([
    102    // browsingContext, name
    103    [browser.browsingContext, "toplevel"],
    104    [browser.browsingContext.children[0], "middle"],
    105    [browser.browsingContext.children[0].children[0], "inner"],
    106  ]);
    107  // innermost iframe
    108  await RemoveElementFromRemoteDocument(
    109    browser.browsingContext.children[0].children[0],
    110    "div"
    111  );
    112  await promiseRemoteFsState;
    113 }, "document_mutation_inner_frame");