| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <title>Recursive IFrame Fullscreen API success reporter</title> | |
| <body> | |
| <script> | |
| let child_frame = null; | |
| let fullscreen_events = []; | |
| document.onfullscreenchange = () => { fullscreen_events.push(true); }; | |
| document.onfullscreenerror = () => { fullscreen_events.push(false); }; | |
| function send_report() { | |
| window.top.postMessage({"action": "report", "report": { | |
| "api": "fullscreen", | |
| "events": fullscreen_events, | |
| "frame": window.name, | |
| "fullscreenElementIsNull": document.fullscreenElement === null | |
| }}, "*"); | |
| }; | |
| 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%"; | |
| child_frame.src = src; | |
| document.body.appendChild(child_frame); | |
| } | |
| function trusted_click(callback, container) | |
| { | |
| let document = container.ownerDocument; | |
| let button = document.createElement("button"); | |
| button.textContent = "click to continue test"; | |
| button.style.display = "block"; | |
| button.style.fontSize = "20px"; | |
| button.style.padding = "10px"; | |
| button.onclick = function() { | |
| callback(); | |
| container.removeChild(button); | |
| }; | |
| container.insertBefore(button, container.firstChild); | |
| } | |
| function go_fullscreen() { | |
| trusted_click(() => { | |
| document.body.requestFullscreen().then(() => { | |
| window.top.postMessage({"action": "ready"}, "*"); | |
| }); | |
| }, document.body); | |
| } | |
| window.addEventListener('message', e => { | |
| switch (e.data.action) { | |
| case "requestReport": | |
| send_report(); | |
| // If we have children tell them to report as well. | |
| if (child_frame) { child_frame.contentWindow.postMessage(e.data, "*"); } | |
| break; | |
| case "requestFullscreen": | |
| if (e.data.fullscreen.name == window.name) { | |
| go_fullscreen(e.data); | |
| } else if (child_frame) { child_frame.contentWindow.postMessage(e.data, "*"); } | |
| break; | |
| case "addIframe": | |
| if (child_frame) { | |
| child_frame.contentWindow.postMessage(e.data, "*"); | |
| } else { | |
| create_child_frame(e.data.iframe); | |
| } | |
| break; | |
| } | |
| }); | |
| window.onload = function () { | |
| window.top.postMessage({"action": "ready"}, "*") | |
| } | |
| </script> |