event-model.https.html (4389B)
1 <!DOCTYPE html> 2 <meta charset="utf-8" /> 3 <title>Permissions API - Event Model Tests</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 <body> 11 <script> 12 promise_test(async (t) => { 13 await test_driver.set_permission({ name: "geolocation" }, "prompt"); 14 const status = await navigator.permissions.query({ 15 name: "geolocation", 16 }); 17 assert_equals(status.state, "prompt", 'Initial state is "prompt"'); 18 19 let count = 0; 20 const promise1 = new Promise((resolve) => { 21 status.addEventListener("change", () => resolve(count++), { 22 once: true, 23 }); 24 }); 25 26 const promise2 = new Promise((resolve) => { 27 status.onchange = () => resolve(count++); 28 }); 29 30 await test_driver.set_permission( 31 { name: "geolocation" }, 32 "granted" 33 ); 34 35 const results = await Promise.all([promise1, promise2]); 36 37 assert_equals( 38 status.state, 39 "granted", 40 'State should now be "granted"' 41 ); 42 assert_array_equals(results, [0, 1], "Both listeners fired once"); 43 44 status.onchange = null; 45 }, "Multiple listeners on a single PermissionStatus should all fire on change"); 46 47 promise_test(async (t) => { 48 await test_driver.set_permission({ name: "geolocation" }, "prompt"); 49 const status = await navigator.permissions.query({ 50 name: "geolocation", 51 }); 52 assert_equals(status.state, "prompt", 'Initial state is "prompt"'); 53 54 const grantedPromise = new Promise((resolve) => { 55 status.addEventListener("change", resolve, { once: true }); 56 }); 57 await test_driver.set_permission( 58 { name: "geolocation" }, 59 "granted" 60 ); 61 await grantedPromise; 62 assert_equals(status.state, "granted", 'Now in "granted" state'); 63 64 const deniedPromise = new Promise((resolve) => { 65 status.addEventListener("change", resolve, { once: true }); 66 }); 67 await test_driver.set_permission({ name: "geolocation" }, "denied"); 68 await deniedPromise; 69 assert_equals(status.state, "denied", 'Now in "denied" state'); 70 }, 'Multiple transitions generate multiple "change" events'); 71 72 promise_test(async (t) => { 73 await test_driver.set_permission({ name: "geolocation" }, "prompt"); 74 75 const statusA = await navigator.permissions.query({ 76 name: "geolocation", 77 }); 78 const statusB = await navigator.permissions.query({ 79 name: "geolocation", 80 }); 81 82 const watchA = new Promise((resolve) => { 83 statusA.addEventListener("change", resolve, { once: true }); 84 }); 85 const watchB = new Promise((resolve) => { 86 statusB.addEventListener("change", resolve, { once: true }); 87 }); 88 89 await test_driver.set_permission( 90 { name: "geolocation" }, 91 "granted" 92 ); 93 const results = await Promise.all([watchA, watchB]); 94 }, "Multiple PermissionStatus objects observe the same transition"); 95 96 promise_test(async (t) => { 97 await test_driver.set_permission({ name: "geolocation" }, "prompt"); 98 99 const ephemeralPromise = new Promise((resolve) => { 100 (async () => { 101 const status = await navigator.permissions.query({ 102 name: "geolocation", 103 }); 104 status.addEventListener("change", resolve, { once: true }); 105 })(); 106 }); 107 108 await test_driver.set_permission( 109 { name: "geolocation" }, 110 "granted" 111 ); 112 await ephemeralPromise; 113 }, 'PermissionStatus out of scope should still fire "change" event'); 114 </script> 115 </body>