tor-browser

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

document-exit-fullscreen-nested-in-iframe.html (3251B)


      1 <!DOCTYPE html>
      2 <title>Document#exitFullscreen() for nested fullscreen inside an iframe</title>
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script src="/resources/testdriver.js"></script>
      6 <script src="/resources/testdriver-vendor.js"></script>
      7 <script src="../trusted-click.js"></script>
      8 <iframe allowfullscreen></iframe>
      9 <script>
     10    async function fullscreenNestedElements(t, iframe, outer, inner) {
     11        // First request fullscreen for the outer element.
     12        await Promise.all([fullScreenChange(), fullScreenChange(iframe.contentDocument), trusted_request(outer)]);
     13        assert_equals(document.fullscreenElement, iframe);
     14        assert_equals(iframe.contentDocument.fullscreenElement, outer);
     15 
     16        document.onfullscreenchange = t.unreached_func(
     17            "fullscreenchange event should not be emitted a second time for parent document."
     18        );
     19 
     20        // Then request fullscreen for the inner element.
     21        await Promise.all([fullScreenChange(iframe.contentDocument), trusted_request(inner)]);
     22        assert_equals(document.fullscreenElement, iframe);
     23        assert_equals(iframe.contentDocument.fullscreenElement, inner);
     24 
     25        document.onfullscreenchange = null;
     26    }
     27 
     28    promise_test(async (t) => {
     29        const iframe = document.querySelector("iframe");
     30        await new Promise((resolve) => {
     31            iframe.onload = resolve;
     32            iframe.srcdoc = "<div id='outer'><div id='inner'></div></div>";
     33        });
     34 
     35        const iframeDoc = iframe.contentDocument;
     36        const outer = iframeDoc.getElementById("outer");
     37        const inner = iframeDoc.getElementById("inner");
     38 
     39        // Fullscreen outer, then inner, 2 elements in toplayer of <iframe>
     40        await fullscreenNestedElements(t, iframe, outer, inner);
     41 
     42        // Check if iframe sees (fullscreenchange, element) as per spec
     43        await Promise.all([fullScreenChange(iframeDoc), iframeDoc.exitFullscreen()]);
     44 
     45        // First iframe.contentDocument.exitFullscreen()
     46        // should only remove 1 from the top layer of iframe
     47        assert_equals(iframeDoc.fullscreenElement, outer);
     48        assert_equals(document.fullscreenElement, iframe);
     49        // Second exitFullscreen should exit fully from fullscreen, as stated by
     50        // https://fullscreen.spec.whatwg.org/#collect-documents-to-unfullscreen, since
     51        // all documents are now simple fullscreen documents
     52        // https://fullscreen.spec.whatwg.org/#simple-fullscreen-document
     53        await Promise.all([fullScreenChange(document), iframeDoc.exitFullscreen()]);
     54        assert_equals(iframeDoc.fullscreenElement, null);
     55        assert_equals(document.fullscreenElement, null);
     56 
     57        await fullscreenNestedElements(t, iframe, outer, inner);
     58 
     59        // Exit the top level document from fullscreen - should exit all documents below it as
     60        // per step 13 & 15 in https://fullscreen.spec.whatwg.org/#exit-fullscreen
     61        await Promise.all([fullScreenChange(document), document.exitFullscreen()]);
     62        assert_equals(iframeDoc.fullscreenElement, null);
     63        assert_equals(document.fullscreenElement, null);
     64    }, "Exit fullscreen for nested fullscreen inside an iframe");
     65 </script>