| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title>Recursive IFrame Fullscreen API success reporter</title> |
| <body> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <script src="../../trusted-click.js"></script> |
| <script> |
| let child_frame = null; |
| const events = []; |
| |
| document.onfullscreenchange = () => { |
| events.push("fullscreenchange"); |
| }; |
| |
| document.onfullscreenerror = () => { |
| events.push("fullscreenerror"); |
| }; |
| |
| function send_report() { |
| window.top.postMessage( |
| { |
| name: window.name, |
| action: "report", |
| report: { |
| api: "fullscreen", |
| frame: window.name, |
| fullscreenElementIsNull: document.fullscreenElement === null, |
| events, |
| }, |
| }, |
| "*" |
| ); |
| } |
| |
| async function create_child_frame({ src, name, allow_fullscreen }) { |
| child_frame = document.createElement("iframe"); |
| child_frame.allow = allow_fullscreen ? "fullscreen" : ""; |
| child_frame.name = name; |
| child_frame.style.width = "100%"; |
| child_frame.style.height = "100%"; |
| document.body.appendChild(child_frame); |
| await new Promise((resolve) => { |
| child_frame.addEventListener("load", resolve, { once: true }); |
| child_frame.src = src; |
| }); |
| window.top.postMessage({ action: "load", name }, "*"); |
| } |
| |
| async function go_fullscreen() { |
| await trusted_click(document.body); |
| let error; |
| try { |
| await document.body.requestFullscreen(); |
| } catch (err) { |
| error = err.name; |
| } finally { |
| window.top.postMessage( |
| { action: "requestFullscreen", name: window.name, error }, |
| "*" |
| ); |
| } |
| } |
| |
| window.addEventListener("message", async (e) => { |
| // Massage is not for us, try to pass it on... |
| if (e.data.name !== window.name) { |
| child_frame?.contentWindow.postMessage(e.data, "*"); |
| return; |
| } |
| switch (e.data.action) { |
| case "requestReport": |
| send_report(); |
| break; |
| case "requestFullscreen": |
| await go_fullscreen(); |
| break; |
| case "addIframe": |
| await create_child_frame(e.data.iframe); |
| break; |
| default: |
| window.top.postMessage(e.data, "*"); |
| } |
| }); |
| </script> |
| </body> |