Automatic update from web-platform-tests Permissions: add missing tests (#50850) * Permissions: add missing tests Add tests for edge cases, event model, revocation, and worker permissions. * Remove timeouts * review 1 * round 2 -- wpt-commits: d01af4e7944f63a9002e6dc26ed5af28a4282dcc wpt-pr: 50850
116 lines
4.3 KiB
HTML
116 lines
4.3 KiB
HTML
<!DOCTYPE html>
|
|
<meta charset="utf-8" />
|
|
<title>Permissions API - Event Model Tests</title>
|
|
<link rel="help" href="https://www.w3.org/TR/permissions/" />
|
|
<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>
|