<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
function create_iframe_test(origin, expectation) {
    return function (t) {
        assert_true(!!navigator.credentials, "`navigator.credentials` is supported.");
        window.addEventListener("load", _ => {
            var iframe = document.createElement("iframe");
            iframe.src = origin + "/credential-management/support/federatedcredential-get.html";
            window.addEventListener("message", t.step_func(e => {
                if (e.source == iframe.contentWindow) {
                    assert_equals(e.data.status, expectation);
                    if (expectation == "rejected") {
                      assert_equals(e.data.exception, "NotAllowedError");
                    } else {
                      assert_equals(e.data.exception, null);
                    }
                    t.done();
                }
            }));
            document.body.appendChild(iframe);
        });
    };
}

function create_nested_iframe_test(outerOrigin, innerOrigin, expectation) {
    return function (t) {
        assert_true(!!navigator.credentials, "`navigator.credentials` is supported.");
        window.addEventListener("load", _ => {
            var iframe = document.createElement("iframe");
            iframe.src = outerOrigin + "/credential-management/support/echoing-nester.html?origin=" + innerOrigin + "&file=federatedcredential-get.html";
            window.addEventListener("message", t.step_func(e => {
                if (e.source == iframe.contentWindow) {
                    assert_equals(e.data.status, expectation);
                    if (expectation == "rejected") {
                      assert_equals(e.data.exception, "NotAllowedError");
                    } else {
                      assert_equals(e.data.exception, null);
                    }
                    t.done();
                }
            }));
            document.body.appendChild(iframe);
        });
    };
}

const SAME_ORIGIN = window.origin;
const CROSS_ORIGIN = "https://{{domains[élève]}}:{{ports[https][0]}}";

async_test(
    create_iframe_test(SAME_ORIGIN, "resolved"),
    "Same-origin IFrame does not throw.");
async_test(
    create_iframe_test(CROSS_ORIGIN, "rejected"),
    "Cross-origin IFrame throws 'NotAllowedError'.");

async_test(
    create_nested_iframe_test(SAME_ORIGIN, SAME_ORIGIN, "resolved"),
    "Same-origin IFrame in same-origin IFrame does not throw.");

async_test(
    create_nested_iframe_test(SAME_ORIGIN, CROSS_ORIGIN, "rejected"),
    "Same-origin IFrame in same-origin IFrame throws 'NotAllowedError'.");

async_test(
    create_nested_iframe_test(CROSS_ORIGIN, SAME_ORIGIN, "rejected"),
    "Cross-origin IFrame in same-origin IFrame throws 'NotAllowedError'.");

async_test(
    create_nested_iframe_test(CROSS_ORIGIN, CROSS_ORIGIN, "rejected"),
    "Cross-origin IFrame in same-cross-origin throws 'NotAllowedError'.");
</script>
