<!DOCTYPE html>
<meta charset=utf-8>
<title>CORS - preflight cache 2</title>

<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/common/utils.js></script>
<script src=resources/support.js?pipe=sub></script>

<h1>Preflight cache 2</h1>

<div id=log></div>
<script>

(function() {
    /* This function sends a XHR request with 'x-print=$msg' header if
    set_request=true and other headers in extra_headers; then runs func if the
    response returned successfully. If the response body is not msg or request
    failed, test fails. */
    dothing = function (test, url, msg, set_request, extra_headers, func) {
        client = new XMLHttpRequest(),
        client.open('GET', url, true)
        if (set_request){
            client.setRequestHeader('x-print', msg)
            for (let i = 0; i < extra_headers.length; i++) {
                client.setRequestHeader(extra_headers[i], 'extra header')
            }
        }
        client.onload = test.step_func(function() {
            assert_equals(client.response, msg, "response " + url)
            if (func){
                test.step(func)
            }
        })
        client.onerror = test.step_func(function(e) {
            assert_unreached("Got unexpected error event on the XHR object")
        })
        client.send()
    }

    var test2 = async_test("preflight a request whose cache entry lasts very"+
        " long, fly another one that replaces the first request's cache entry"+
        ", wait, third should fly again")
    var token2 = token();
    // Helper function to assemble url components.
    make_url = function (token) {
        return CROSSDOMAIN + 'resources/preflight.py?token=' + token;
    }
    test2.step(function() {
        test2_url = make_url(token2)
        /* First request, gets x-print into the cache, with max-age=3. */
        dothing(test2, test2_url,
        'first', true, ["first_request"], function() {
            test2 = test2;
            /* Another unknown and forbidden header should trigger another
            preflight*/
            dothing(test2, test2_url,
            'second', true, ['arbitrary_header'], function() {
                test2 = test2;

                /* Verify that we did a preflight. */
                dothing(test2, 'resources/preflight.py?check&3&token=' +
                    token2, '1', false, [], function() {
                    test2 = test2;

                    /* The second request should have updated the cache entry
                    for this url and origin and made max-age=1, the new
                    request should require a new preflight.*/
                    test2.step_timeout(() => {
                        dothing(test2, test2_url,
                        'third', true, [], function() {
                            test2 = test2;

                            /* Verify that we did indeed do a preflight. */
                            dothing(test2,'resources/' +
                                'preflight.py?check&3&token=' + token2, '1',
                                false, [], function() {
                                test2 = test2;

                                /* Trigger cleanup logic for the cache entry.*/
                                test2.step_timeout(() => {
                                    dothing(test2, test2_url,
                                    'fourth', true, [], function() {
                                        test2.done()
                                    })
                                }, 2500)
                            })
                        })
                    }, 1500)
                })
            })
        })
    })
})();
</script>