From 12cfa08a093d0d60406d353232328ca60eff0bf5 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Sat, 6 Apr 2024 12:10:42 +0200 Subject: [PATCH] LibWeb: Use Vector to store chunks in ReadLoopReadRequest This stores the incoming chunks into a Vector of ByteBuffer in order to be able to retrieve them in the same order as they came in. --- .../LibWeb/Streams/ReadableStreamDefaultReader.cpp | 12 ++++++++---- .../LibWeb/Streams/ReadableStreamDefaultReader.h | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp index 34a0b78786a57f..a9677644f9090b 100644 --- a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp @@ -86,7 +86,7 @@ void ReadLoopReadRequest::on_chunk(JS::Value chunk) auto const& buffer = array.viewed_array_buffer()->buffer(); // 2. Append the bytes represented by chunk to bytes. - m_bytes.append(buffer); + m_byte_chunks.append(buffer); // FIXME: As the spec suggests, implement this non-recursively - instead of directly. It is not too big of a deal currently // as we enqueue the entire blob buffer in one go, meaning that we only recurse a single time. Once we begin queuing @@ -104,7 +104,7 @@ void ReadLoopReadRequest::on_chunk(JS::Value chunk) void ReadLoopReadRequest::on_close() { // 1. Call successSteps with bytes. - m_success_steps(m_bytes); + m_success_steps(m_byte_chunks); } // error steps, given e @@ -206,8 +206,12 @@ WebIDL::ExceptionOr> ReadableStreamDefaultRead auto promise = WebIDL::create_promise(realm); - auto success_steps = [promise, &realm](ByteBuffer bytes) { - auto buffer = JS::ArrayBuffer::create(realm, move(bytes)); + auto success_steps = [promise, &realm](Vector const& byte_chunks) { + ByteBuffer concatenated_byte_chunks; + for (auto const& chunk : byte_chunks) + concatenated_byte_chunks.append(chunk); + + auto buffer = JS::ArrayBuffer::create(realm, move(concatenated_byte_chunks)); WebIDL::resolve_promise(realm, promise, buffer); }; diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h index 4b8531fb00e63d..78c3d8e0a400fb 100644 --- a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h @@ -36,7 +36,7 @@ class ReadLoopReadRequest final : public ReadRequest { public: // successSteps, which is an algorithm accepting a byte sequence - using SuccessSteps = JS::SafeFunction; + using SuccessSteps = JS::SafeFunction const&)>; // failureSteps, which is an algorithm accepting a JavaScript value using FailureSteps = JS::SafeFunction; @@ -55,7 +55,7 @@ class ReadLoopReadRequest final : public ReadRequest { JS::VM& m_vm; JS::NonnullGCPtr m_realm; JS::NonnullGCPtr m_reader; - ByteBuffer m_bytes; + Vector m_byte_chunks; SuccessSteps m_success_steps; FailureSteps m_failure_steps; };