<!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();
    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>
