| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title>Digital Credentials Test: 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 create credentials while not fully active... |
| await promise_rejects_dom( |
| t, |
| "InvalidStateError", |
| DOMExceptionCtor, |
| credentials.create({ signal }), |
| "Expected InvalidStateError for create() 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 CredentialsContainer"); |
| |
| promise_test(async (t) => { |
| let iframe = await createIframe(); |
| const DOMExceptionCtor = iframe.contentWindow.DOMException; |
| let stolenNavigator = iframe.contentWindow.navigator; |
| const request = makeGetOptions("openid4vp"); |
| 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"); |
| </script> |