Source code

Revision control

Copy as Markdown

Other Tools

/**
* 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<object>}
*/
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" }, "*");
});
}