<!DOCTYPE html>
<title>Credential Management API: get() basics.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  promise_test(async (t) => {
    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get()
    );

    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({})
    );

    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({ x: "y" })
    );

    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({ x: "y", y: "z" })
    );

    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({ x: "y" })
    );

    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({ mediation: "required" })
    );

    const abortController = new AbortController();
    const { signal } = abortController;
    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({ signal })
    );

    await promise_rejects_dom(
      t,
      "NotSupportedError",
      navigator.credentials.get({ signal, mediation: "required" })
    );
  }, "Calling navigator.credentials.get() without a valid matching interface.");

  promise_test(function(t) {
    const controller = new AbortController();
    controller.abort("custom reason");

    return promise_rejects_exactly(t, "custom reason",
        navigator.credentials.get({ signal: controller.signal }));
  }, "navigator.credentials.get() aborted with custom reason");

  promise_test(async function(t) {
    const reasons = [{}, [], new Error("custom error")];

    for (let reason of reasons) {
        const result = navigator.credentials.get({ signal: AbortSignal.abort(reason) });
        await promise_rejects_exactly(t, reason, result);
    }
  }, "navigator.credentials.get() aborted with different objects");

  promise_test(function(t) {
    const error = new Error("custom error");
    const controller = new AbortController();

    const result = navigator.credentials.get({ signal: controller.signal });
    controller.abort(error); // aborted after the promise is created

    return promise_rejects_exactly(t, error, result);
  }, "navigator.credentials.get() rejects when aborted after the promise creation");
</script>
