diff --git a/streams/readable-streams/transfer-type-message-channel.any.js b/streams/readable-streams/owning-type-message-channel.any.js similarity index 77% rename from streams/readable-streams/transfer-type-message-channel.any.js rename to streams/readable-streams/owning-type-message-channel.any.js index 7423f40d8dc8fab..db3f6bdaa1117d1 100644 --- a/streams/readable-streams/transfer-type-message-channel.any.js +++ b/streams/readable-streams/owning-type-message-channel.any.js @@ -10,16 +10,14 @@ promise_test(async () => { const source = { start(controller) { - controller.enqueue(port1, { transfer : port1 }); + controller.enqueue(port1, { transfer : [ port1 ] }); }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); - const chunk = await clone1.getReader().read().then((value) => { - assert_unreached('clone2 should error'); - }, () => { }); + const chunk = await stream.getReader().read(); assert_not_equals(chunk.value, port1); @@ -39,9 +37,9 @@ promise_test(async () => { const source = { start(controller) { - controller.enqueue({port1}, { transfer : port1 }); + controller.enqueue({ port1 }, { transfer : [ port1 ] }); }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); @@ -54,4 +52,4 @@ promise_test(async () => { await clone2.getReader().read().then((value) => { assert_unreached('clone2 should error'); }, () => { }); -}, 'Second branch of transfer-only value ReadableStream tee should end up into errors'); +}, 'Second branch of owning ReadableStream tee should end up into errors with transfer only values'); diff --git a/streams/readable-streams/transfer-type-video-frame.any.js b/streams/readable-streams/owning-type-video-frame.any.js similarity index 78% rename from streams/readable-streams/transfer-type-video-frame.any.js rename to streams/readable-streams/owning-type-video-frame.any.js index a02ddb6846156f8..17842358a39f055 100644 --- a/streams/readable-streams/transfer-type-video-frame.any.js +++ b/streams/readable-streams/owning-type-video-frame.any.js @@ -26,17 +26,17 @@ promise_test(async () => { const source = { start(controller) { assert_equals(videoFrame.format, 'I420'); - controller.enqueue(videoFrame, { transfer : videoFrame }); + controller.enqueue(videoFrame, { transfer : [ videoFrame ] }); assert_equals(videoFrame.format, null); assert_equals(videoFrame.test, 1); }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); // Cancelling the stream should close all video frames, thus no console messages of GCing VideoFrames should happen. stream.cancel(); -}, 'ReadableStream of type transfer should close serialized chunks'); +}, 'ReadableStream of type owning should close serialized chunks'); promise_test(async () => { const videoFrame = createVideoFrame(); @@ -44,11 +44,11 @@ promise_test(async () => { const source = { start(controller) { assert_equals(videoFrame.format, 'I420'); - controller.enqueue({ videoFrame }, { transfer : videoFrame }); + controller.enqueue({ videoFrame }, { transfer : [ videoFrame ] }); assert_equals(videoFrame.format, null); assert_equals(videoFrame.test, 1); }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); @@ -59,7 +59,7 @@ promise_test(async () => { assert_equals(chunk.value.videoFrame.test, undefined); chunk.value.videoFrame.close(); -}, 'ReadableStream of type transfer should transfer JS chunks with transferred values'); +}, 'ReadableStream of type owning should transfer JS chunks with transferred values'); promise_test(async () => { const videoFrame = createVideoFrame(); @@ -67,13 +67,13 @@ promise_test(async () => { const source = { start(controller) { try { - controller.enqueue(videoFrame, { transfer : videoFrame }); + controller.enqueue(videoFrame, { transfer : [ videoFrame ] }); assert_unreached('enqueue should throw'); } catch (e) { // } }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); @@ -83,15 +83,15 @@ promise_test(async () => { assert_unreached('enqueue should error the stream'); }, () => { }); -}, 'ReadableStream of type transfer should error when trying to enqueue not serializable values'); +}, 'ReadableStream of type owning should error when trying to enqueue not serializable values'); promise_test(async () => { const videoFrame = createVideoFrame(); const source = { start(controller) { - controller.enqueue(videoFrame, { transfer : videoFrame }); + controller.enqueue(videoFrame, { transfer : [ videoFrame ] }); }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); @@ -106,7 +106,7 @@ promise_test(async () => { chunk1.value.close(); chunk2.value.close(); -}, 'ReadableStream of type transfer should clone serializable objects when teeing'); +}, 'ReadableStream of type owning should clone serializable objects when teeing'); promise_test(async () => { const videoFrame = createVideoFrame(); @@ -114,11 +114,11 @@ promise_test(async () => { const source = { start(controller) { assert_equals(videoFrame.format, 'I420'); - controller.enqueue({ videoFrame }, { transfer : videoFrame }); + controller.enqueue({ videoFrame }, { transfer : [ videoFrame ] }); assert_equals(videoFrame.format, null); assert_equals(videoFrame.test, 1); }, - type: 'transfer' + type: 'owning' }; const stream = new ReadableStream(source); @@ -133,4 +133,4 @@ promise_test(async () => { chunk1.value.videoFrame.close(); chunk2.value.videoFrame.close(); -}, 'ReadableStream of type transfer should clone JS Objects with serializables when teeing'); +}, 'ReadableStream of type owning should clone JS Objects with serializables when teeing'); diff --git a/streams/readable-streams/owning-type.any.js b/streams/readable-streams/owning-type.any.js new file mode 100644 index 000000000000000..ef42479cc702cb8 --- /dev/null +++ b/streams/readable-streams/owning-type.any.js @@ -0,0 +1,47 @@ +// META: global=window,worker +// META: script=../resources/test-utils.js +// META: script=../resources/rs-utils.js +'use strict'; + +test(() => { + new ReadableStream({ type: 'owning' }); // ReadableStream constructed with 'owning' type +}, 'ReadableStream can be constructed with owning type'); + +test(() => { + let startCalled = false; + + const source = { + start(controller) { + assert_equals(this, source, 'source is this during start'); + assert_true(controller instanceof ReadableStreamDefaultController, 'default controller'); + startCalled = true; + }, + type: 'owning' + }; + + new ReadableStream(source); + assert_true(startCalled); +}, 'ReadableStream of type owning should call start with a ReadableStreamDefaultController'); + +promise_test(async () => { + const uint8Array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); + const buffer = uint8Array.buffer; + buffer.test = 1; + const source = { + start(controller) { + assert_equals(buffer.byteLength, 8); + controller.enqueue(buffer, { transfer : [ buffer ] }); + assert_equals(buffer.test, 1); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const reader = stream.getReader(); + + const chunk = await reader.read(); + + assert_not_equals(chunk.value, buffer); + assert_equals(chunk.value.byteLength, 8); + assert_equals(chunk.value.test, undefined); +}, 'ReadableStream of type owning should transfer enqueued chunks'); diff --git a/streams/readable-streams/transfer-type.any.js b/streams/readable-streams/transfer-type.any.js deleted file mode 100644 index 21941508e42f3fe..000000000000000 --- a/streams/readable-streams/transfer-type.any.js +++ /dev/null @@ -1,220 +0,0 @@ -// META: global=window,worker -// META: script=../resources/test-utils.js -// META: script=../resources/rs-utils.js -'use strict'; - -function createArrayBuffer() -{ - return new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); -} - -function createVideoFrame() -{ - let init = { - format: 'I420', - timestamp: 1234, - codedWidth: 4, - codedHeight: 2 - }; - let data = new Uint8Array([ - 1, 2, 3, 4, 5, 6, 7, 8, // y - 1, 2, // u - 1, 2, // v - ]); - - if (!self.VideoFrame) { - self.VideoFrame = class { - constructor(data, init) { - this.format = init.format; - this.isDetached = false; - } - close() { - this.format = null; - this.isDetached = true; - } - }; - } - - return new VideoFrame(data, init); -} - -test(() => { - new ReadableStream({ type: 'transfer' }); // ReadableStream constructed with 'transfer' type -}, 'ReadableStream can be constructed with transfer type'); - -test(() => { - let startCalled = false; - - const source = { - start(controller) { - assert_equals(this, source, 'source is this during start'); - assert_true(controller instanceof ReadableStreamDefaultController, 'default controller'); - startCalled = true; - }, - type: 'transfer' - }; - - new ReadableStream(source); - assert_true(startCalled); -}, 'ReadableStream of type transfer should call start with a ReadableStreamDefaultController'); - -promise_test(async () => { - const videoFrame = createVideoFrame(); - videoFrame.test = 1; - const source = { - start(controller) { - assert_equals(videoFrame.format, 'I420'); - controller.enqueue(videoFrame, [videoFrame]); - assert_equals(videoFrame.format, null); - assert_equals(videoFrame.test, 1); - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - // Cancelling the stream should close all video frames, thus no console messages of GCing VideoFrames should happen. - stream.cancel(); -}, 'ReadableStream of type transfer should close serialized chunks'); - -promise_test(async () => { - const buffer = createArrayBuffer(); - buffer.test = 1; - const source = { - start(controller) { - assert_equals(buffer.length, 8); - controller.enqueue(buffer, [buffer]); - assert_equals(buffer.length, 0); - assert_equals(buffer.test, 1); - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - const reader = stream.getReader(); - - const chunk = await reader.read(); - assert_equals(chunk.value.length, 8); - assert_equals(chunk.value.test, undefined); -}, 'ReadableStream of type transfer should transfer enqueued chunks'); - -promise_test(async () => { - const videoFrame = createVideoFrame(); - videoFrame.test = 1; - const source = { - start(controller) { - assert_equals(videoFrame.format, 'I420'); - controller.enqueue({ videoFrame }, [videoFrame]); - assert_equals(videoFrame.format, null); - assert_equals(videoFrame.test, 1); - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - const reader = stream.getReader(); - - const chunk = await reader.read(); - assert_equals(chunk.value.videoFrame.format, 'I420'); - assert_equals(chunk.value.videoFrame.test, undefined); - - chunk.value.videoFrame.close(); -}, 'ReadableStream of type transfer should transfer JS chunks with transferred values'); - -promise_test(async () => { - const videoFrame = createVideoFrame(); - videoFrame.close(); - const source = { - start(controller) { - try { - controller.enqueue(videoFrame, [videoFrame]); - assert_unreached('enqueue should throw'); - } catch (e) { - // - } - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - const reader = stream.getReader(); - - return reader.read().then(() => { - assert_unreached('enqueue should error the stream'); - }, () => { - }); -}, 'ReadableStream of type transfer should error when trying to enqueue not serializable values'); - -promise_test(async () => { - const videoFrame = createVideoFrame(); - const source = { - start(controller) { - controller.enqueue(videoFrame, [videoFrame]); - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - const [clone1, clone2] = stream.tee(); - - const chunk1 = await clone1.getReader().read(); - const chunk2 = await clone2.getReader().read(); - - assert_equals(videoFrame.format, null); - assert_equals(chunk1.value.format, 'I420'); - assert_equals(chunk2.value.format, 'I420'); - - chunk1.value.close(); - chunk2.value.close(); -}, 'ReadableStream of type transfer should clone serializable objects when teeing'); - -promise_test(async () => { - const videoFrame = createVideoFrame(); - videoFrame.test = 1; - const source = { - start(controller) { - assert_equals(videoFrame.format, 'I420'); - controller.enqueue({ videoFrame }, [videoFrame]); - assert_equals(videoFrame.format, null); - assert_equals(videoFrame.test, 1); - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - const [clone1, clone2] = stream.tee(); - - const chunk1 = await clone1.getReader().read(); - const chunk2 = await clone2.getReader().read(); - - assert_equals(videoFrame.format, null); - assert_equals(chunk1.value.videoFrame.format, 'I420'); - assert_equals(chunk2.value.videoFrame.format, 'I420'); - - chunk1.value.videoFrame.close(); - chunk2.value.videoFrame.close(); -}, 'ReadableStream of type transfer should clone JS Objects with serializables when teeing'); - -promise_test(async () => { - const channel = new MessageChannel; - let port1 = channel.port1; - const port2 = channel.port2; - - const source = { - start(controller) { - controller.enqueue({port1}, [port1]); - }, - type: 'transfer' - }; - - const stream = new ReadableStream(source); - const [clone1, clone2] = stream.tee(); - - await clone1.getReader().read().then((value) => { - assert_unreached('clone2 should error'); - }, () => { }); - - - await clone2.getReader().read().then((value) => { - assert_unreached('clone2 should error'); - }, () => { }); -}, 'Second branch of transfer-only value ReadableStream tee should end up into errors');