<!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.py?iteration=2&delay=100&cors=true&allowCache=true&test=1";
    var url2 = "http://localhost:8000/resources/download-json-with-delay.py?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.py?iteration=2&delay=100&cors=true&allowCache=true&test=3";
    var url4 = "http://localhost:8000/resources/download-json-with-delay.py?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>
