<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Fetching the same resource with different options</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
promise_test(function(t) {
    var url1 = "http://localhost:8000/resources/download-json-with-delay.php?iteration=2&delay=100&cors=true&allowCache=true&test=1";
    var url2 = "http://localhost:8000/resources/download-json-with-delay.php?iteration=2&delay=100&cors=true&allowCache=true&test=2";
    return Promise.all([
            fetch(url1, {"mode": "no-cors"}).then((response) => {
                assert_equals(response.type, "opaque");
            }),
            fetch(url1, {"mode": "cors"}).then((response) => {
                assert_equals(response.type, "cors");
                return response.arrayBuffer().then((arrayBuffer) => {
                    assert_true(arrayBuffer.byteLength > 0);
                });
            }),
            promise_rejects(t, new TypeError(), fetch(url1, {"mode": "cors", "credentials": "include"})),
            promise_rejects(t, new TypeError(), fetch(url2, {"mode": "cors", "credentials": "include"})),
            fetch(url2, {"mode": "cors"}).then((response) => {
                assert_equals(response.type, "cors");
                return response.arrayBuffer().then((arrayBuffer) => {
                    assert_true(arrayBuffer.byteLength > 0);
                });
            }),
            fetch(url2, {"mode": "no-cors"}).then((response) => {
                assert_equals(response.type, "opaque");
            })
    ]);
}, 'Ensure cors checks work when loading in parallel the same resource with different modes');

promise_test(function(t) {
    var url3 = "http://localhost:8000/resources/download-json-with-delay.php?iteration=2&delay=100&cors=true&allowCache=true&test=3";
    var url4 = "http://localhost:8000/resources/download-json-with-delay.php?iteration=2&delay=100&cors=true&allowCache=true&test=4";
    return fetch(url3, {"mode": "cors"}).then((response) => {
        assert_equals(response.type, "cors");
        return response.arrayBuffer().then((arrayBuffer) => {
            assert_true(arrayBuffer.byteLength > 0);
        });
    }).then(() => {
        return fetch(url3, {"mode": "no-cors"}).then((response) => {
            assert_equals(response.type, "opaque");
        });
    }).then(() => {
        return promise_rejects(t, new TypeError(), fetch(url3, {"mode": "cors", "credentials": "include"}));
    }).then(() => {
        return promise_rejects(t, new TypeError(), fetch(url4, {"mode": "cors", "credentials": "include"}));
    }).then(() => {
        return fetch(url4, {"mode": "no-cors"}).then((response) => {
            assert_equals(response.type, "opaque");
        });
    }).then(() => {
        return fetch(url4, {"mode": "cors"}).then((response) => {
            assert_equals(response.type, "cors");
            return response.arrayBuffer().then((arrayBuffer) => {
                assert_true(arrayBuffer.byteLength > 0);
            });
        });
    });
}, 'Ensure cors checks work when loading successively the same resource with different modes');
    </script>
  </body>
</html>
