trusted-click.js (2030B)
1 /** 2 * Invokes callback from a trusted click event, avoiding interception by fullscreen element. 3 * 4 * @param {Element} container - Element where button will be created and clicked. 5 */ 6 function trusted_click(container = document.body) { 7 var document = container.ownerDocument; 8 var button = document.createElement("button"); 9 button.textContent = "click to continue test"; 10 button.style.display = "block"; 11 button.style.fontSize = "20px"; 12 button.style.padding = "10px"; 13 button.addEventListener("click", () => { 14 button.remove(); 15 }); 16 container.appendChild(button); 17 if (window.top !== window) test_driver.set_test_context(window.top); 18 // Race them for manually testing... 19 return Promise.race([ 20 test_driver.click(button), 21 new Promise((resolve) => { 22 button.addEventListener("click", resolve); 23 }), 24 ]); 25 } 26 27 // Invokes element.requestFullscreen() from a trusted click. 28 async function trusted_request(element = document.body, whereToCreateButton = null) { 29 await trusted_click(whereToCreateButton ?? element.parentNode ?? element); 30 return element.requestFullscreen(); 31 } 32 33 /** 34 * Used to await a fullscreen change event, once. 35 * 36 * @param {EventTarget} target 37 * @returns 38 */ 39 function fullScreenChange(target = document) { 40 return new Promise((resolve) => 41 target.addEventListener("fullscreenchange", resolve, { once: true }) 42 ); 43 } 44 45 /** 46 * Sets up a message event listener, and returns a promise that resolves 47 * when the message from the iframe is received. 48 * 49 * @param {HTMLIFrameElement} iframe 50 * @returns {Promise<object>} 51 */ 52 function promiseMessage(iframe) { 53 return new Promise((resolve) => { 54 window.addEventListener( 55 "message", 56 (e) => { 57 if (e.data?.report.api === "fullscreen") { 58 resolve(e.data); 59 } 60 }, 61 { once: true } 62 ); 63 iframe.contentWindow.postMessage({ action: "report" }, "*"); 64 }); 65 }