<!DOCTYPE html><!-- webkit-test-runner [ WebAuthenticationModernEnabled=true ] -->
<title>Web Authentication API: PublicKeyCredential's [[create]] failure cases.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/util.js"></script>
<script>
    // Default mock configuration. Tests need to override if they need different configuration.
    if (window.internals)
        internals.setMockWebAuthenticationConfiguration({ });

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
                timeout: 10,
            }
        };

        return promiseRejects(t, "NotAllowedError",
            navigator.credentials.create(options), "Operation timed out.");
    }, "PublicKeyCredential's [[create]] with timeout");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com",
                    id: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.create(options), "The provided RP ID is not a registrable domain suffix of the effective domain of the document.");
    }, "PublicKeyCredential's [[create]] with a mismatched RP ID");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com",
                    id: ""
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.create(options), "The provided RP ID is not a registrable domain suffix of the effective domain of the document.");
    }, "PublicKeyCredential's [[create]] with a empty string RP ID");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com",
                    id: null
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.create(options), "The provided RP ID is not a registrable domain suffix of the effective domain of the document.");
    }, "PublicKeyCredential's [[create]] with a null RP ID");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };

        const result = promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "This request has been cancelled by a new request.");
        promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "This request has been cancelled by a new request.");
        return result;
    }, "PublicKeyCredential's [[create]] with two consecutive requests");

    promise_test(function(t) {
        const creationOptions = {
            publicKey: {
                rp: {
                    name: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };
        const result = promiseRejects(t, "NotAllowedError", navigator.credentials.create(creationOptions), "This request has been cancelled by a new request.");

        const requestOptions = {
            publicKey: {
                challenge: asciiToUint8Array("123456")
            }
        };
        promiseRejects(t, "NotAllowedError", navigator.credentials.get(requestOptions), "This request has been cancelled by a new request.");
        return result;
    }, "PublicKeyCredential's [[create]] with two consecutive requests (2)");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };

        const result = promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "This request has been cancelled by a new request.");
        window.open("./resources/new-page.html?isCreation=true");
        return result;
    }, "PublicKeyCredential's [[create]] with new requests in a new page");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };

        const result = promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "This request has been cancelled by a new request.");
        window.open("./resources/new-page.html?isCreation=false");
        return result;
    }, "PublicKeyCredential's [[create]] with new requests in a new page (2)");
</script>
