77 lines
2.4 KiB
JavaScript
77 lines
2.4 KiB
JavaScript
// 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();
|