web-platform-tests dashboard snapshot for /webauthn/
As of
This is a snapshot of web-platform-tests results. It is not maintained and developers should refer to wpt.fyi for the most current test results and other developments.
Tests
53 tests were found (415 subtests) in /webauthn/.
Implementations
- chrome/151.0.7913.0 - linux/22.04 - Jun 25, 2026 - wpt/d41367df1e
- firefox/154.0a1 - linux/22.04 - Jun 25, 2026 - wpt/d41367df1e
- safari/246 preview - mac/26.5 - Jun 26, 2026 - wpt/d41367df1e
- edge/151.0.4105.0 - win/10.0 - Jun 26, 2026 - wpt/d41367df1e
Test Results
| Jun 26, 2026 | ||||
|---|---|---|---|---|
| file name | chrome | firefox | safari | edge |
| § conditional-mediation.https.html | ||||
| Overall | 2 / 2 | 1 / 2 | 1 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| Conditional mediation supported | PASS | PASS | FAIL | PASS |
| Conditional create supported | PASS | FAIL | PASS | PASS |
| § createcredential-abort.https.html | ||||
| Overall | 6 / 6 | 6 / 6 | 6 / 6 | 6 / 6 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create() after abort without reason | PASS | PASS | PASS | PASS |
| navigator.credentials.create() before abort without reason | PASS | PASS | PASS | PASS |
| navigator.credentials.create() after abort reason | PASS | PASS | PASS | PASS |
| navigator.credentials.create() before abort reason | PASS | PASS | PASS | PASS |
| navigator.credentials.create() after abort reason with Error | PASS | PASS | PASS | PASS |
| navigator.credentials.create() before abort reason with Error | PASS | PASS | PASS | PASS |
| § createcredential-attachment.https.html | ||||
| Overall | 4 / 4 | 4 / 4 | 3 / 4 | 4 / 4 |
| Harness status | OK | OK | TIMEOUT | OK |
| navigator.credentials.create() with usb authenticator, attachment as cross-platform | PASS | PASS | PASS | PASS |
| navigator.credentials.create() with ble authenticator, attachment as cross-platform | PASS | PASS | PASS | PASS |
| navigator.credentials.create() with nfc authenticator, attachment as cross-platform | PASS | PASS | PASS | PASS |
| navigator.credentials.create() with internal authenticator, attachment as platform | PASS | PASS | TIMEOUT | PASS |
| § createcredential-badargs-authnrselection.https.html | ||||
| Overall | 6 / 6 | 6 / 6 | 6 / 6 | 6 / 6 |
| Harness status | OK | OK | OK | OK |
| Bad AuthenticatorSelectionCriteria: authenticatorSelection is empty string | PASS | PASS | PASS | PASS |
| Bad AuthenticatorSelectionCriteria: authenticatorSelection is string | PASS | PASS | PASS | PASS |
| Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment platform | PASS | PASS | PASS | PASS |
| Bad AuthenticatorSelectionCriteria: authenticatorSelection residentKey true | PASS | PASS | PASS | PASS |
| Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification required | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-badargs-challenge.https.html | ||||
| Overall | 6 / 6 | 6 / 6 | 6 / 6 | 6 / 6 |
| Harness status | OK | OK | OK | OK |
| Bad challenge: challenge missing | PASS | PASS | PASS | PASS |
| Bad challenge: challenge is string | PASS | PASS | PASS | PASS |
| Bad challenge: challenge is null | PASS | PASS | PASS | PASS |
| Bad challenge: challenge is empty object | PASS | PASS | PASS | PASS |
| Bad challenge: challenge is empty Array | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-badargs-rp.https.html | ||||
| Overall | 12 / 12 | 12 / 12 | 4 / 12 | 0 / 0 |
| Harness status | OK | OK | TIMEOUT | ERROR |
| Bad rp: rp missing | PASS | PASS | PASS | missing |
| Bad rp: rp null | PASS | PASS | PASS | missing |
| Bad rp: rp is string | PASS | PASS | PASS | missing |
| Bad rp: rp is empty object | PASS | PASS | PASS | missing |
| Bad rp: id is null | PASS | PASS | FAIL | missing |
| Bad rp: id is empty String | PASS | PASS | TIMEOUT | missing |
| Bad rp: id is invalid domain (has space) | PASS | PASS | NOTRUN | missing |
| Bad rp: id is invalid domain (starts with dash) | PASS | PASS | NOTRUN | missing |
| Bad rp: id is invalid domain (starts with number) | PASS | PASS | NOTRUN | missing |
| Bad rp id: id is host + port | PASS | PASS | NOTRUN | missing |
| rp missing name | PASS | PASS | NOTRUN | missing |
| Clean up the test environment | PASS | PASS | NOTRUN | missing |
| § createcredential-badargs-user.https.html | ||||
| Overall | 17 / 17 | 17 / 17 | 17 / 17 | 17 / 17 |
| Harness status | OK | OK | OK | OK |
| Bad user: user missing | PASS | PASS | PASS | PASS |
| Bad user: user is string | PASS | PASS | PASS | PASS |
| Bad user: user is empty object | PASS | PASS | PASS | PASS |
| Bad user: id is undefined | PASS | PASS | PASS | PASS |
| Bad user: id is object | PASS | PASS | PASS | PASS |
| Bad user: id is null | PASS | PASS | PASS | PASS |
| Bad user: id is empty String | PASS | PASS | PASS | PASS |
| Bad user: id is empty Array | PASS | PASS | PASS | PASS |
| Bad user: ArrayBuffer id is too long (65 bytes) | PASS | PASS | PASS | PASS |
| Bad user: Int16Array id is too long (66 bytes) | PASS | PASS | PASS | PASS |
| Bad user: Int32Array id is too long (68 bytes) | PASS | PASS | PASS | PASS |
| Bad user: Float32Array id is too long (68 bytes) | PASS | PASS | PASS | PASS |
| Bad user: Float64Array id is too long (72 bytes) | PASS | PASS | PASS | PASS |
| Bad user: id is too long (65 bytes) | PASS | PASS | PASS | PASS |
| user missing name | PASS | PASS | PASS | PASS |
| Bad user: displayName is undefined | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-clientdata.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 1 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create() has valid clientData | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-cross-origin-iframe.https.sub.html | ||||
| Overall | 5 / 5 | 5 / 5 | 4 / 5 | 5 / 5 |
| Harness status | OK | OK | OK | OK |
| create() in cross-origin iframe fails without permissions policy | PASS | PASS | PASS | PASS |
| create() in cross-origin iframe fails with permissions policy but no user activation | PASS | PASS | PASS | PASS |
| create() in cross-origin iframe succeeds with permissions policy and user activation | PASS | PASS | FAIL | PASS |
| create() in cross-origin iframe requires user activation on the iframe, not the main frame | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-excludecredentials.https.html | ||||
| Overall | 7 / 7 | 7 / 7 | 6 / 7 | 7 / 7 |
| Harness status | OK | OK | OK | OK |
| Bad excludeCredentials: string | PASS | PASS | PASS | PASS |
| Bad excludeCredentials: empty object | PASS | PASS | PASS | PASS |
| excludeCredentials missing | PASS | PASS | PASS | PASS |
| excludeCredentials empty array | PASS | PASS | PASS | PASS |
| exclude existing credential | PASS | PASS | FAIL | PASS |
| exclude random (non-existing) credential | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-extensions.https.html | ||||
| Overall | 7 / 7 | 6 / 7 | 3 / 7 | 7 / 7 |
| Harness status | OK | OK | OK | OK |
| Bad extensions: extensions is string | PASS | PASS | PASS | PASS |
| extensions is a nonsensical JSON string | PASS | PASS | PASS | PASS |
| empty appid in create request | PASS | PASS | FAIL | PASS |
| null appid in create request | PASS | PASS | FAIL | PASS |
| appid in create request | PASS | PASS | FAIL | PASS |
| navigator.credentials.create() with prf requested but no support in authenticator | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-getpublickey.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| WebAuthn getPublicKey | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-hints.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| WebAuthn createWithHints | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-large-blob-not-supported.https.html | ||||
| Overall | 6 / 6 | 3 / 6 | 1 / 6 | 6 / 6 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create() with largeBlob.write set | PASS | PASS | FAIL | PASS |
| navigator.credentials.create() with largeBlob.read set | PASS | PASS | FAIL | PASS |
| navigator.credentials.create() with largeBlob.support set to preferred and not supported by authenticator | PASS | FAIL | FAIL | PASS |
| navigator.credentials.create() with largeBlob.support not set and not supported by authenticator | PASS | FAIL | FAIL | PASS |
| navigator.credentials.create() with largeBlob.support set to required and not supported by authenticator | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-large-blob-supported.https.html | ||||
| Overall | 4 / 4 | 1 / 4 | 1 / 4 | 4 / 4 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create() with largeBlob.support set to preferred and supported by authenticator | PASS | FAIL | FAIL | PASS |
| navigator.credentials.create() with largeBlob.support not set and supported by authenticator | PASS | FAIL | FAIL | PASS |
| navigator.credentials.create() with largeBlob.support set to required and supported by authenticator | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-minpinlength.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 1 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create() with minPinLength requested | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-nested-frame.https.html | ||||
| Overall | 5 / 5 | 4 / 5 | 1 / 5 | 5 / 5 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create({publicKey}) in a javascript url should should succeed. | PASS | PASS | FAIL | PASS |
| navigator.credentials.create({publicKey}) in srcdoc should succeed. | PASS | PASS | FAIL | PASS |
| navigator.credentials.create({publicKey}) in about:blank embedded in a secure context should succeed. | PASS | FAIL | FAIL | PASS |
| navigator.credentials.create({publicKey}) in a same-origin frame should succeed without requiring us… | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-passing.https.html | ||||
| Overall | 50 / 50 | 50 / 50 | 49 / 50 | 50 / 50 |
| Harness status | OK | OK | OK | OK |
| passing credentials.create() with default arguments | PASS | PASS | PASS | PASS |
| passing credentials.create() with rpId (hostname) | PASS | PASS | PASS | PASS |
| very short user id | PASS | PASS | PASS | PASS |
| max length user id | PASS | PASS | PASS | PASS |
| Uint8Array user id | PASS | PASS | PASS | PASS |
| Int8Array user id | PASS | PASS | PASS | PASS |
| Int16Array user id | PASS | PASS | PASS | PASS |
| Int32Array user id | PASS | PASS | PASS | PASS |
| Float32Array user id | PASS | PASS | PASS | PASS |
| DataView user id | PASS | PASS | PASS | PASS |
| Int16Array challenge | PASS | PASS | PASS | PASS |
| Int32Array challenge | PASS | PASS | PASS | PASS |
| Float32Array challenge | PASS | PASS | PASS | PASS |
| Float64Array challenge | PASS | PASS | PASS | PASS |
| DataView challenge | PASS | PASS | PASS | PASS |
| Absurdly large challenge | PASS | PASS | PASS | PASS |
| pubKeyCredParams is empty Array | PASS | PASS | PASS | PASS |
| EC256 pubKeyCredParams | PASS | PASS | PASS | PASS |
| SelectEC256 pubKeyCredParams from a list | PASS | PASS | PASS | PASS |
| pubKeyCredParams with unknown value | PASS | PASS | FAIL | PASS |
| passing credentials.create() with no timeout | PASS | PASS | PASS | PASS |
| authenticatorSelection is undefined | PASS | PASS | PASS | PASS |
| authenticatorSelection is empty object | PASS | PASS | PASS | PASS |
| authenticatorSelection default values | PASS | PASS | PASS | PASS |
| authenticatorSelection attachment undefined | PASS | PASS | PASS | PASS |
| authenticatorSelection attachment empty string | PASS | PASS | PASS | PASS |
| authenticatorSelection attachment empty object | PASS | PASS | PASS | PASS |
| authenticatorSelection attachment null | PASS | PASS | PASS | PASS |
| authenticatorSelection attachment unknown value | PASS | PASS | PASS | PASS |
| authenticatorSelection residentKey undefined | PASS | PASS | PASS | PASS |
| authenticatorSelection residentKey false | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification undefined | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification discouraged | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification empty string | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification empty object | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification unknown value | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification null | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is "none" | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is "indirect" | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is "direct" | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is undefined | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is empty object | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is empty array | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is null | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is "noneofyourbusiness" | PASS | PASS | PASS | PASS |
| attestation parameter: attestation is empty string | PASS | PASS | PASS | PASS |
| extensions undefined | PASS | PASS | PASS | PASS |
| extensions are empty object | PASS | PASS | PASS | PASS |
| extensions are dict of empty strings | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-prf.https.html | ||||
| Overall | 4 / 4 | 3 / 4 | 1 / 4 | 4 / 4 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create() with prf requested | PASS | PASS | FAIL | PASS |
| navigator.credentials.create() with nonsensical evalByCredential | PASS | PASS | FAIL | PASS |
| navigator.credentials.create() with eval | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-pubkeycredparams.https.html | ||||
| Overall | 10 / 10 | 10 / 10 | 4 / 10 | 10 / 10 |
| Harness status | OK | OK | OK | OK |
| Bad pubKeyCredParams: pubKeyCredParams is undefined | PASS | PASS | PASS | PASS |
| Bad pubKeyCredParams: pubKeyCredParams is string | PASS | PASS | PASS | PASS |
| Bad pubKeyCredParams: pubKeyCredParams is null | PASS | PASS | PASS | PASS |
| Bad pubKeyCredParams: first param has bad type ("something-else") | PASS | PASS | FAIL | PASS |
| Bad pubKeyCredParams: first param has bad type ("") | PASS | PASS | FAIL | PASS |
| Bad pubKeyCredParams: first param has bad type (null) | PASS | PASS | FAIL | PASS |
| Bad pubKeyCredParams: first param has bad type (empty object) | PASS | PASS | FAIL | PASS |
| Bad pubKeyCredParams: first param has bad alg (42) | PASS | PASS | FAIL | PASS |
| Bad pubKeyCredParams: first param has bad alg (0) | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § createcredential-resident-key.https.html | ||||
| Overall | 15 / 15 | 14 / 15 | 2 / 15 | 15 / 15 |
| Harness status | OK | OK | TIMEOUT | OK |
| U2F: navigator.credentials.create() with credProps extension, rk=discouraged | PASS | PASS | PASS | PASS |
| U2F: navigator.credentials.create() with credProps extension, rk=preferred | PASS | PASS | PASS | PASS |
| U2F: navigator.credentials.create() with credProps extension, rk=required | PASS | PASS | TIMEOUT | PASS |
| CTAP 2.0 without resident key support: navigator.credentials.create() with credProps extension, rk=discouraged | PASS | PASS | NOTRUN | PASS |
| CTAP 2.0 without resident key support: navigator.credentials.create() with credProps extension, rk=preferred | PASS | PASS | NOTRUN | PASS |
| CTAP 2.0 without resident key support: navigator.credentials.create() with credProps extension, rk=required | PASS | PASS | NOTRUN | PASS |
| CTAP 2.0 with resident key support: navigator.credentials.create() with credProps extension, rk=discouraged | PASS | FAIL | NOTRUN | PASS |
| CTAP 2.0 with resident key support: navigator.credentials.create() with credProps extension, rk=preferred | PASS | PASS | NOTRUN | PASS |
| CTAP 2.0 with resident key support: navigator.credentials.create() with credProps extension, rk=required | PASS | PASS | NOTRUN | PASS |
| CTAP 2.1 without resident key support: navigator.credentials.create() with credProps extension, rk=discouraged | PASS | PASS | NOTRUN | PASS |
| CTAP 2.1 without resident key support: navigator.credentials.create() with credProps extension, rk=preferred | PASS | PASS | NOTRUN | PASS |
| CTAP 2.1 without resident key support: navigator.credentials.create() with credProps extension, rk=required | PASS | PASS | NOTRUN | PASS |
| CTAP 2.1 with resident key support: navigator.credentials.create() with credProps extension, rk=discouraged | PASS | PASS | NOTRUN | PASS |
| CTAP 2.1 with resident key support: navigator.credentials.create() with credProps extension, rk=preferred | PASS | PASS | NOTRUN | PASS |
| CTAP 2.1 with resident key support: navigator.credentials.create() with credProps extension, rk=required | PASS | PASS | NOTRUN | PASS |
| § createcredential-timeout.https.html | ||||
| Overall | 1 / 1 | 1 / 1 | 0 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| ensure create credential times out | PASS | PASS | FAIL | PASS |
| § credblob-not-supported.https.html | ||||
| Overall | 1 / 1 | 0 / 1 | 0 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| creation requesting credBlob without authenticator support | PASS | FAIL | FAIL | PASS |
| § credblob-supported.https.html | ||||
| Overall | 2 / 2 | 0 / 2 | 0 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| assertion without credBlob | PASS | FAIL | FAIL | PASS |
| assertion with credBlob | PASS | FAIL | FAIL | PASS |
| § getclientcapabilities.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 1 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| Capabilities object has sorted keys and boolean values | PASS | PASS | PASS | PASS |
| Capabilities keys are known | PASS | PASS | FAIL | PASS |
| § getcredential-abort.https.html | ||||
| Overall | 6 / 6 | 6 / 6 | 1 / 6 | 6 / 6 |
| Harness status | OK | OK | TIMEOUT | OK |
| navigator.credentials.get() after abort without reason | PASS | PASS | PASS | PASS |
| navigator.credentials.get() before abort without reason | PASS | PASS | TIMEOUT | PASS |
| navigator.credentials.get() after abort reason | PASS | PASS | NOTRUN | PASS |
| navigator.credentials.get() before abort reason | PASS | PASS | NOTRUN | PASS |
| navigator.credentials.get() after abort reason with Error | PASS | PASS | NOTRUN | PASS |
| navigator.credentials.get() before abort reason with Error | PASS | PASS | NOTRUN | PASS |
| § getcredential-allowcredentials.https.html | ||||
| Overall | 6 / 6 | 6 / 6 | 1 / 6 | 6 / 6 |
| Harness status | OK | OK | TIMEOUT | OK |
| navigator.credentials.get() with public-key allowCredentials. | PASS | PASS | PASS | PASS |
| navigator.credentials.get() with empty allowCredentials. | PASS | PASS | TIMEOUT | PASS |
| navigator.credentials.get() with unknown allowCredentials. | PASS | PASS | NOTRUN | PASS |
| navigator.credentials.get() with mixing allowCredentials with first unknown type. | PASS | PASS | NOTRUN | PASS |
| navigator.credentials.get() with mixing allowCredentials with last unknown type. | PASS | PASS | NOTRUN | PASS |
| Clean up the test environment | PASS | PASS | NOTRUN | PASS |
| § getcredential-attachment.https.html | ||||
| Overall | 4 / 4 | 4 / 4 | 3 / 4 | 4 / 4 |
| Harness status | OK | OK | TIMEOUT | OK |
| navigator.credentials.get() with usb authenticator, attachment as cross-platform | PASS | PASS | PASS | PASS |
| navigator.credentials.get() with ble authenticator, attachment as cross-platform | PASS | PASS | PASS | PASS |
| navigator.credentials.get() with nfc authenticator, attachment as cross-platform | PASS | PASS | PASS | PASS |
| navigator.credentials.get() with internal authenticator, attachment as platform | PASS | PASS | TIMEOUT | PASS |
| § getcredential-badargs-rpid.https.html | ||||
| Overall | 7 / 7 | 7 / 7 | 0 / 7 | 7 / 7 |
| Harness status | OK | OK | TIMEOUT | OK |
| Bad rpId: empty string | PASS | PASS | FAIL | PASS |
| Bad rpId: null | PASS | PASS | TIMEOUT | PASS |
| Bad rpId: invalid domain (has space) | PASS | PASS | NOTRUN | PASS |
| Bad rpId: invalid domain (starts with dash) | PASS | PASS | NOTRUN | PASS |
| Bad rpId: invalid domain (starts with number) | PASS | PASS | NOTRUN | PASS |
| Bad rpId: host + port | PASS | PASS | NOTRUN | PASS |
| Clean up the test environment | PASS | PASS | NOTRUN | PASS |
| § getcredential-badargs-userverification.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 1 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| Bad userVerification: "required" | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-extensions.https.html | ||||
| Overall | 10 / 10 | 9 / 10 | 7 / 10 | 10 / 10 |
| Harness status | OK | OK | OK | OK |
| Bad extensions: extensions is string | PASS | PASS | PASS | PASS |
| extensions is null | PASS | PASS | PASS | PASS |
| extensions is empty Array | PASS | PASS | PASS | PASS |
| extensions is empty ArrayBuffer | PASS | PASS | PASS | PASS |
| ignored extension | PASS | PASS | PASS | PASS |
| extension ID too long | PASS | PASS | PASS | PASS |
| credProps is only supported at registration | PASS | PASS | FAIL | PASS |
| Payment extension is only supported at registration | PASS | FAIL | FAIL | PASS |
| navigator.credentials.get() with prf requested but no support in authenticator | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-hints.https.html | ||||
| Overall | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.get with hints | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-large-blob-not-supported.https.html | ||||
| Overall | 5 / 5 | 4 / 5 | 1 / 5 | 5 / 5 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.get() with largeBlob.support set | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with largeBlob.read and largeBlob.write set | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with largeBlob.read set without authenticator support | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with largeBlob.write set without authenticator support | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-large-blob-supported.https.html | ||||
| Overall | 3 / 3 | 2 / 3 | 1 / 3 | 3 / 3 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.get() with largeBlob.read set with no blob on authenticator | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() read and write blob | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-nested-frame.https.html | ||||
| Overall | 6 / 6 | 5 / 6 | 2 / 6 | 6 / 6 |
| Harness status | OK | OK | OK | OK |
| Setup: create a credential to test with | PASS | PASS | PASS | PASS |
| navigator.credentials.get({publicKey}) in a javascript url should should succeed. | PASS | PASS | FAIL | PASS |
| navigator.credentials.get({publicKey}) in srcdoc should succeed. | PASS | PASS | FAIL | PASS |
| navigator.credentials.get({publicKey}) in about:blank embedded in a secure context should succeed. | PASS | FAIL | FAIL | PASS |
| navigator.credentials.get({publicKey}) in a same-origin frame should succeed without requiring user … | PASS | PASS | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-passing.https.html | ||||
| Overall | 15 / 15 | 15 / 15 | 15 / 15 | 15 / 15 |
| Harness status | OK | OK | OK | OK |
| passing credentials.get() with default args | PASS | PASS | PASS | PASS |
| passing credentials.create() with no timeout | PASS | PASS | PASS | PASS |
| rpId undefined | PASS | PASS | PASS | PASS |
| passing credentials.get() with rpId (hostname) | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification undefined | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification preferred | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification discouraged | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification empty string | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification empty object | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification unknown value | PASS | PASS | PASS | PASS |
| authenticatorSelection userVerification null | PASS | PASS | PASS | PASS |
| extensions undefined | PASS | PASS | PASS | PASS |
| extensions are empty object | PASS | PASS | PASS | PASS |
| extensions are dict of empty strings | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-prf.https.html | ||||
| Overall | 10 / 10 | 10 / 10 | 0 / 10 | 10 / 10 |
| Harness status | OK | OK | TIMEOUT | OK |
| navigator.credentials.get() with single evaluation point | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with two equal evaluation points | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with two distinct evaluation points | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() using credential ID with one evaluation point | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() using credential ID with two evaluation points | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with credential ID not in allowedCredentials | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with Uint8Array credential ID not in allowedCredentials | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() using invalid base64url credential ID | PASS | PASS | FAIL | PASS |
| navigator.credentials.get() with an empty allow list but also using evalByCredential | PASS | PASS | TIMEOUT | PASS |
| Clean up the test environment | PASS | PASS | NOTRUN | PASS |
| § getcredential-rk-passing.https.html | ||||
| Overall | 3 / 3 | 3 / 3 | 3 / 3 | 3 / 3 |
| Harness status | OK | OK | OK | OK |
| empty allowCredentials | PASS | PASS | PASS | PASS |
| undefined allowCredentials | PASS | PASS | PASS | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |
| § getcredential-timeout.https.html | ||||
| Overall | 1 / 1 | 1 / 1 | 0 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| WebAuthn navigator.credentials.get() timeout Tests | PASS | PASS | FAIL | PASS |
| § getcredential-ui-mode-immediate.https.html | ||||
| Overall | 6 / 6 | 4 / 6 | 0 / 6 | 6 / 6 |
| Harness status | OK | TIMEOUT | TIMEOUT | OK |
| Immediate mediation (optional) with a resident credential | PASS | PASS | TIMEOUT | PASS |
| Immediate mediation (required) with a resident credential | PASS | PASS | NOTRUN | PASS |
| Immediate mediation fails if allowCredentials is not empty | PASS | FAIL | NOTRUN | PASS |
| Immediate mediation fails without user activation | PASS | PASS | NOTRUN | PASS |
| Immediate mediation (optional) with no credentials | PASS | PASS | NOTRUN | PASS |
| Immediate mediation is incompatible with conditional mediation | PASS | TIMEOUT | NOTRUN | PASS |
| § idlharness.https.window.html | ||||
| Overall | 114 / 114 | 111 / 114 | 113 / 114 | 114 / 114 |
| Harness status | OK | OK | OK | OK |
| idl_test setup | PASS | PASS | PASS | PASS |
| idl_test validation | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialCreationOptions: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialCreationOptions: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialRequestOptions: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialRequestOptions: member names are unique | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential: original interface defined | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential: member names are unique | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[2]: original interface defined | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[3]: original interface defined | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[3]: member names are unique | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[4]: original interface defined | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[4]: member names are unique | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[5]: original interface defined | PASS | PASS | PASS | PASS |
| Partial interface PublicKeyCredential[5]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[2]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[2]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[2]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[2]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[3]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[3]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[3]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[3]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[3]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[3]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[3]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[3]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[4]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[4]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[4]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[4]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[4]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[4]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[4]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[4]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[5]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[5]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[5]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[5]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[5]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[5]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[5]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[5]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[6]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputs[6]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[6]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientInputsJSON[6]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[6]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputs[6]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[6]: original dictionary defined | PASS | PASS | PASS | PASS |
| Partial dictionary AuthenticationExtensionsClientOutputsJSON[6]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialRequestOptions[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialCreationOptions[2]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialRequestOptions[3]: member names are unique | PASS | PASS | PASS | PASS |
| Partial dictionary CredentialCreationOptions[3]: member names are unique | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: existence and properties of interface object | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface object length | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface object name | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: existence and properties of interface prototype object | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: existence and properties of interface prototype object's "constructor" property | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: existence and properties of interface prototype object's @@unscopables property | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: attribute rawId | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: attribute response | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: attribute authenticatorAttachment | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation getClientExtensionResults() | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation isConditionalMediationAvailable() | PASS | PASS | FAIL | PASS |
| PublicKeyCredential interface: operation toJSON() | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation isUserVerifyingPlatformAuthenticatorAvailable() | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation getClientCapabilities() | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON) | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON) | PASS | PASS | PASS | PASS |
| PublicKeyCredential interface: operation signalUnknownCredential(UnknownCredentialOptions) | PASS | FAIL | PASS | PASS |
| PublicKeyCredential interface: operation signalAllAcceptedCredentials(AllAcceptedCredentialsOptions) | PASS | FAIL | PASS | PASS |
| PublicKeyCredential interface: operation signalCurrentUserDetails(CurrentUserDetailsOptions) | PASS | FAIL | PASS | PASS |
| AuthenticatorResponse interface: existence and properties of interface object | PASS | PASS | PASS | PASS |
| AuthenticatorResponse interface object length | PASS | PASS | PASS | PASS |
| AuthenticatorResponse interface object name | PASS | PASS | PASS | PASS |
| AuthenticatorResponse interface: existence and properties of interface prototype object | PASS | PASS | PASS | PASS |
| AuthenticatorResponse interface: existence and properties of interface prototype object's "construct… | PASS | PASS | PASS | PASS |
| AuthenticatorResponse interface: existence and properties of interface prototype object's @@unscopab… | PASS | PASS | PASS | PASS |
| AuthenticatorResponse interface: attribute clientDataJSON | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: existence and properties of interface object | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface object length | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface object name | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: existence and properties of interface prototype object | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: existence and properties of interface prototype object's… | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: existence and properties of interface prototype object's… | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: attribute attestationObject | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: operation getTransports() | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: operation getAuthenticatorData() | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: operation getPublicKey() | PASS | PASS | PASS | PASS |
| AuthenticatorAttestationResponse interface: operation getPublicKeyAlgorithm() | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: existence and properties of interface object | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface object length | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface object name | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: existence and properties of interface prototype object | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: existence and properties of interface prototype object's "… | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: existence and properties of interface prototype object's @… | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: attribute authenticatorData | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: attribute signature | PASS | PASS | PASS | PASS |
| AuthenticatorAssertionResponse interface: attribute userHandle | PASS | PASS | PASS | PASS |
| § isuserverifyingplatformauthenticatoravailable.https.html | ||||
| Overall | 3 / 3 | 1 / 3 | 2 / 3 | 3 / 3 |
| Harness status | OK | OK | OK | OK |
| No platform authenticator | PASS | FAIL | PASS | PASS |
| Non-user-verifying platform authenticator | PASS | FAIL | PASS | PASS |
| User verifying platform authenticator | PASS | PASS | FAIL | PASS |
| § public-key-credential-creation-options-from-json.https.window.html | ||||
| Overall | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 |
| Harness status | OK | OK | OK | OK |
| parseCreationOptionsFromJSON() | PASS | PASS | PASS | PASS |
| parseCreationOptionsFromJSON() throws EncodingError | PASS | PASS | PASS | PASS |
| parseCreationOptionsFromJSON() with extensions | PASS | PASS | PASS | PASS |
| parseCreationOptionsFromJSON() with duplicated hints | PASS | PASS | PASS | PASS |
| § public-key-credential-request-options-from-json.https.window.html | ||||
| Overall | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 |
| Harness status | OK | OK | OK | OK |
| parseRequestOptionsFromJSON() | PASS | PASS | PASS | PASS |
| parseRequestOptionsFromJSON() with extensions | PASS | PASS | PASS | PASS |
| § public-key-credential-to-json.https.window.html | ||||
| Overall | 1 / 1 | 0 / 1 | 0 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| toJSON() | PASS | FAIL | FAIL | PASS |
| § securecontext.http.html | ||||
| Overall | 1 / 1 | 1 / 1 | 1 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| no navigator.credentials.create in non-secure context | PASS | PASS | PASS | PASS |
| § securecontext.https.html | ||||
| Overall | 1 / 1 | 1 / 1 | 1 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.create exists in secure context | PASS | PASS | PASS | PASS |
| § signal-all-accepted-credentials.https.html | ||||
| Overall | 8 / 8 | 0 / 8 | 4 / 8 | 8 / 8 |
| Harness status | OK | OK | OK | OK |
| signalAllAcceptedCredentials fails with SecurityError for invalid RP IDs | PASS | FAIL | PASS | PASS |
| signalAllAcceptedCredentials fails with TypeError for invalid userId base64url | PASS | FAIL | FAIL | PASS |
| signalAllAcceptedCredentials fails with TypeError for invalid credential base64url | PASS | FAIL | FAIL | PASS |
| signalAllAcceptedCredentials does not remove a credential for a different user id | PASS | FAIL | PASS | PASS |
| signalAllAcceptedCredentials does not remove a credential if present on the list | PASS | FAIL | PASS | PASS |
| signalAllAcceptedCredentials removes a credential present on the list for the correct user | PASS | FAIL | FAIL | PASS |
| signalAllAcceptedCredentials with unrecognized credentials removes existing credential | PASS | FAIL | FAIL | PASS |
| signalAllAcceptedCredentials with recognized and unrecognized credentials keeps the existing credential | PASS | FAIL | PASS | PASS |
| § signal-current-user-details.https.html | ||||
| Overall | 4 / 4 | 0 / 4 | 1 / 4 | 4 / 4 |
| Harness status | OK | OK | OK | OK |
| signalCurrentUserDetails fails with SecurityError for invalid RP IDs | PASS | FAIL | PASS | PASS |
| signalCurrentUserDetails fails with TypeError for invalid userId base64url | PASS | FAIL | FAIL | PASS |
| signalCurrentUserDetails does not update a different user id | PASS | FAIL | FAIL | PASS |
| signalCurrentUserDetails updates a matching user id | PASS | FAIL | FAIL | PASS |
| § signal-unknown-credential.https.html | ||||
| Overall | 4 / 4 | 0 / 4 | 1 / 4 | 4 / 4 |
| Harness status | OK | OK | TIMEOUT | OK |
| signalUnknownCredential fails with SecurityError for invalid RP IDs | PASS | FAIL | PASS | PASS |
| signalUnknownCredential fails with TypeError for invalid base64url | PASS | FAIL | FAIL | PASS |
| signalUnknownCredential does not remove a credential that does not match the ID | PASS | FAIL | TIMEOUT | PASS |
| signalUnknownCredential removes a credential that matches the ID | PASS | FAIL | NOTRUN | PASS |
| § storecredential.https.html | ||||
| Overall | 1 / 1 | 0 / 1 | 1 / 1 | 1 / 1 |
| Harness status | OK | OK | OK | OK |
| navigator.credentials.store() throws NotAllowedError with a public key credential | PASS | FAIL | PASS | PASS |
| § webauthn-testdriver-basic.https.html | ||||
| Overall | 4 / 4 | 2 / 4 | 2 / 4 | 4 / 4 |
| Harness status | OK | OK | OK | OK |
| Set up the test environment | PASS | PASS | PASS | PASS |
| Create a credential | PASS | FAIL | FAIL | PASS |
| Get an assertion | PASS | FAIL | FAIL | PASS |
| Clean up the test environment | PASS | PASS | PASS | PASS |