tor-browser

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

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>