mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Update web-platform-tests to revision cf261625e2d230ab219eec966f4abe26e3401b64
This commit is contained in:
parent
11a89bcc47
commit
8f98acd0e7
297 changed files with 3396 additions and 1555 deletions
|
@ -3,3 +3,4 @@
|
|||
@annevk
|
||||
@mnot
|
||||
@yutakahirano
|
||||
@domfarolino
|
||||
|
|
|
@ -106,7 +106,7 @@
|
|||
checkRequestWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true);
|
||||
checkRequestWithEmptyBody("text", "", true);
|
||||
checkRequestWithEmptyBody("URLSearchParams", new URLSearchParams(""), true);
|
||||
// FIXME: This test assumes that the empty string be returned but it is not clear whether that is right. See https://github.com/w3c/web-platform-tests/pull/3950.
|
||||
// FIXME: This test assumes that the empty string be returned but it is not clear whether that is right. See https://github.com/web-platform-tests/wpt/pull/3950.
|
||||
checkRequestWithEmptyBody("FormData", new FormData(), true);
|
||||
checkRequestWithEmptyBody("ArrayBuffer", new ArrayBuffer(), true);
|
||||
</script>
|
||||
|
|
|
@ -7,6 +7,10 @@
|
|||
<script>
|
||||
const worker = 'resources/request-reset-attributes-worker.js';
|
||||
|
||||
function wait(ms) {
|
||||
return new Promise(resolve => step_timeout(resolve, ms));
|
||||
}
|
||||
|
||||
promise_test(async (t) => {
|
||||
const scope = 'resources/hello.txt?name=isReloadNavigation';
|
||||
let frame;
|
||||
|
@ -33,4 +37,60 @@ promise_test(async (t) => {
|
|||
}
|
||||
}
|
||||
}, 'Request.isReloadNavigation is reset with non-empty RequestInit');
|
||||
|
||||
promise_test(async (t) => {
|
||||
const scope = 'resources/hello.html?name=isHistoryNavigation';
|
||||
let frame;
|
||||
let reg;
|
||||
|
||||
try {
|
||||
reg = await service_worker_unregister_and_register(t, worker, scope);
|
||||
await wait_for_state(t, reg.installing, 'activated');
|
||||
frame = await with_iframe(scope);
|
||||
assert_equals(frame.contentDocument.body.textContent,
|
||||
'old: false, new: false');
|
||||
// Use step_timeout(0) to ensure the history entry is created for Blink
|
||||
// and WebKit. See https://bugs.webkit.org/show_bug.cgi?id=42861.
|
||||
await wait(0);
|
||||
await new Promise((resolve) => {
|
||||
frame.onload = resolve;
|
||||
frame.src = 'resources/hello.html?ignore';
|
||||
});
|
||||
await wait(0);
|
||||
await new Promise((resolve) => {
|
||||
frame.onload = resolve;
|
||||
frame.contentWindow.history.go(-1);
|
||||
});
|
||||
assert_equals(frame.contentDocument.body.textContent,
|
||||
'old: true, new: false');
|
||||
} finally {
|
||||
if (frame) {
|
||||
frame.remove();
|
||||
}
|
||||
if (reg) {
|
||||
await reg.unregister();
|
||||
}
|
||||
}
|
||||
}, 'Request.isHistoryNavigation is reset with non-empty RequestInit');
|
||||
|
||||
promise_test(async (t) => {
|
||||
const scope = 'resources/hello.txt?name=mode';
|
||||
let frame;
|
||||
let reg;
|
||||
|
||||
try {
|
||||
reg = await service_worker_unregister_and_register(t, worker, scope);
|
||||
await wait_for_state(t, reg.installing, 'activated');
|
||||
frame = await with_iframe(scope);
|
||||
assert_equals(frame.contentDocument.body.textContent,
|
||||
'old: navigate, new: same-origin');
|
||||
} finally {
|
||||
if (frame) {
|
||||
frame.remove();
|
||||
}
|
||||
if (reg) {
|
||||
await reg.unregister();
|
||||
}
|
||||
}
|
||||
}, 'Request.mode is reset with non-empty RequestInit when it\'s "navigate"');
|
||||
</script>
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
"cache",
|
||||
"redirect",
|
||||
"integrity",
|
||||
"isReloadNavigation",
|
||||
"isHistoryNavigation",
|
||||
//Request implements Body
|
||||
"bodyUsed"
|
||||
];
|
||||
|
@ -104,6 +106,11 @@
|
|||
newValue = true;
|
||||
break;
|
||||
|
||||
case "isHistoryNavigation":
|
||||
defaultValue = false;
|
||||
newValue = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
|
20
tests/wpt/web-platform-tests/fetch/origin/no-cors.any.js
Normal file
20
tests/wpt/web-platform-tests/fetch/origin/no-cors.any.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
// META: script=/common/utils.js
|
||||
// META: script=/common/get-host-info.sub.js
|
||||
|
||||
promise_test(async function() {
|
||||
const stash = token(),
|
||||
origins = get_host_info(),
|
||||
redirectPath = "/fetch/origin/resources/redirect-and-stash.py";
|
||||
|
||||
// Cross-origin -> same-origin will result in setting the tainted origin flag for the second
|
||||
// request.
|
||||
let url = origins.HTTP_ORIGIN + redirectPath + "?stash=" + stash;
|
||||
url = origins.HTTP_REMOTE_ORIGIN + redirectPath + "?stash=" + stash + "&location=" + encodeURIComponent(url);
|
||||
|
||||
await fetch(url, { mode: "no-cors", method: "POST" });
|
||||
|
||||
const json = await (await fetch(redirectPath + "?dump&stash=" + stash)).json();
|
||||
|
||||
assert_equals(json[0], origins.HTTP_ORIGIN, "first origin should equal this origin");
|
||||
assert_equals(json[1], "null", "second origin should be opaque and therefore null");
|
||||
}, "Origin header and 308 redirect");
|
|
@ -0,0 +1,29 @@
|
|||
import json
|
||||
|
||||
def main(request, response):
|
||||
key = request.GET.first("stash")
|
||||
origin = request.headers.get("origin")
|
||||
if origin is None:
|
||||
origin = "no Origin header"
|
||||
|
||||
origin_list = request.server.stash.take(key)
|
||||
|
||||
if "dump" in request.GET:
|
||||
response.headers.set("content-Type", "application/json")
|
||||
response.content = json.dumps(origin_list)
|
||||
return
|
||||
|
||||
if origin_list is None:
|
||||
origin_list = [origin]
|
||||
else:
|
||||
origin_list.append(origin)
|
||||
|
||||
request.server.stash.put(key, origin_list)
|
||||
|
||||
if "location" in request.GET:
|
||||
response.status = 308
|
||||
response.headers.set("Location", request.GET.first("location"))
|
||||
return
|
||||
|
||||
response.headers.set("content-Type", "text/plain")
|
||||
response.content = "Fix https://github.com/whatwg/fetch/issues/737..."
|
60
tests/wpt/web-platform-tests/fetch/range/general.any.js
Normal file
60
tests/wpt/web-platform-tests/fetch/range/general.any.js
Normal file
|
@ -0,0 +1,60 @@
|
|||
// Helpers that return headers objects with a particular guard
|
||||
function headersGuardNone(fill) {
|
||||
if (fill) return new Headers(fill);
|
||||
return new Headers();
|
||||
}
|
||||
|
||||
function headersGuardResponse(fill) {
|
||||
const opts = {};
|
||||
if (fill) opts.headers = fill;
|
||||
return new Response('', opts).headers;
|
||||
}
|
||||
|
||||
function headersGuardRequest(fill) {
|
||||
const opts = {};
|
||||
if (fill) opts.headers = fill;
|
||||
return new Request('./', opts).headers;
|
||||
}
|
||||
|
||||
function headersGuardRequestNoCors(fill) {
|
||||
const opts = { mode: 'no-cors' };
|
||||
if (fill) opts.headers = fill;
|
||||
return new Request('./', opts).headers;
|
||||
}
|
||||
|
||||
const headerGuardTypes = [
|
||||
['none', headersGuardNone],
|
||||
['response', headersGuardResponse],
|
||||
['request', headersGuardRequest]
|
||||
];
|
||||
|
||||
for (const [guardType, createHeaders] of headerGuardTypes) {
|
||||
test(() => {
|
||||
// There are three ways to set headers.
|
||||
// Filling, appending, and setting. Test each:
|
||||
let headers = createHeaders({ Range: 'foo' });
|
||||
assert_equals(headers.get('Range'), 'foo');
|
||||
|
||||
headers = createHeaders();
|
||||
headers.append('Range', 'foo');
|
||||
assert_equals(headers.get('Range'), 'foo');
|
||||
|
||||
headers = createHeaders();
|
||||
headers.set('Range', 'foo');
|
||||
assert_equals(headers.get('Range'), 'foo');
|
||||
}, `Range header setting allowed for guard type: ${guardType}`);
|
||||
}
|
||||
|
||||
test(() => {
|
||||
let headers = headersGuardRequestNoCors({ Range: 'foo' });
|
||||
assert_false(headers.has('Range'));
|
||||
|
||||
headers = headersGuardRequestNoCors();
|
||||
headers.append('Range', 'foo');
|
||||
assert_false(headers.has('Range'));
|
||||
|
||||
headers = headersGuardRequestNoCors();
|
||||
headers.set('Range', 'foo');
|
||||
assert_false(headers.has('Range'));
|
||||
}, `Privileged header not allowed for guard type: request-no-cors`);
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
// META: script=resources/utils.js
|
||||
|
||||
// It's weird that browsers do this, but it should continue to work.
|
||||
promise_test(async t => {
|
||||
await loadScript('resources/partial-script.py?pretend-offset=90000');
|
||||
assert_true(self.scriptExecuted);
|
||||
}, `Script executed from partial response`);
|
|
@ -0,0 +1 @@
|
|||
<!DOCTYPE html>
|
111
tests/wpt/web-platform-tests/fetch/range/resources/long-wav.py
Normal file
111
tests/wpt/web-platform-tests/fetch/range/resources/long-wav.py
Normal file
|
@ -0,0 +1,111 @@
|
|||
"""
|
||||
This generates a 30 minute silent wav, and is capable of
|
||||
responding to Range requests.
|
||||
"""
|
||||
import time
|
||||
import re
|
||||
import struct
|
||||
|
||||
|
||||
def create_wav_header(sample_rate, bit_depth, channels, duration):
|
||||
bytes_per_sample = bit_depth / 8
|
||||
block_align = bytes_per_sample * channels
|
||||
byte_rate = sample_rate * block_align
|
||||
sub_chunk_2_size = duration * byte_rate
|
||||
|
||||
data = b''
|
||||
# ChunkID
|
||||
data += b'RIFF'
|
||||
# ChunkSize
|
||||
data += struct.pack('<L', 36 + sub_chunk_2_size)
|
||||
# Format
|
||||
data += b'WAVE'
|
||||
# Subchunk1ID
|
||||
data += b'fmt '
|
||||
# Subchunk1Size
|
||||
data += struct.pack('<L', 16)
|
||||
# AudioFormat
|
||||
data += struct.pack('<H', 1)
|
||||
# NumChannels
|
||||
data += struct.pack('<H', channels)
|
||||
# SampleRate
|
||||
data += struct.pack('<L', sample_rate)
|
||||
# ByteRate
|
||||
data += struct.pack('<L', byte_rate)
|
||||
# BlockAlign
|
||||
data += struct.pack('<H', block_align)
|
||||
# BitsPerSample
|
||||
data += struct.pack('<H', bit_depth)
|
||||
# Subchunk2ID
|
||||
data += b'data'
|
||||
# Subchunk2Size
|
||||
data += struct.pack('<L', sub_chunk_2_size)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def main(request, response):
|
||||
response.headers.set("Content-Type", "audio/wav")
|
||||
response.headers.set("Accept-Ranges", "bytes")
|
||||
response.headers.set("Cache-Control", "no-cache")
|
||||
|
||||
range_header = request.headers.get('Range', '')
|
||||
range_received_key = request.GET.first('range-received-key', '')
|
||||
|
||||
if range_received_key and range_header:
|
||||
# This is later collected using stash-take.py
|
||||
request.stash.put(range_received_key, 'range-header-received', '/fetch/range/')
|
||||
|
||||
# Audio details
|
||||
sample_rate = 8000
|
||||
bit_depth = 8
|
||||
channels = 1
|
||||
duration = 60 * 5
|
||||
|
||||
total_length = (sample_rate * bit_depth * channels * duration) / 8
|
||||
bytes_remaining_to_send = total_length
|
||||
initial_write = ''
|
||||
|
||||
if range_header:
|
||||
response.status = 206
|
||||
start, end = re.search(r'^bytes=(\d*)-(\d*)$', range_header).groups()
|
||||
|
||||
start = int(start)
|
||||
end = int(end) if end else 0
|
||||
|
||||
if end:
|
||||
bytes_remaining_to_send = (end + 1) - start
|
||||
else:
|
||||
bytes_remaining_to_send = total_length - start
|
||||
|
||||
wav_header = create_wav_header(sample_rate, bit_depth, channels, duration)
|
||||
|
||||
if start < len(wav_header):
|
||||
initial_write = wav_header[start:]
|
||||
|
||||
if bytes_remaining_to_send < len(initial_write):
|
||||
initial_write = initial_write[0:bytes_remaining_to_send]
|
||||
|
||||
content_range = "bytes {}-{}/{}".format(start, end or total_length - 1, total_length)
|
||||
|
||||
response.headers.set("Content-Range", content_range)
|
||||
else:
|
||||
initial_write = create_wav_header(sample_rate, bit_depth, channels, duration)
|
||||
|
||||
response.headers.set("Content-Length", bytes_remaining_to_send)
|
||||
|
||||
response.write_status_headers()
|
||||
response.writer.write(initial_write)
|
||||
|
||||
bytes_remaining_to_send -= len(initial_write)
|
||||
|
||||
while bytes_remaining_to_send > 0:
|
||||
if not response.writer.flush():
|
||||
break
|
||||
|
||||
to_send = b'\x00' * min(bytes_remaining_to_send, sample_rate)
|
||||
bytes_remaining_to_send -= len(to_send)
|
||||
|
||||
response.writer.write(to_send)
|
||||
# Throttle the stream
|
||||
time.sleep(0.5)
|
|
@ -0,0 +1,30 @@
|
|||
"""
|
||||
This generates a partial response containing valid JavaScript.
|
||||
"""
|
||||
|
||||
|
||||
def main(request, response):
|
||||
require_range = request.GET.first('require-range', '')
|
||||
pretend_offset = int(request.GET.first('pretend-offset', '0'))
|
||||
range_header = request.headers.get('Range', '')
|
||||
|
||||
if require_range and not range_header:
|
||||
response.set_error(412, "Range header required")
|
||||
response.write()
|
||||
return
|
||||
|
||||
response.headers.set("Content-Type", "text/plain")
|
||||
response.headers.set("Accept-Ranges", "bytes")
|
||||
response.headers.set("Cache-Control", "no-cache")
|
||||
response.status = 206
|
||||
|
||||
to_send = 'self.scriptExecuted = true;'
|
||||
length = len(to_send)
|
||||
|
||||
content_range = "bytes {}-{}/{}".format(
|
||||
pretend_offset, pretend_offset + length - 1, pretend_offset + length)
|
||||
|
||||
response.headers.set("Content-Range", content_range)
|
||||
response.headers.set("Content-Length", length)
|
||||
|
||||
response.content = to_send
|
142
tests/wpt/web-platform-tests/fetch/range/resources/range-sw.js
Normal file
142
tests/wpt/web-platform-tests/fetch/range/resources/range-sw.js
Normal file
|
@ -0,0 +1,142 @@
|
|||
importScripts('/resources/testharness.js');
|
||||
|
||||
setup({ explicit_done: true });
|
||||
|
||||
function assert_range_request(request, expectedRangeHeader, name) {
|
||||
assert_equals(request.headers.get('Range'), expectedRangeHeader, name);
|
||||
}
|
||||
|
||||
async function broadcast(msg) {
|
||||
for (const client of await clients.matchAll()) {
|
||||
client.postMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
addEventListener('fetch', event => {
|
||||
/** @type Request */
|
||||
const request = event.request;
|
||||
const url = new URL(request.url);
|
||||
const action = url.searchParams.get('action');
|
||||
|
||||
switch (action) {
|
||||
case 'range-header-filter-test':
|
||||
rangeHeaderFilterTest(request);
|
||||
return;
|
||||
case 'range-header-passthrough-test':
|
||||
rangeHeaderPassthroughTest(event);
|
||||
return;
|
||||
case 'store-ranged-response':
|
||||
storeRangedResponse(event);
|
||||
return;
|
||||
case 'use-stored-ranged-response':
|
||||
useStoredRangeResponse(event);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* @param {Request} request
|
||||
*/
|
||||
function rangeHeaderFilterTest(request) {
|
||||
const rangeValue = request.headers.get('Range');
|
||||
|
||||
test(() => {
|
||||
assert_range_request(new Request(request), rangeValue, `Untampered`);
|
||||
assert_range_request(new Request(request, {}), rangeValue, `Untampered (no init props set)`);
|
||||
assert_range_request(new Request(request, { __foo: 'bar' }), rangeValue, `Untampered (only invalid props set)`);
|
||||
assert_range_request(new Request(request, { mode: 'cors' }), rangeValue, `More permissive mode`);
|
||||
assert_range_request(request.clone(), rangeValue, `Clone`);
|
||||
}, "Range headers correctly preserved");
|
||||
|
||||
test(() => {
|
||||
assert_range_request(new Request(request, { headers: { Range: 'foo' } }), null, `Tampered - range header set`);
|
||||
assert_range_request(new Request(request, { headers: {} }), null, `Tampered - empty headers set`);
|
||||
assert_range_request(new Request(request, { mode: 'no-cors' }), null, `Tampered – mode set`);
|
||||
assert_range_request(new Request(request, { cache: 'no-cache' }), null, `Tampered – cache mode set`);
|
||||
}, "Range headers correctly removed");
|
||||
|
||||
test(() => {
|
||||
let headers;
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.delete('does-not-exist');
|
||||
assert_equals(headers.get('Range'), rangeValue, `Preserved if no header actually removed`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.append('foo', 'bar');
|
||||
assert_equals(headers.get('Range'), rangeValue, `Preserved if silent-failure on append (due to request-no-cors guard)`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.set('foo', 'bar');
|
||||
assert_equals(headers.get('Range'), rangeValue, `Preserved if silent-failure on set (due to request-no-cors guard)`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.append('Range', 'foo');
|
||||
assert_equals(headers.get('Range'), rangeValue, `Preserved if silent-failure on append (due to request-no-cors guard)`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.set('Range', 'foo');
|
||||
assert_equals(headers.get('Range'), rangeValue, `Preserved if silent-failure on set (due to request-no-cors guard)`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.append('Accept', 'whatever');
|
||||
assert_equals(headers.get('Range'), null, `Stripped if header successfully appended`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.set('Accept', 'whatever');
|
||||
assert_equals(headers.get('Range'), null, `Stripped if header successfully set`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.delete('Accept');
|
||||
assert_equals(headers.get('Range'), null, `Stripped if header successfully deleted`);
|
||||
|
||||
headers = new Request(request).headers;
|
||||
headers.delete('Range');
|
||||
assert_equals(headers.get('Range'), null, `Stripped if range header successfully deleted`);
|
||||
}, "Headers correctly filtered");
|
||||
|
||||
done();
|
||||
}
|
||||
|
||||
function rangeHeaderPassthroughTest(event) {
|
||||
/** @type Request */
|
||||
const request = event.request;
|
||||
const url = new URL(request.url);
|
||||
const key = url.searchParams.get('range-received-key');
|
||||
|
||||
event.waitUntil(new Promise(resolve => {
|
||||
promise_test(async () => {
|
||||
await fetch(event.request);
|
||||
const response = await fetch('stash-take.py?key=' + key);
|
||||
assert_equals(await response.json(), '"range-header-received"');
|
||||
resolve();
|
||||
}, `Include range header in network request`);
|
||||
|
||||
done();
|
||||
}));
|
||||
|
||||
// Just send back any response, it isn't important for the test.
|
||||
event.respondWith(new Response(''));
|
||||
}
|
||||
|
||||
let storedRangeResponseP;
|
||||
|
||||
function storeRangedResponse(event) {
|
||||
/** @type Request */
|
||||
const request = event.request;
|
||||
const id = new URL(request.url).searchParams.get('id');
|
||||
|
||||
storedRangeResponseP = fetch(event.request);
|
||||
broadcast({ id });
|
||||
|
||||
// Just send back any response, it isn't important for the test.
|
||||
event.respondWith(new Response(''));
|
||||
}
|
||||
|
||||
function useStoredRangeResponse(event) {
|
||||
event.respondWith(async function() {
|
||||
const response = await storedRangeResponseP;
|
||||
if (!response) throw Error("Expected stored range response");
|
||||
return response.clone();
|
||||
}());
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
from wptserve.handlers import json_handler
|
||||
|
||||
|
||||
@json_handler
|
||||
def main(request, response):
|
||||
key = request.GET.first("key")
|
||||
return request.server.stash.take(key, '/fetch/range/')
|
|
@ -0,0 +1,9 @@
|
|||
function loadScript(url, { doc = document }={}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const script = doc.createElement('script');
|
||||
script.onload = () => resolve();
|
||||
script.onerror = () => reject(Error("Script load failed"));
|
||||
script.src = url;
|
||||
doc.body.appendChild(script);
|
||||
})
|
||||
}
|
128
tests/wpt/web-platform-tests/fetch/range/sw.https.window.js
Normal file
128
tests/wpt/web-platform-tests/fetch/range/sw.https.window.js
Normal file
|
@ -0,0 +1,128 @@
|
|||
// 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 SCOPE = 'resources/basic.html' + Math.random();
|
||||
|
||||
function appendAudio(document, url) {
|
||||
const audio = document.createElement('audio');
|
||||
audio.muted = true;
|
||||
audio.src = url;
|
||||
audio.preload = true;
|
||||
document.body.appendChild(audio);
|
||||
}
|
||||
|
||||
async function cleanup() {
|
||||
for (const iframe of document.querySelectorAll('.test-iframe')) {
|
||||
iframe.parentNode.removeChild(iframe);
|
||||
}
|
||||
|
||||
const reg = await navigator.serviceWorker.getRegistration(SCOPE);
|
||||
if (reg) await reg.unregister();
|
||||
}
|
||||
|
||||
async function setupRegistration(t) {
|
||||
await cleanup();
|
||||
const reg = await navigator.serviceWorker.register('resources/range-sw.js', { scope: 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();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
promise_test(async t => {
|
||||
const reg = await setupRegistration(t);
|
||||
const iframe = await with_iframe(SCOPE);
|
||||
const w = iframe.contentWindow;
|
||||
|
||||
// Trigger a cross-origin range request using media
|
||||
const url = new URL('long-wav.py?action=range-header-filter-test', w.location);
|
||||
url.hostname = REMOTE_HOST;
|
||||
appendAudio(w.document, url);
|
||||
|
||||
// See rangeHeaderFilterTest in resources/range-sw.js
|
||||
await fetch_tests_from_worker(reg.active);
|
||||
}, `Defer range header filter tests to service worker`);
|
||||
|
||||
promise_test(async t => {
|
||||
const reg = await setupRegistration(t);
|
||||
const iframe = await with_iframe(SCOPE);
|
||||
const w = iframe.contentWindow;
|
||||
|
||||
// Trigger a cross-origin range request using media
|
||||
const url = new URL('long-wav.py', w.location);
|
||||
url.searchParams.set('action', 'range-header-passthrough-test');
|
||||
url.searchParams.set('range-received-key', token());
|
||||
url.hostname = REMOTE_HOST;
|
||||
appendAudio(w.document, url);
|
||||
|
||||
// See rangeHeaderPassthroughTest in resources/range-sw.js
|
||||
await fetch_tests_from_worker(reg.active);
|
||||
}, `Defer range header passthrough tests to service worker`);
|
||||
|
||||
promise_test(async t => {
|
||||
await setupRegistration(t);
|
||||
const iframe = await with_iframe(SCOPE);
|
||||
const w = iframe.contentWindow;
|
||||
const id = Math.random() + '';
|
||||
const storedRangeResponse = awaitMessage(w.navigator.serviceWorker, id);
|
||||
|
||||
// Trigger a cross-origin range request using media
|
||||
const url = new URL('partial-script.py', w.location);
|
||||
url.searchParams.set('require-range', '1');
|
||||
url.searchParams.set('action', 'store-ranged-response');
|
||||
url.searchParams.set('id', id);
|
||||
url.hostname = REMOTE_HOST;
|
||||
|
||||
appendAudio(w.document, url);
|
||||
|
||||
await storedRangeResponse;
|
||||
|
||||
// Fetching should reject
|
||||
const fetchPromise = w.fetch('?action=use-stored-ranged-response', { mode: 'no-cors' });
|
||||
promise_rejects(t, new TypeError(), fetchPromise);
|
||||
|
||||
// Script loading should error too
|
||||
const loadScriptPromise = loadScript('?action=use-stored-ranged-response', { doc: w.document });
|
||||
promise_rejects(t, new Error(), loadScriptPromise);
|
||||
|
||||
await loadScriptPromise.catch(() => {});
|
||||
|
||||
assert_false(!!w.scriptExecuted, `Partial response shouldn't be executed`);
|
||||
}, `Ranged response not allowed following no-cors ranged request`);
|
||||
|
||||
promise_test(async t => {
|
||||
await setupRegistration(t);
|
||||
const iframe = await with_iframe(SCOPE);
|
||||
const w = iframe.contentWindow;
|
||||
const id = Math.random() + '';
|
||||
const storedRangeResponse = awaitMessage(w.navigator.serviceWorker, id);
|
||||
|
||||
// Trigger a range request using media
|
||||
const url = new URL('partial-script.py', w.location);
|
||||
url.searchParams.set('require-range', '1');
|
||||
url.searchParams.set('action', 'store-ranged-response');
|
||||
url.searchParams.set('id', id);
|
||||
|
||||
appendAudio(w.document, url);
|
||||
|
||||
await storedRangeResponse;
|
||||
|
||||
// This should not throw
|
||||
await w.fetch('?action=use-stored-ranged-response');
|
||||
|
||||
// This shouldn't throw either
|
||||
await loadScript('?action=use-stored-ranged-response', { doc: w.document });
|
||||
|
||||
assert_true(w.scriptExecuted, `Partial response should be executed`);
|
||||
}, `Non-opaque ranged response executed`);
|
Loading…
Add table
Add a link
Reference in a new issue