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>