<!DOCTYPE html>
<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.testRunner)
        testRunner.setWebAuthenticationMockConfiguration({ });

    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 voided by a new request.");
        promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "This request has been voided 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 voided 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 voided 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>
