Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Streams: test whether patched then() sees correct byobRequest #48085

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions streams/readable-byte-streams/general.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -870,11 +870,11 @@ promise_test(() => {
start(c) {
controller = c;
},
async pull() {
pull() {
byobRequestDefined.push(controller.byobRequest !== null);
const initialByobRequest = controller.byobRequest;

const transferredView = await transferArrayBufferView(controller.byobRequest.view);
const transferredView = transferArrayBufferView(controller.byobRequest.view);
transferredView[0] = 0x01;
controller.byobRequest.respondWithNewView(transferredView);

Expand Down Expand Up @@ -2288,7 +2288,7 @@ promise_test(async t => {
await pullCalledPromise;

// Transfer the original BYOB request's buffer, and respond with a new view on that buffer
const transferredView = await transferArrayBufferView(controller.byobRequest.view);
const transferredView = transferArrayBufferView(controller.byobRequest.view);
const newView = transferredView.subarray(0, 1);
newView[0] = 42;

Expand Down Expand Up @@ -2328,7 +2328,7 @@ promise_test(async t => {
await pullCalledPromise;

// Transfer the original BYOB request's buffer, and respond with an empty view on that buffer
const transferredView = await transferArrayBufferView(controller.byobRequest.view);
const transferredView = transferArrayBufferView(controller.byobRequest.view);
const newView = transferredView.subarray(0, 0);

controller.close();
Expand Down
54 changes: 54 additions & 0 deletions streams/readable-byte-streams/patched-global.any.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// META: global=window,worker,shadowrealm
// META: script=../resources/test-utils.js
'use strict';

// Tests which patch the global environment are kept separate to avoid
// interfering with other tests.

promise_test(async (t) => {
let controller;
const rs = new ReadableStream({
type: 'bytes',
start(c) {
controller = c;
}
});
const reader = rs.getReader({mode: 'byob'});

const length = 0x4000;
const buffer = new ArrayBuffer(length);
const bigArray = new BigUint64Array(buffer, length - 8, 1);

const read1 = reader.read(new Uint8Array(new ArrayBuffer(0x100)));
const read2 = reader.read(bigArray);

let flag = false;
Object.defineProperty(Object.prototype, 'then', {
get: t.step_func(() => {
if (!flag) {
flag = true;
assert_equals(controller.byobRequest, null, 'byobRequest should be null after filling both views');
}
}),
configurable: true
});
t.add_cleanup(() => {
delete Object.prototype.then;
});

controller.enqueue(new Uint8Array(0x110).fill(0x42));
assert_true(flag, 'patched then() should be called');

// The first read() is filled entirely with 0x100 bytes
const result1 = await read1;
assert_false(result1.done, 'result1.done');
assert_typed_array_equals(result1.value, new Uint8Array(0x100).fill(0x42), 'result1.value');

// The second read() is filled with the remaining 0x10 bytes
const result2 = await read2;
assert_false(result2.done, 'result2.done');
assert_equals(result2.value.constructor, BigUint64Array, 'result2.value constructor');
assert_equals(result2.value.byteOffset, length - 8, 'result2.value byteOffset');
assert_equals(result2.value.length, 1, 'result2.value length');
assert_array_equals([...result2.value], [0x42424242_42424242n], 'result2.value contents');
}, 'Patched then() sees byobRequest after filling all pending pull-into descriptors');
10 changes: 1 addition & 9 deletions streams/resources/rs-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,7 @@
}

function transferArrayBufferView(view) {
const noopByteStream = new ReadableStream({
type: 'bytes',
pull(c) {
c.byobRequest.respond(c.byobRequest.view.byteLength);
c.close();
}
});
const reader = noopByteStream.getReader({ mode: 'byob' });
return reader.read(view).then((result) => result.value);
return structuredClone(view, { transfer: [view.buffer] });
MattiasBuelens marked this conversation as resolved.
Show resolved Hide resolved
}

self.RandomPushSource = RandomPushSource;
Expand Down