Files
ladybird/Tests/LibWeb/Text/input/Streams/ReadableStreamBYOBReader-read-non-transferable-buffer.html
Andreas Kling b629914428 LibWeb: Make TransferArrayBuffer zero-copy
Move owned ArrayBuffer storage directly when transferring stream
buffers instead of copying the bytes before detaching the source.
WebAssembly memory continues to copy because its ArrayBuffer wraps
externally-owned storage.

Preserve the abrupt completion from DetachArrayBuffer before moving
storage so non-transferable buffers, such as WebAssembly.Memory-backed
views, still surface TypeError through stream operations instead of
aborting.

This saves ~130ms of main thread time when loading a YouTube video
on my Linux computer. :^)
2026-04-25 10:53:51 +02:00

64 lines
2.2 KiB
HTML

<!DOCTYPE html>
<script src="../include.js"></script>
<script>
asyncTest(async done => {
{
const stream = new ReadableStream({ type: "bytes" });
const reader = stream.getReader({ mode: "byob" });
const memory = new WebAssembly.Memory({ initial: 1 });
const view = new Uint8Array(memory.buffer, 0, 8);
try {
await reader.read(view);
println("FAIL: read() should reject");
} catch (error) {
println(`read() rejected with TypeError: ${error instanceof TypeError}`);
}
println(`Read buffer byteLength: ${memory.buffer.byteLength}`);
}
{
let controller;
new ReadableStream({
type: "bytes",
start(streamController) {
controller = streamController;
},
});
const memory = new WebAssembly.Memory({ initial: 1 });
try {
controller.enqueue(new Uint8Array(memory.buffer, 0, 8));
println("FAIL: enqueue() should throw");
} catch (error) {
println(`enqueue() threw TypeError: ${error instanceof TypeError}`);
}
println(`Enqueue buffer byteLength: ${memory.buffer.byteLength}`);
}
{
const memory = new WebAssembly.Memory({ initial: 1 });
const stream = new ReadableStream({
type: "bytes",
pull(controller) {
controller.byobRequest.respondWithNewView(new Uint8Array(memory.buffer, 0, 8));
},
});
const reader = stream.getReader({ mode: "byob" });
try {
await reader.read(new Uint8Array(new ArrayBuffer(memory.buffer.byteLength), 0, 8));
println("FAIL: read() should reject after respondWithNewView()");
} catch (error) {
println(`respondWithNewView() rejected with TypeError: ${error instanceof TypeError}`);
}
println(`RespondWithNewView buffer byteLength: ${memory.buffer.byteLength}`);
}
done();
});
</script>