Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /permissions/event-model.https.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<meta charset="utf-8" />
<title>Permissions API - Event Model Tests</title>
<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>