<!DOCTYPE html>
<html>
    <head>
        <title>
            Test allow attribute with "digital-credentials-get" and
            CredentialsContainer's .get() method
        </title>
        <script src="/common/get-host-info.sub.js"></script>
        <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 type="module">
            import { makeGetOptions } from "./support/helper.js";

            const hostInfo = get_host_info();
            const iframeDetails = [
                {
                    policy: null,
                    crossOrigin: false,
                    expectIsAllowed: true,
                },
                {
                    policy: null,
                    crossOrigin: true,
                    expectIsAllowed: false,
                },
                {
                    policy: "digital-credentials-get",
                    crossOrigin: false,
                    expectIsAllowed: true,
                },
                {
                    policy: "digital-credentials-get",
                    crossOrigin: true,
                    expectIsAllowed: true,
                },
                {
                    policy: "digital-credentials-get *",
                    crossOrigin: false,
                    expectIsAllowed: true,
                },
                {
                    policy: "digital-credentials-get *",
                    crossOrigin: true,
                    expectIsAllowed: true,
                },
                {
                    policy: "digital-credentials-get 'none'",
                    crossOrigin: false,
                    expectIsAllowed: false,
                },
                {
                    policy: "digital-credentials-get 'none'",
                    crossOrigin: true,
                    expectIsAllowed: false,
                },
                {
                    policy: "digital-credentials-get 'self'",
                    crossOrigin: false,
                    expectIsAllowed: true,
                },
                {
                    policy: "digital-credentials-get 'self'",
                    crossOrigin: true,
                    expectIsAllowed: false,
                },
                {
                    policy: `digital-credentials-get ${hostInfo.HTTPS_REMOTE_ORIGIN}`,
                    crossOrigin: false,
                    expectIsAllowed: false,
                },
                {
                    policy: `digital-credentials-get ${hostInfo.HTTPS_REMOTE_ORIGIN}`,
                    crossOrigin: true,
                    expectIsAllowed: true,
                },
            ];

            async function loadIframe({ policy, crossOrigin, expectIsAllowed }) {
                const iframe = document.createElement("iframe");
                if (policy !== null) {
                    iframe.allow = policy;
                }

                await new Promise((resolve) => {
                    iframe.onload = resolve;
                    iframe.src = new URL(
                        "/digital-credentials/support/iframe.html",
                        crossOrigin
                            ? hostInfo.HTTPS_REMOTE_ORIGIN
                            : location.origin
                    ).href;
                    iframe.dataset.expectIsAllowed = expectIsAllowed;
                    iframe.width = "400";
                    iframe.height = "200";
                    document.body.appendChild(iframe);
                });
                iframe.focus();
                return iframe;
            }

            function runTests() {
                for (const details of iframeDetails) {
                    promise_test(async (test) => {
                        const iframe = await loadIframe(details);
                        test.add_cleanup(() => {
                            document.body.removeChild(iframe);
                        });
                        const { expectIsAllowed } = details;
                        const action = "get";
                        const options = makeGetOptions({ protocol: [] });
                        await test_driver.bless("User activation");
                        const { data } = await new Promise((resolve) => {
                            const callback = (e) => {
                                if (e.source === iframe.contentWindow) {
                                    window.removeEventListener('message', callback);
                                    resolve(e);
                                }
                            }
                            window.addEventListener("message", callback);
                            iframe.contentWindow.postMessage(
                                { action, options, needsActivation: true },
                                "*"
                            );
                        });
                        const { name, message } = data;
                        const fullMessage = `${iframe.outerHTML} - ${message}`;
                        if (expectIsAllowed) {
                            // When the call is allowed, result in a TypeError since no valid requests
                            // were passed to the call.
                            assert_true(name == "TypeError", fullMessage);
                        } else {
                            // When the call is disallowed, it MUST result in a NotAllowedError.
                            assert_equals(name, "NotAllowedError", fullMessage);
                        }

                    }, `With Get: Policy to use: ${details.policy}, is cross-origin: ${details.crossOrigin}, is allowed by policy: ${details.expectIsAllowed}`);
                }
            }
            window.onload = runTests;
        </script>
    </head>
    <body></body>
</html>
