<!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/passwordcredential-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=passwordcredential-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.");

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

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