<html>
<header>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/common/get-host-info.sub.js"></script>
</header>
<body>
<script>
var host = get_host_info();

var sameOriginImageURL = "/common/redirect.py?location=" + host.HTTPS_ORIGIN_WITH_CREDS + "/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin= " + host.HTTPS_ORIGIN + "%26PNGIMAGE%26ACACredentials=true";
var imageURL = "/common/redirect.py?location=" + host.HTTPS_REMOTE_ORIGIN_WITH_CREDS + "/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin= " + host.HTTPS_ORIGIN + "%26PNGIMAGE%26ACACredentials=true";
var frameURL = "/common/redirect.py?location=" + host.HTTPS_REMOTE_ORIGIN_WITH_CREDS + "/common/blank.html";

promise_test((test) => {
    return fetch(imageURL, {mode: "no-cors"});
}, "No CORS fetch after a redirect with an URL containing credentials");

promise_test((test) => {
    return promise_rejects(test, new TypeError, fetch(imageURL, {mode: "cors"}));
}, "CORS fetch after a redirect with a cross origin URL containing credentials");

promise_test((test) => {
    return fetch(sameOriginImageURL, {mode: "cors"});
}, "CORS fetch after a redirect with a same origin URL containing credentials");

promise_test((test) => {
    return new Promise((resolve, reject) => {
        var image = new Image();
        image.onload = resolve;
        image.onerror = (e) => reject(e);
        image.src = imageURL;
    });
}, "Image loading after a redirect with an URL containing credentials");

promise_test((test) => {
    return new Promise((resolve, reject) => {
        var image = new Image();
        image.crossOrigin = "use-credentials";
        image.onerror = resolve;
        image.onload = () => reject("Image should not load");
        image.src = imageURL;
    });
}, "CORS Image loading after a redirect with a cross origin URL containing credentials");

promise_test((test) => {
    return new Promise((resolve, reject) => {
        var image = new Image();
        image.crossOrigin = "use-credentials";
        image.onload = resolve;
        image.onerror = (e) => reject(e);
        image.src = sameOriginImageURL;
    });
}, "CORS Image loading after a redirect with a same origin URL containing credentials");

promise_test(async (test) => {
    var iframe = document.createElement("iframe");
    document.body.appendChild(iframe);
    await new Promise((resolve, reject) => {
        iframe.src = frameURL;
        iframe.onload = resolve;
        iframe.onerror = (e) => reject(e);
    });
    document.body.removeChild(iframe);
}, "Frame loading after a redirect with an URL containing credentials");
</script>
</body>
</html>
