| <!DOCTYPE html> | |
| <meta charset="utf-8" /> | |
| <title>Permissions API - Event Model Tests</title> | |
| <link rel="help" href="https://www.w3.org/TR/permissions/" /> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/resources/testdriver.js"></script> | |
| <script src="/resources/testdriver-vendor.js"></script> | |
| <body> | |
| <script> | |
| promise_test(async (t) => { | |
| await test_driver.set_permission({ name: "geolocation" }, "prompt"); | |
| const status = await navigator.permissions.query({ | |
| name: "geolocation", | |
| }); | |
| assert_equals(status.state, "prompt", 'Initial state is "prompt"'); | |
| let count = 0; | |
| const promise1 = new Promise((resolve) => { | |
| status.addEventListener("change", () => resolve(count++), { | |
| once: true, | |
| }); | |
| }); | |
| const promise2 = new Promise((resolve) => { | |
| status.onchange = () => resolve(count++); | |
| }); | |
| await test_driver.set_permission( | |
| { name: "geolocation" }, | |
| "granted" | |
| ); | |
| const results = await Promise.all([promise1, promise2]); | |
| assert_equals( | |
| status.state, | |
| "granted", | |
| 'State should now be "granted"' | |
| ); | |
| assert_array_equals(results, [0, 1], "Both listeners fired once"); | |
| status.onchange = null; | |
| }, "Multiple listeners on a single PermissionStatus should all fire on change"); | |
| promise_test(async (t) => { | |
| await test_driver.set_permission({ name: "geolocation" }, "prompt"); | |
| const status = await navigator.permissions.query({ | |
| name: "geolocation", | |
| }); | |
| assert_equals(status.state, "prompt", 'Initial state is "prompt"'); | |
| const grantedPromise = new Promise((resolve) => { | |
| status.addEventListener("change", resolve, { once: true }); | |
| }); | |
| await test_driver.set_permission( | |
| { name: "geolocation" }, | |
| "granted" | |
| ); | |
| await grantedPromise; | |
| assert_equals(status.state, "granted", 'Now in "granted" state'); | |
| const deniedPromise = new Promise((resolve) => { | |
| status.addEventListener("change", resolve, { once: true }); | |
| }); | |
| await test_driver.set_permission({ name: "geolocation" }, "denied"); | |
| await deniedPromise; | |
| assert_equals(status.state, "denied", 'Now in "denied" state'); | |
| }, 'Multiple transitions generate multiple "change" events'); | |
| promise_test(async (t) => { | |
| await test_driver.set_permission({ name: "geolocation" }, "prompt"); | |
| const statusA = await navigator.permissions.query({ | |
| name: "geolocation", | |
| }); | |
| const statusB = await navigator.permissions.query({ | |
| name: "geolocation", | |
| }); | |
| const watchA = new Promise((resolve) => { | |
| statusA.addEventListener("change", resolve, { once: true }); | |
| }); | |
| const watchB = new Promise((resolve) => { | |
| statusB.addEventListener("change", resolve, { once: true }); | |
| }); | |
| await test_driver.set_permission( | |
| { name: "geolocation" }, | |
| "granted" | |
| ); | |
| const results = await Promise.all([watchA, watchB]); | |
| }, "Multiple PermissionStatus objects observe the same transition"); | |
| promise_test(async (t) => { | |
| await test_driver.set_permission({ name: "geolocation" }, "prompt"); | |
| const ephemeralPromise = new Promise((resolve) => { | |
| (async () => { | |
| const status = await navigator.permissions.query({ | |
| name: "geolocation", | |
| }); | |
| status.addEventListener("change", resolve, { once: true }); | |
| })(); | |
| }); | |
| await test_driver.set_permission( | |
| { name: "geolocation" }, | |
| "granted" | |
| ); | |
| await ephemeralPromise; | |
| }, 'PermissionStatus out of scope should still fire "change" event'); | |
| </script> | |
| </body> |