blob: 27a4059eec2840b0601bd3a227ae808bd010d33f [file] [log] [blame]
<!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>