// META: global=window // META: timeout=long // META: title=Fetch API: keepalive handling // META: script=/common/utils.js // META: script=/common/get-host-info.sub.js // META: script=../resources/keepalive-helper.js 'use strict'; const { HTTP_NOTSAMESITE_ORIGIN, HTTP_REMOTE_ORIGIN, HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT } = get_host_info(); /** * In a different-site iframe, test to fetch a keepalive URL on the specified * document event. */ function keepaliveSimpleRequestTest(method) { for (const evt of ['load', 'unload', 'pagehide']) { const desc = `[keepalive] simple ${method} request on '${evt}' [no payload]`; promise_test(async (test) => { const token1 = token(); const iframe = document.createElement('iframe'); iframe.src = getKeepAliveIframeUrl(token1, method, {sendOn: evt}); document.body.appendChild(iframe); await iframeLoaded(iframe); if (evt != 'load') { iframe.remove(); } assertStashedTokenAsync(desc, token1); }, `${desc}; setting up`); } } for (const method of ['GET', 'POST']) { keepaliveSimpleRequestTest(method); } // verifies fetch keepalive requests from a worker function keepaliveSimpleWorkerTest() { const desc = `simple keepalive test for web workers`; promise_test(async (test) => { const TOKEN = token(); const FRAME_ORIGIN = new URL(location.href).origin; const TEST_URL = get_host_info().HTTP_ORIGIN + `/fetch/api/resources/stash-put.py?key=${TOKEN}&value=on` + `&frame_origin=${FRAME_ORIGIN}`; // start a worker which sends keepalive request and immediately terminates const worker = new Worker(`/fetch/api/resources/keepalive-worker.js?param=${TEST_URL}`); const keepAliveWorkerPromise = new Promise((resolve, reject) => { worker.onmessage = (event) => { if (event.data === 'started') { resolve(); } else { reject(new Error("Unexpected message received from worker")); } }; worker.onerror = (error) => { reject(error); }; }); // wait until the worker has been initialized (indicated by the "started" message) await keepAliveWorkerPromise; // verifies if the token sent in fetch request has been updated in the server assertStashedTokenAsync(desc, TOKEN); }, `${desc};`); } keepaliveSimpleWorkerTest();