54 lines
1.9 KiB
JavaScript
54 lines
1.9 KiB
JavaScript
// 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');
|