| <!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> |