Automatic update from web-platform-tests Digital Credentials: Split get/create fully active (#57556) -- wpt-commits: 78e9cfdcb74c907886878e8b9108087de770580e wpt-pr: 57556
106 lines
3.6 KiB
HTML
106 lines
3.6 KiB
HTML
<!DOCTYPE html>
|
|
<meta charset="utf-8" />
|
|
<title>Digital Credentials Test: navigator.credentials.get() non-fully active document</title>
|
|
<link
|
|
rel="help"
|
|
href="https://github.com/w3c/webappsec-credential-management"
|
|
/>
|
|
<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></body>
|
|
<script type="module">
|
|
import { makeGetOptions } from "./support/helper.js";
|
|
async function createIframe() {
|
|
const iframe = document.createElement("iframe");
|
|
await new Promise((resolve) => {
|
|
iframe.addEventListener("load", resolve, { once: true });
|
|
iframe.src = "about:blank";
|
|
document.body.appendChild(iframe);
|
|
});
|
|
return iframe;
|
|
}
|
|
|
|
promise_test(async (t) => {
|
|
const iframe = await createIframe();
|
|
|
|
// The signal check happens after the fully active check.
|
|
// This allows us to confirm the right error is thrown
|
|
// and in the right order.
|
|
const controller = new iframe.contentWindow.AbortController();
|
|
const signal = controller.signal;
|
|
controller.abort();
|
|
|
|
// Steal all the needed references.
|
|
const { credentials } = iframe.contentWindow.navigator;
|
|
const DOMExceptionCtor = iframe.contentWindow.DOMException;
|
|
|
|
// No longer fully active.
|
|
iframe.remove();
|
|
|
|
// Try to get credentials while not fully active...
|
|
await promise_rejects_dom(
|
|
t,
|
|
"InvalidStateError",
|
|
DOMExceptionCtor,
|
|
credentials.get({ signal }),
|
|
"Expected InvalidStateError for get() on non-fully-active document"
|
|
);
|
|
|
|
// Try to prevent silent access while not fully active...
|
|
await promise_rejects_dom(
|
|
t,
|
|
"InvalidStateError",
|
|
DOMExceptionCtor,
|
|
credentials.preventSilentAccess(),
|
|
"Expected InvalidStateError for preventSilentAccess() on non-fully-active document"
|
|
);
|
|
}, "non-fully active document behavior for navigator.credentials.get()");
|
|
|
|
promise_test(async (t) => {
|
|
let iframe = await createIframe();
|
|
const DOMExceptionCtor = iframe.contentWindow.DOMException;
|
|
let stolenNavigator = iframe.contentWindow.navigator;
|
|
const request = makeGetOptions();
|
|
await test_driver.bless("User activation", null, iframe.contentWindow);
|
|
await iframe.focus();
|
|
const p = promise_rejects_dom(
|
|
t,
|
|
"AbortError",
|
|
DOMExceptionCtor,
|
|
iframe.contentWindow.navigator.credentials.get(request),
|
|
"Expect promise to reject if the document becomes non-fully active"
|
|
);
|
|
iframe.remove();
|
|
await p;
|
|
}, "Promise rejects with DOMException when the document becomes non-fully active");
|
|
|
|
promise_test(async (t) => {
|
|
const iframe = await createIframe();
|
|
iframe.focus();
|
|
t.add_cleanup(() => iframe.remove());
|
|
|
|
for (let i = 0; i < 10; ++i) {
|
|
await test_driver.bless("User activation", null, iframe.contentWindow);
|
|
const controller = new iframe.contentWindow.AbortController();
|
|
const p = iframe.contentWindow.navigator.credentials.get(
|
|
makeGetOptions({ signal: controller.signal })
|
|
);
|
|
|
|
const abortReason = new Error(`Aborted iteration ${i}`);
|
|
controller.abort(abortReason);
|
|
|
|
try {
|
|
await p;
|
|
assert_unreached("navigator.credentials.get() unexpectedly resolved");
|
|
} catch (e) {
|
|
assert_equals(
|
|
e,
|
|
abortReason,
|
|
`Iteration ${i}: should reject with the exact abort reason`
|
|
);
|
|
}
|
|
}
|
|
}, "Aborted Digital Credentials get() requests do not leave a subsequent request stuck in an invalid state");
|
|
</script> |