| <!doctype html> |
| <html> |
| <meta charset="utf-8"> |
| <title>Fetch API: keepalive handling</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/get-host-info.sub.js"></script> |
| <body> |
| <script> |
| |
| const { |
| HTTP_NOTSAMESITE_ORIGIN, |
| HTTP_REMOTE_ORIGIN, |
| HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT |
| } = get_host_info(); |
| |
| function getUrl(origin1, origin2, withHeaders) { |
| const frameOrigin = HTTP_NOTSAMESITE_ORIGIN; |
| return `${frameOrigin}/fetch/api/resources/keepalive-iframe.html?` + |
| `origin1=${origin1}&` + |
| `origin2=${origin2}&` + |
| (withHeaders ? `with-headers` : ``); |
| } |
| |
| async function getToken() { |
| return new Promise((resolve) => { |
| window.addEventListener('message', (event) => { |
| resolve(event.data); |
| }, {once: true}); |
| }); |
| } |
| |
| async function queryToken(token) { |
| const response = await fetch(`../resources/stash-take.py?key=${token}`); |
| const json = await response.json(); |
| return json; |
| } |
| |
| // In order to parallelize the work, we are going to have an async_test |
| // for the rest of the work. Note that we want the serialized behavior |
| // for the steps so far, so we don't want to make the entire test case |
| // an async_test. |
| function checkToken(testName, token) { |
| async_test((test) => { |
| new Promise((resolve) => test.step_timeout(resolve, 3000)).then(() => { |
| return queryToken(token); |
| }).then((result) => { |
| assert_equals(result, 'on'); |
| }).then(() => { |
| test.done(); |
| }).catch(test.step_func((e) => { |
| assert_unreached(e); |
| })); |
| }, testName); |
| } |
| |
| promise_test(async (test) => { |
| const iframe = document.createElement('iframe'); |
| iframe.src = getUrl('', '', false); |
| document.body.appendChild(iframe); |
| const tokenPromise = getToken(); |
| await (new Promise((resolve) => iframe.addEventListener('load', resolve))); |
| const token = await tokenPromise; |
| iframe.remove(); |
| |
| checkToken('same-origin', token); |
| }, 'same-origin; setting up'); |
| |
| promise_test(async (test) => { |
| const iframe = document.createElement('iframe'); |
| iframe.src = getUrl(HTTP_REMOTE_ORIGIN, |
| HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT, false); |
| document.body.appendChild(iframe); |
| const tokenPromise = getToken(); |
| await (new Promise((resolve) => iframe.addEventListener('load', resolve))); |
| const token = await tokenPromise; |
| iframe.remove(); |
| |
| checkToken('cross-origin redirect', token); |
| }, 'cross-origin redirect; setting up'); |
| |
| promise_test(async (test) => { |
| const iframe = document.createElement('iframe'); |
| iframe.src = getUrl(HTTP_REMOTE_ORIGIN, |
| HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT, true); |
| document.body.appendChild(iframe); |
| const tokenPromise = getToken(); |
| await (new Promise((resolve) => iframe.addEventListener('load', resolve))); |
| const token = await tokenPromise; |
| iframe.remove(); |
| |
| checkToken('cross-origin redirect with preflight', token); |
| }, 'cross-origin redirect with preflight; setting up'); |
| |
| promise_test(async (test) => { |
| const w = window.open( |
| `${HTTP_NOTSAMESITE_ORIGIN}/fetch/api/resources/keepalive-window.html`); |
| const tokenPromise = getToken(); |
| const token = await tokenPromise; |
| w.close(); |
| |
| checkToken('keepalive in onunload in nested frame in another window', token); |
| }, 'keepalive in onunload in nested frame in another window; setting up'); |
| </script> |
| </body> |
| </html> |