/** * Invokes callback from a trusted click event, avoiding interception by fullscreen element. * * @param {Element} container - Element where button will be created and clicked. */ function trusted_click(container = document.body) { var document = container.ownerDocument; var button = document.createElement("button"); button.textContent = "click to continue test"; button.style.display = "block"; button.style.fontSize = "20px"; button.style.padding = "10px"; button.addEventListener("click", () => { button.remove(); }); container.appendChild(button); if (window.top !== window) test_driver.set_test_context(window.top); // Race them for manually testing... return Promise.race([ test_driver.click(button), new Promise((resolve) => { button.addEventListener("click", resolve); }), ]); } // Invokes element.requestFullscreen() from a trusted click. async function trusted_request(element = document.body, whereToCreateButton = null) { await trusted_click(whereToCreateButton ?? element.parentNode ?? element); return element.requestFullscreen(); } /** * Used to await a fullscreen change event, once. * * @param {EventTarget} target * @returns */ function fullScreenChange(target = document) { return new Promise((resolve) => target.addEventListener("fullscreenchange", resolve, { once: true }) ); } /** * Sets up a message event listener, and returns a promise that resolves * when the message from the iframe is received. * * @param {HTMLIFrameElement} iframe * @returns {Promise} */ function promiseMessage(iframe) { return new Promise((resolve) => { window.addEventListener( "message", (e) => { if (e.data?.report.api === "fullscreen") { resolve(e.data); } }, { once: true } ); iframe.contentWindow.postMessage({ action: "report" }, "*"); }); }