Skip to content

Commit b758ce8

Browse files
committed
1 parent 6ef32b0 commit b758ce8

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
async function cancelBodyTest(event)
2+
{
3+
await new Promise(resolve => setTimeout(resolve, 100));
4+
event.request.body.cancel("service worker cancelled body");
5+
await new Promise(resolve => setTimeout(resolve, 100));
6+
return new Response("PASS");
7+
}
8+
9+
self.addEventListener("fetch", (event) => {
10+
if (!event.request.url.includes("cancel-body-test"))
11+
return;
12+
13+
event.respondWith(cancelBodyTest(event));
14+
});
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<html>
2+
<head>
3+
<title>Service Worker cancelling a fetch upload stream body</title>
4+
<script src="/resources/testharness.js"></script>
5+
<script src="/resources/testharnessreport.js"></script>
6+
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
7+
</head>
8+
<body>
9+
<script>
10+
var scope = "resources";
11+
var activeWorker;
12+
13+
promise_test(async (test) => {
14+
var registration = await navigator.serviceWorker.register("fetch-request-body-cancel-worker.js", { scope : scope });
15+
activeWorker = registration.active;
16+
if (activeWorker)
17+
return;
18+
activeWorker = registration.installing;
19+
return new Promise(resolve => {
20+
activeWorker.addEventListener('statechange', () => {
21+
if (activeWorker.state === "activated")
22+
resolve();
23+
});
24+
});
25+
}, "Setup worker");
26+
27+
promise_test(async (test) => {
28+
const iframe = await with_iframe("resources/empty.html");
29+
30+
const cancelPromise = new Promise((resolve, reject) => {
31+
test.step_timeout(() => reject("cancel timed out"), 3000);
32+
var stream = new ReadableStream({
33+
start: controller => {
34+
controller.enqueue(new Uint8Array([1, 2, 3]));
35+
},
36+
cancel: reason => {
37+
resolve(reason);
38+
}
39+
});
40+
41+
var options = { method: "POST", body: stream, duplex: "half" };
42+
test.fetchPromise = iframe.contentWindow.fetch("cancel-body-test", options);
43+
});
44+
const response = await test.fetchPromise;
45+
assert_true(response.ok, "fetch should succeed even though the request stream was cancelled");
46+
const text = await response.text();
47+
assert_equals(text, "PASS");
48+
49+
iframe.remove();
50+
51+
// FIXME: We should be able to validate cancelPromise value.
52+
await cancelPromise;
53+
}, "Service worker cancelling event.request.body should cancel the page's upload stream");
54+
</script>
55+
</body>
56+
</html>

0 commit comments

Comments
 (0)