| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title>Test Permission garbage collection persistance.</title> |
| <link rel="help" href="https://github.com/w3c/permissions/pull/256" /> |
| <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> |
| async function createABunchOfGarbage() { |
| const promises = []; |
| for (let i = 0; i < 25; i++) { |
| const promise = new Promise((r) => { |
| const iframe = document.createElement("iframe"); |
| iframe.onload = () => r(iframe); |
| iframe.src = "about:blank"; |
| document.body.appendChild(iframe); |
| }); |
| promises.push(promise); |
| } |
| const iframes = await Promise.all(promises); |
| iframes.forEach((iframe) => iframe.remove()); |
| } |
| |
| promise_test(async (t) => { |
| t.add_cleanup(() => { |
| return test_driver.set_permission({ name: "geolocation" }, "prompt"); |
| }); |
| |
| const eventPromise = new Promise( |
| async (r) => { |
| // we create the status here, but it goes out of scope |
| // at the end of the function. Thus, we assume it will be |
| // garbage collected. |
| const status = await navigator.permissions.query({ |
| name: "geolocation", |
| }); |
| status.addEventListener("change", r); |
| }, |
| { once: true } |
| ); |
| |
| // Maybe got garbage collected. |
| await createABunchOfGarbage(); |
| |
| // Causes event to fire. |
| await test_driver.set_permission({ name: "geolocation" }, "granted"); |
| await eventPromise; |
| }, "Events fire even if the status object is garbage collected"); |
| </script> |
| </body> |