<!DOCTYPE html>
<meta charset="utf-8">
<title>navigator.credentials.get() largeBlob extension tests with no authenticator support</title>
<meta name="timeout" content="long">
<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>
<script src=helpers.js></script>
<body></body>
<script>
standardSetup(async function() {
  "use strict";

  const credential = createCredential();

  promise_test(async t => {
    return promise_rejects_dom(t, "NotSupportedError",
      navigator.credentials.get({publicKey: {
        challenge: new Uint8Array(),
        allowCredentials: [{
          id: (await credential).rawId,
          type: "public-key",
        }],
        extensions: {
          largeBlob: {
            support: "preferred",
          },
        },
      }}));
  }, "navigator.credentials.get() with largeBlob.support set");

  promise_test(async t => {
    return promise_rejects_dom(t, "NotSupportedError",
      navigator.credentials.get({publicKey: {
        challenge: new Uint8Array(),
        allowCredentials: [{
          id: (await credential).rawId,
          type: "public-key",
        }],
        extensions: {
          largeBlob: {
            read: true,
            write: new ArrayBuffer(),
          },
        },
      }}));
  }, "navigator.credentials.get() with largeBlob.read and largeBlob.write set");

  promise_test(async t => {
    const assertion = await navigator.credentials.get({publicKey: {
      challenge: new Uint8Array(),
      allowCredentials: [{
        id: (await credential).rawId,
        type: "public-key",
      }],
      extensions: {
        largeBlob: {
          read: true,
        },
      },
    }});
    assert_not_own_property(assertion.getClientExtensionResults().largeBlob, "supported");
    assert_not_own_property(assertion.getClientExtensionResults().largeBlob, "blob");
    assert_not_own_property(assertion.getClientExtensionResults().largeBlob, "written");
  }, "navigator.credentials.get() with largeBlob.read set without authenticator support");

  promise_test(async t => {
    const assertion = await navigator.credentials.get({publicKey: {
      challenge: new Uint8Array(),
      allowCredentials: [{
        id: (await credential).rawId,
        type: "public-key",
      }],
      extensions: {
        largeBlob: {
          write: new TextEncoder().encode("Don't call me Shirley"),
        },
      },
    }});
    assert_not_own_property(assertion.getClientExtensionResults().largeBlob, "supported");
    assert_not_own_property(assertion.getClientExtensionResults().largeBlob, "blob");
    assert_false(assertion.getClientExtensionResults().largeBlob.written);
  }, "navigator.credentials.get() with largeBlob.write set without authenticator support");
}, {
  protocol: "ctap2_1",
  hasResidentKey: true,
  hasUserVerification: true,
  isUserVerified: true,
});
</script>
