Automatic update from web-platform-tests Fetch: blocking opaque 416 responses to range requests See https://github.com/whatwg/fetch/pull/1907 for context. We use an image instead of JavaScript as JavaScript requires a 2xx status whereas images don't care. Also remove a redundant null check from useStoredRangeResponse() and a redundant catch() elsewhere. -- wpt-commits: e3661ee657a61122b3026e8eaaba31cbddd7a9a8 wpt-pr: 57225
62 lines
2.0 KiB
JavaScript
62 lines
2.0 KiB
JavaScript
// META: script=../../../service-workers/service-worker/resources/test-helpers.sub.js
|
|
// META: script=/common/utils.js
|
|
// META: script=/common/get-host-info.sub.js
|
|
// META: script=resources/utils.js
|
|
|
|
const { REMOTE_HOST } = get_host_info();
|
|
const BASE_SCOPE = 'resources/basic.html?';
|
|
|
|
async function cleanup() {
|
|
for (const iframe of document.querySelectorAll('.test-iframe')) {
|
|
iframe.parentNode.removeChild(iframe);
|
|
}
|
|
|
|
for (const reg of await navigator.serviceWorker.getRegistrations()) {
|
|
await reg.unregister();
|
|
}
|
|
}
|
|
|
|
async function setupRegistration(t, scope) {
|
|
await cleanup();
|
|
const reg = await navigator.serviceWorker.register('resources/range-sw.js', { scope });
|
|
await wait_for_state(t, reg.installing, 'activated');
|
|
return reg;
|
|
}
|
|
|
|
function awaitMessage(obj, id) {
|
|
return new Promise(resolve => {
|
|
obj.addEventListener('message', function listener(event) {
|
|
if (event.data.id !== id) return;
|
|
obj.removeEventListener('message', listener);
|
|
resolve(event.data);
|
|
});
|
|
});
|
|
}
|
|
|
|
promise_test(async t => {
|
|
const scope = BASE_SCOPE + Math.random();
|
|
await setupRegistration(t, scope);
|
|
const iframe = await with_iframe(scope);
|
|
const w = iframe.contentWindow;
|
|
const id = Math.random() + '';
|
|
const storedRangeResponse = awaitMessage(w.navigator.serviceWorker, id);
|
|
|
|
const url = new URL('partial-script.py', w.location);
|
|
url.searchParams.set('require-range', '1');
|
|
url.searchParams.set('range-not-satisfiable', '1');
|
|
url.searchParams.set('type', 'image/png');
|
|
url.searchParams.set('action', 'store-ranged-response');
|
|
url.searchParams.set('id', id);
|
|
url.hostname = REMOTE_HOST;
|
|
|
|
appendAudio(w.document, url);
|
|
|
|
await storedRangeResponse;
|
|
|
|
const fetchPromise = w.fetch('?action=use-stored-ranged-response', { mode: 'no-cors' });
|
|
await promise_rejects_js(t, w.TypeError, fetchPromise);
|
|
|
|
const loadImagePromise = loadImage('?action=use-stored-ranged-response', { doc: w.document });
|
|
await promise_rejects_js(t, Error, loadImagePromise);
|
|
}, `416 response not allowed following no-cors ranged request`);
|