<!DOCTYPE html><!-- webkit-test-runner [ WebAuthenticationModernEnabled=true ] -->
<title>Web Authentication API: PublicKeyCredential's [[get]] 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(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456"),
                timeout: 10
            }
        };

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

    promise_test(t => {
        const options = {
            publicKey: {
                rpId: "example.com",
                challenge: asciiToUint8Array("123456")
            }
        };

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

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456"),
                extensions: { appid: "abc" }
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.get(options), "The origin of the document is not authorized for the provided App ID.");
    }, "PublicKeyCredential's [[get]] with a mismatched APP ID (invalid URLs)");

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456"),
                extensions: { appid: "ftp://localhost" }
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.get(options), "The origin of the document is not authorized for the provided App ID.");
    }, "PublicKeyCredential's [[get]] with a mismatched APP ID (different protocols)");

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456"),
                extensions: { appid: "https://127.0.0.1" }
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.get(options), "The origin of the document is not authorized for the provided App ID.");
    }, "PublicKeyCredential's [[get]] with a mismatched APP ID (different sites 1)");

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456"),
                extensions: { appid: "https://haha.localhost" }
            }
        };

        return promiseRejects(t, "SecurityError",
            navigator.credentials.get(options), "The origin of the document is not authorized for the provided App ID.");
    }, "PublicKeyCredential's [[get]] with a mismatched APP ID (different sites 2)");

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456")
            }
        };

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

    promise_test(function(t) {
        const requestOptions = {
            publicKey: {
                challenge: asciiToUint8Array("123456")
            }
        };
        const result = promiseRejects(t, "NotAllowedError", navigator.credentials.get(requestOptions), "This request has been cancelled by a new request.");

        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 }],
            }
        };
        promiseRejects(t, "NotAllowedError", navigator.credentials.create(creationOptions), "This request has been cancelled by a new request.");

        return result;
    }, "PublicKeyCredential's [[get]] with two consecutive requests (2)");

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456")
            }
        };

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

    promise_test(t => {
        const options = {
            publicKey: {
                challenge: asciiToUint8Array("123456")
            }
        };

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