From d4f4782d46174859fecffd241c3b34712b1a4c9b Mon Sep 17 00:00:00 2001 From: Anne van Kesteren Date: Thu, 23 Aug 2018 11:57:51 +0200 Subject: [PATCH 1/3] Fetch/XHR/Beacon: test locked/disturbed ReadableStream See https://github.com/whatwg/fetch/pull/801 for context. --- beacon/beacon-readablestream.window.js | 23 +++++++++ fetch/api/request/request-init-stream.any.js | 51 +++++++++++++++++++ .../api/response/response-from-stream.any.js | 23 +++++++++ xhr/send-data-readablestream.any.js | 27 ++++++++++ 4 files changed, 124 insertions(+) create mode 100644 beacon/beacon-readablestream.window.js create mode 100644 fetch/api/request/request-init-stream.any.js create mode 100644 fetch/api/response/response-from-stream.any.js create mode 100644 xhr/send-data-readablestream.any.js diff --git a/beacon/beacon-readablestream.window.js b/beacon/beacon-readablestream.window.js new file mode 100644 index 00000000000000..33c9bfb2f9fcb7 --- /dev/null +++ b/beacon/beacon-readablestream.window.js @@ -0,0 +1,23 @@ +function assert_beacon(stream) { + assert_throws(new TypeError(), () => navigator.sendBeacon("...", stream)); +} + +test(() => { + const stream = new ReadableStream(); + stream.getReader(); + assert_beacon(stream); +}, "sendBeacon() with a stream on which getReader() is called"); + +test(() => { + const stream = new ReadableStream(); + stream.getReader().read(); + assert_beacon(stream); +}, "sendBeacon() with a stream on which read() is called"); + +promise_test(async () => { + const stream = new ReadableStream({ pull: c => c.enqueue(new Uint8Array()) }), + reader = stream.getReader(); + await reader.read(); + reader.releaseLock(); + assert_beacon(stream); +}, "sendBeacon() with a stream on which read() and releaseLock() are called"); diff --git a/fetch/api/request/request-init-stream.any.js b/fetch/api/request/request-init-stream.any.js new file mode 100644 index 00000000000000..b2bd521d38ae31 --- /dev/null +++ b/fetch/api/request/request-init-stream.any.js @@ -0,0 +1,51 @@ +// META: global=window,worker + +"use strict"; + +function assert_request(input, init) { + assert_throws(new TypeError(), () => new Request(input, init), "new Request()"); + assert_throws(new TypeError(), () => fetch(input, init), "fetch()"); +} + +test(() => { + const stream = new ReadableStream(); + stream.getReader(); + assert_request("...", { method:"POST", body: stream }); +}, "Constructing a Request with a stream on which getReader() is called"); + +test(() => { + const stream = new ReadableStream(); + stream.getReader().read(); + assert_request("...", { method:"POST", body: stream }); +}, "Constructing a Request with a stream on which read() is called"); + +promise_test(async () => { + const stream = new ReadableStream({ pull: c => c.enqueue(new Uint8Array()) }), + reader = stream.getReader(); + await reader.read(); + reader.releaseLock(); + assert_request("...", { method:"POST", body: stream }); +}, "Constructing a Request with a stream on which read() and releaseLock() are called"); + +test(() => { + const request = new Request("...", { method: "POST", body: "..." }); + request.body.getReader(); + assert_request(request); + assert_class_string(new Request(request, { body: "..." }), "Request"); +}, "Constructing a Request with a Request on which body.getReader() is called"); + +test(() => { + const request = new Request("...", { method: "POST", body: "..." }); + request.body.getReader().read(); + assert_request(request); + assert_class_string(new Request(request, { body: "..." }), "Request"); +}, "Constructing a Request with a Request on which body.getReader().read() is called"); + +promise_test(async () => { + const request = new Request("...", { method: "POST", body: "..." }), + reader = request.body.getReader(); + await reader.read(); + reader.releaseLock(); + assert_request(request); + assert_class_string(new Request(request, { body: "..." }), "Request"); +}, "Constructing a Request with a Request on which read() and releaseLock() are called"); diff --git a/fetch/api/response/response-from-stream.any.js b/fetch/api/response/response-from-stream.any.js new file mode 100644 index 00000000000000..93b29b42867f47 --- /dev/null +++ b/fetch/api/response/response-from-stream.any.js @@ -0,0 +1,23 @@ +// META: global=window,worker + +"use strict"; + +test(() => { + const stream = new ReadableStream(); + stream.getReader(); + assert_throws(new TypeError(), () => new Response(stream)); +}, "Constructing a Response with a stream on which getReader() is called"); + +test(() => { + const stream = new ReadableStream(); + stream.getReader().read(); + assert_throws(new TypeError(), () => new Response(stream)); +}, "Constructing a Response with a stream on which read() is called"); + +promise_test(async () => { + const stream = new ReadableStream({ pull: c => c.enqueue(new Uint8Array()) }), + reader = stream.getReader(); + await reader.read(); + reader.releaseLock(); + assert_throws(new TypeError(), () => new Response(stream)); +}, "Constructing a Response with a stream on which read() and releaseLock() are called"); diff --git a/xhr/send-data-readablestream.any.js b/xhr/send-data-readablestream.any.js new file mode 100644 index 00000000000000..cca6e76a042cc8 --- /dev/null +++ b/xhr/send-data-readablestream.any.js @@ -0,0 +1,27 @@ +// META: global=window,dedicatedworker,sharedworker + +function assert_xhr(stream) { + const client = new XMLHttpRequest(); + client.open("POST", "..."); + assert_throws(new TypeError(), () => client.send(stream)); +} + +test(() => { + const stream = new ReadableStream(); + stream.getReader(); + assert_xhr(stream); +}, "XMLHttpRequest: send() with a stream on which getReader() is called"); + +test(() => { + const stream = new ReadableStream(); + stream.getReader().read(); + assert_xhr(stream); +}, "XMLHttpRequest: send() with a stream on which read() is called"); + +promise_test(async () => { + const stream = new ReadableStream({ pull: c => c.enqueue(new Uint8Array()) }), + reader = stream.getReader(); + await reader.read(); + reader.releaseLock(); + assert_xhr(stream); +}, "XMLHttpRequest: send() with a stream on which read() and releaseLock() are called"); From 147456641791fddb37213d746219048a86dd880d Mon Sep 17 00:00:00 2001 From: Anne van Kesteren Date: Fri, 24 Aug 2018 06:44:08 +0200 Subject: [PATCH 2/3] update beacon test --- beacon/beacon-readablestream.window.js | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/beacon/beacon-readablestream.window.js b/beacon/beacon-readablestream.window.js index 33c9bfb2f9fcb7..fc7f81f884bdf4 100644 --- a/beacon/beacon-readablestream.window.js +++ b/beacon/beacon-readablestream.window.js @@ -1,23 +1,3 @@ -function assert_beacon(stream) { - assert_throws(new TypeError(), () => navigator.sendBeacon("...", stream)); -} - test(() => { - const stream = new ReadableStream(); - stream.getReader(); - assert_beacon(stream); -}, "sendBeacon() with a stream on which getReader() is called"); - -test(() => { - const stream = new ReadableStream(); - stream.getReader().read(); - assert_beacon(stream); -}, "sendBeacon() with a stream on which read() is called"); - -promise_test(async () => { - const stream = new ReadableStream({ pull: c => c.enqueue(new Uint8Array()) }), - reader = stream.getReader(); - await reader.read(); - reader.releaseLock(); - assert_beacon(stream); -}, "sendBeacon() with a stream on which read() and releaseLock() are called"); + assert_throws(new TypeError(), () => navigator.sendBeacon("...", new ReadableStream())); +}, "sendBeacon() with a stream does not work due to the keepalive flag being set"); From 180d396f222f885dbefee262e9a077754da7f623 Mon Sep 17 00:00:00 2001 From: Anne van Kesteren Date: Fri, 24 Aug 2018 08:59:35 +0200 Subject: [PATCH 3/3] async/await more --- fetch/api/request/request-init-stream.any.js | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fetch/api/request/request-init-stream.any.js b/fetch/api/request/request-init-stream.any.js index b2bd521d38ae31..22e3f41bc2d8a3 100644 --- a/fetch/api/request/request-init-stream.any.js +++ b/fetch/api/request/request-init-stream.any.js @@ -2,21 +2,21 @@ "use strict"; -function assert_request(input, init) { +async function assert_request(input, init) { assert_throws(new TypeError(), () => new Request(input, init), "new Request()"); - assert_throws(new TypeError(), () => fetch(input, init), "fetch()"); + assert_throws(new TypeError(), async () => await fetch(input, init), "fetch()"); } -test(() => { +promise_test(async () => { const stream = new ReadableStream(); stream.getReader(); - assert_request("...", { method:"POST", body: stream }); + await assert_request("...", { method:"POST", body: stream }); }, "Constructing a Request with a stream on which getReader() is called"); -test(() => { +promise_test(async () => { const stream = new ReadableStream(); stream.getReader().read(); - assert_request("...", { method:"POST", body: stream }); + await assert_request("...", { method:"POST", body: stream }); }, "Constructing a Request with a stream on which read() is called"); promise_test(async () => { @@ -24,20 +24,20 @@ promise_test(async () => { reader = stream.getReader(); await reader.read(); reader.releaseLock(); - assert_request("...", { method:"POST", body: stream }); + await assert_request("...", { method:"POST", body: stream }); }, "Constructing a Request with a stream on which read() and releaseLock() are called"); -test(() => { +promise_test(async () => { const request = new Request("...", { method: "POST", body: "..." }); request.body.getReader(); - assert_request(request); + await assert_request(request); assert_class_string(new Request(request, { body: "..." }), "Request"); }, "Constructing a Request with a Request on which body.getReader() is called"); -test(() => { +promise_test(async () => { const request = new Request("...", { method: "POST", body: "..." }); request.body.getReader().read(); - assert_request(request); + await assert_request(request); assert_class_string(new Request(request, { body: "..." }), "Request"); }, "Constructing a Request with a Request on which body.getReader().read() is called"); @@ -46,6 +46,6 @@ promise_test(async () => { reader = request.body.getReader(); await reader.read(); reader.releaseLock(); - assert_request(request); + await assert_request(request); assert_class_string(new Request(request, { body: "..." }), "Request"); }, "Constructing a Request with a Request on which read() and releaseLock() are called");