From ffda698d3aa0c9c43bf4366fa2057cc5134ee1cd Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Thu, 26 Dec 2024 12:02:07 +1300 Subject: [PATCH] LibWeb/Streams: Actually implement the piped through steps This mistakenly implemented the 'piped to' operation on ReadableStream. No functional difference as the caller was doing the extra work already of 'piped through' vs 'piped to'. --- Libraries/LibWeb/Fetch/Fetching/Fetching.cpp | 4 +--- Libraries/LibWeb/Streams/ReadableStream.cpp | 17 ++++++++++++----- Libraries/LibWeb/Streams/ReadableStream.h | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp b/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp index a12e3f28bdc..a7d53956986 100644 --- a/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp +++ b/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp @@ -744,9 +744,7 @@ void fetch_response_handover(JS::Realm& realm, Infrastructure::FetchParams const transform_stream->set_up(identity_transform_algorithm, flush_algorithm); // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream. - auto promise = internal_response->body()->stream()->piped_through(transform_stream->writable()); - WebIDL::mark_promise_as_handled(*promise); - internal_response->body()->set_stream(transform_stream->readable()); + internal_response->body()->set_stream(internal_response->body()->stream()->piped_through(transform_stream)); } // 8. If fetchParams’s process response consume body is non-null, then: diff --git a/Libraries/LibWeb/Streams/ReadableStream.cpp b/Libraries/LibWeb/Streams/ReadableStream.cpp index 742277848c6..91e1373e084 100644 --- a/Libraries/LibWeb/Streams/ReadableStream.cpp +++ b/Libraries/LibWeb/Streams/ReadableStream.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -426,19 +427,25 @@ void ReadableStream::set_up_with_byte_reading_support(GC::Ptr pul } // https://streams.spec.whatwg.org/#readablestream-pipe-through -GC::Ref ReadableStream::piped_through(GC::Ref writable, bool prevent_close, bool prevent_abort, bool prevent_cancel, JS::Value signal) +GC::Ref ReadableStream::piped_through(GC::Ref transform, bool prevent_close, bool prevent_abort, bool prevent_cancel, JS::Value signal) { // 1. Assert: ! IsReadableStreamLocked(readable) is false. VERIFY(!is_readable_stream_locked(*this)); - // 2. Assert: ! IsWritableStreamLocked(writable) is false. - VERIFY(!is_writable_stream_locked(writable)); + // 2. Assert: ! IsWritableStreamLocked(transform.[[writable]]) is false. + VERIFY(!is_writable_stream_locked(transform->writable())); // 3. Let signalArg be signal if signal was given, or undefined otherwise. // NOTE: Done by default arguments. - // 4. Return ! ReadableStreamPipeTo(readable, writable, preventClose, preventAbort, preventCancel, signalArg). - return readable_stream_pipe_to(*this, writable, prevent_close, prevent_abort, prevent_cancel, signal); + // 4. Let promise be ! ReadableStreamPipeTo(readable, transform.[[writable]], preventClose, preventAbort, preventCancel, signalArg). + auto promise = readable_stream_pipe_to(*this, transform->writable(), prevent_close, prevent_abort, prevent_cancel, signal); + + // 5. Set promise.[[PromiseIsHandled]] to true. + WebIDL::mark_promise_as_handled(*promise); + + // 6. Return transform.[[readable]]. + return transform->readable(); } } diff --git a/Libraries/LibWeb/Streams/ReadableStream.h b/Libraries/LibWeb/Streams/ReadableStream.h index 5cfc1e66dce..af7e9f4fd8c 100644 --- a/Libraries/LibWeb/Streams/ReadableStream.h +++ b/Libraries/LibWeb/Streams/ReadableStream.h @@ -109,7 +109,7 @@ public: WebIDL::ExceptionOr pull_from_bytes(ByteBuffer); WebIDL::ExceptionOr enqueue(JS::Value chunk); void set_up_with_byte_reading_support(GC::Ptr = {}, GC::Ptr = {}, double high_water_mark = 0); - GC::Ref piped_through(GC::Ref, bool prevent_close = false, bool prevent_abort = false, bool prevent_cancel = false, JS::Value signal = JS::js_undefined()); + GC::Ref piped_through(GC::Ref, bool prevent_close = false, bool prevent_abort = false, bool prevent_cancel = false, JS::Value signal = JS::js_undefined()); GC::Ptr current_byob_request_view();