tor-browser

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

iframe.html (2104B)


      1 <!DOCTYPE html>
      2 <script src="/resources/testdriver.js"></script>
      3 <script src="/resources/testdriver-vendor.js"></script>
      4 <body></body>
      5 <script type="module">
      6  // @ts-check
      7  /**
      8   * @typedef {import('./dc-types').EventData} EventData
      9   * @typedef {import('./dc-types').PostData} PostData
     10   */
     11 
     12  /**
     13   * @param {MessageEvent<EventData>} event
     14   */
     15  async function messageListener(event) {
     16    if (!event.data || typeof event.data !== "object") {
     17      throw new Error(
     18        `Message data must be an object in conforming to EventData (see dc-types.js): ${event.data}`
     19      );
     20    }
     21    /** @type {EventData} */
     22    const { data } = event;
     23    const abortController = new AbortController();
     24    if (data.abort) {
     25      if (!data.options) {
     26        data.options = {};
     27      }
     28      data.options.signal = abortController.signal;
     29    }
     30    if (data.needsActivation && !navigator.userActivation.isActive) {
     31      await test_driver.bless("user activation");
     32    }
     33    let result;
     34    try {
     35      if (data.abort === "before") {
     36        abortController.abort();
     37      }
     38      let promise;
     39      switch (data.action) {
     40        case "ping":
     41          promise = Promise.resolve("pong");
     42          break;
     43        case "create":
     44          promise = navigator.credentials.create(data.options);
     45          break;
     46        case "get":
     47          promise = navigator.credentials.get(data.options);
     48          break;
     49        case "preventSilentAccess":
     50          promise = navigator.credentials.preventSilentAccess();
     51          break;
     52        default:
     53          throw new Error(
     54            `Unsupported action in ${window.location}: ${data.action}`
     55          );
     56      }
     57      if (data.abort === "after") {
     58        abortController.abort();
     59      }
     60      result = await promise;
     61    } catch (error) {
     62      result = {
     63        constructor: error.constructor.name,
     64        name: error.name,
     65        message: error.message,
     66      };
     67    } finally {
     68      event.source?.postMessage(result, event.origin);
     69    }
     70  }
     71 
     72  test_driver.set_test_context(parent);
     73  window.addEventListener("message", messageListener);
     74 </script>