<!DOCTYPE html>
<meta charset="utf-8">
<title>WebAuthn navigator.credentials.create() excludeCredentials Tests</title>
<meta name="timeout" content="long">
<link rel="author" title="Adam Powers" href="mailto:[email protected]">
<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
<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(function() {
"use strict";
// bad excludeCredentials values
new CreateCredentialsTest("options.publicKey.excludeCredentials", "hi mom").runTest("Bad excludeCredentials: string", TypeError);
new CreateCredentialsTest("options.publicKey.excludeCredentials", {}).runTest("Bad excludeCredentials: empty object", TypeError);
// TODO: bad excludeCredentials with [{.type}] or [{.id}] or [{.transports}] wrong
// good excludeCredentials values
new CreateCredentialsTest({path: "options.publicKey.excludeCredentials", value: undefined}).runTest("excludeCredentials missing");
new CreateCredentialsTest("options.publicKey.excludeCredentials", []).runTest("excludeCredentials empty array");
// proper excludeCredentials behavior
// should error on excluding existing credential
promise_test((t) => {
var cred1;
return Promise.resolve()
.then(() => {
return createCredential();
})
.then((cred) => {
cred1 = cred;
var excludeCred = {
id: cred.rawId,
type: "public-key"
};
var args = {
options: {
publicKey: {
excludeCredentials: [excludeCred]
}
}
};
var p = createCredential(args);
return promise_rejects_dom(t, "InvalidStateError", p, "expected to fail on excluded credential");
});
}, "exclude existing credential");
// should not error on excluding random credential
promise_test(() => {
return Promise.resolve()
.then(() => {
return createCredential();
})
.then(() => {
var randomCredId = new Uint8Array(162);
window.crypto.getRandomValues(randomCredId);
var excludeCred = {
id: randomCredId,
type: "public-key"
};
var args = {
options: {
publicKey: {
excludeCredentials: [excludeCred]
}
}
};
return createCredential(args);
});
}, "exclude random (non-existing) credential");
// TODO: exclude including transport type (USB, BLE, NFC)
});
/* JSHINT */
/* globals standardSetup, CreateCredentialsTest, createCredential, promise_test, promise_rejects_dom */
</script>