| <!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> |