tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }