<!DOCTYPE html>
<meta charset=utf-8>
<title>CORS - preflight cache</title>
<meta name=author title="Odin Hørthe Omdal" href="mailto:odiho@opera.com">

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

<h1>Preflight cache</h1>

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

/*
 * Cache
 */


function did_preflight(expect, client, settings, atest, lastone, func) {
    var uuid_token = (settings && settings.token) || token();
    if(!settings)
        settings = {}
    set = {
        method: 'method' in settings ? settings.method : 'GET',
        extra: 'extra' in settings ? '&' + settings.extra : ''
    }
    client.open(set.method,
            CROSSDOMAIN + 'resources/preflight.py?token=' + uuid_token + set.extra,
            true)
    client.setRequestHeader('x-print', uuid_token)
    client.onload = atest.step_func(function(e){
        client.open('GET', 'resources/preflight.py?check&token=' + uuid_token, true)
        client.onload = atest.step_func(function(e){
            assert_equals(client.response, expect === true ? '1' : '0', "did preflight")
            if (lastone){
                this.done()
            }
            if (func){
                atest.step(func)
            }
        })
        client.send()
    })
    client.send()
    return uuid_token;
}

/*
 * Should run preflight
 */

async_test(function() {
    var time = new Date().getTime()
    var client = new XMLHttpRequest()
    did_preflight(true, client, null, this, 1);
},
'Test preflight')

// The original test requires caching result with max-age=0.
// It's ambiguous if we should allow a very short period for the cache to exist.
// https://fetch.spec.whatwg.org/#concept-cache
async_test(function() {
    var time = new Date().getTime()
    var client = new XMLHttpRequest()
    var id = did_preflight(true,  client, {extra:'max_age=1'}, this, 0,
        function(){
            did_preflight(false, client, {extra:'max_age=1', token: id}, this, 1)
        })
},
'preflight for x-print should be cached')

async_test(function() {
    var time = new Date().getTime()
    var client = new XMLHttpRequest()

    var id = did_preflight(true, client, {extra:'max_age=0'}, this, 0,
        function(){
            did_preflight(true, client, {extra:'max_age=0', token: id}, this, 1)
        })
},
'age = 0, should not be cached')

async_test(function() {
    var time = new Date().getTime()
    var client = new XMLHttpRequest()

    var id = did_preflight(true, client, {extra:'max_age=-1'}, this, 0,
        function(){
            did_preflight(true, client, {extra:'max_age=-1', token: id},this, 1)
        })
},
'age = -1, should not be cached');

(function() {
    var test = async_test("preflight first request, second from cache, wait, third should preflight again", { timeout: 6000 }),
        time = new Date().getTime(),
        dothing = function (url, msg, set_request, func) {
            client = new XMLHttpRequest(),
            client.open('GET', url, true)
            if (set_request)
                client.setRequestHeader('x-print', msg)
            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 token1 = token();
    test.step(function() {
        /* First cycle, gets x-print into the cache, with timeout 1 */
        var request_url = CROSSDOMAIN + 'resources/preflight.py?max_age=1&token=' + token1;
        dothing(request_url,
        'first', true, function() {
            test = test;

            /* Check if we did a preflight like we expected */
            dothing('resources/preflight.py?check&1&token=' + token1,
            '1', false, function() {
                test = test;
                dothing(request_url,
                'second', true, function() {
                    test = test;

                    /* Check that we didn't do a preflight (hasn't gone 1 second yet) */
                    dothing('resources/preflight.py?check&2&token=' + token1,
                    '0', false, function() {
                        test = test;

                        /* Wait until the preflight cache age is old (and thus cleared) */
                        test.step_timeout(() => {
                            dothing(request_url,
                            'third', true, function() {
                                test = test;

                                /* Expect that we did indeed do a preflight */
                                dothing('resources/preflight.py?check&3&token=' + token1,
                                '1', false, function() {
                                    test.done()
                                })
                            })
                        }, 1500)
                    })
                })
            })
        })
    })
})();

</script>
