diff --git a/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp b/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp index a12e3f28bd..a7d5395698 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 742277848c..91e1373e08 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 5cfc1e66dc..af7e9f4fd8 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();