tor-browser

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

worker.https.html (2256B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8" />
      3 <title>Permissions API in Worker</title>
      4 <link rel="help" href="https://www.w3.org/TR/permissions/" />
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="/resources/testdriver.js"></script>
      8 <script src="/resources/testdriver-vendor.js"></script>
      9 
     10 <script>
     11    const workerScript = `
     12      async function setup() {
     13          const status = await self.navigator.permissions.query({
     14              name: "geolocation",
     15          });
     16          status.addEventListener("change", () => {
     17              postMessage({ event: "change", state: status.state });
     18          });
     19          self.postMessage({ event: "ready", state: status.state });
     20      }
     21 
     22      setup();
     23    `;
     24 
     25    function messageFrom(worker, message) {
     26        const abortController = new AbortController();
     27        return new Promise((resolve) => {
     28            worker.addEventListener(
     29                "message",
     30                (event) => {
     31                    if (event.data.event == message) {
     32                        abortController.abort();
     33                        resolve(event.data);
     34                    }
     35                },
     36                { signal: abortController.signal }
     37            );
     38        });
     39    }
     40 
     41    promise_test(async (t) => {
     42        await test_driver.set_permission({ name: "geolocation" }, "prompt");
     43        const blobUrl = URL.createObjectURL(
     44            new Blob([workerScript], { type: "text/javascript" })
     45        );
     46        const worker = new Worker(blobUrl);
     47        const  { state:initialState }  = await messageFrom(worker, "ready");
     48        assert_equals(initialState, "prompt", "Worker sees the initial permission state as 'prompt'");
     49 
     50        const setPermissionPromise = test_driver.set_permission({ name: "geolocation" }, "granted");
     51        const changePromise = messageFrom(worker, "change");
     52        const [{state:changedState}] = await Promise.all([messagePromise, setPermissionPromise]);
     53        assert_equals(
     54            changedState,
     55            "granted",
     56            "Worker detects the permission state change to 'granted'"
     57        );
     58    }, "Worker can query the 'geolocation' permission and detect a transition to 'granted'");
     59 </script>