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>