From e2c4019bfcc1b16b802c82ab2f3858cf4aba2794 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Mon, 20 May 2024 10:42:33 +0200 Subject: [PATCH] LibWeb: Close acquired writer in AO readable_stream_pipe_to() Also adds a test to prove that the WritableStream's close callback is called. --- ...am-pipeTo-Writer-close-callback-called.txt | 1 + ...m-pipeTo-Writer-close-callback-called.html | 20 +++++++++++++++++++ .../LibWeb/Streams/AbstractOperations.cpp | 10 ++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/Streams/ReadableStream-pipeTo-Writer-close-callback-called.txt create mode 100644 Tests/LibWeb/Text/input/Streams/ReadableStream-pipeTo-Writer-close-callback-called.html diff --git a/Tests/LibWeb/Text/expected/Streams/ReadableStream-pipeTo-Writer-close-callback-called.txt b/Tests/LibWeb/Text/expected/Streams/ReadableStream-pipeTo-Writer-close-callback-called.txt new file mode 100644 index 00000000000000..2ffe46565bab34 --- /dev/null +++ b/Tests/LibWeb/Text/expected/Streams/ReadableStream-pipeTo-Writer-close-callback-called.txt @@ -0,0 +1 @@ +Writer has been closed. \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/Streams/ReadableStream-pipeTo-Writer-close-callback-called.html b/Tests/LibWeb/Text/input/Streams/ReadableStream-pipeTo-Writer-close-callback-called.html new file mode 100644 index 00000000000000..b6cd67d13ed77a --- /dev/null +++ b/Tests/LibWeb/Text/input/Streams/ReadableStream-pipeTo-Writer-close-callback-called.html @@ -0,0 +1,20 @@ + + diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index 5ad849e153295d..731968e2ea4ed2 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -314,11 +314,17 @@ JS::NonnullGCPtr readable_stream_pipe_to(ReadableStream& source WebIDL::resolve_promise(realm, promise, JS::js_undefined()); }; - auto success_steps = [promise, &realm](ByteBuffer) { + auto success_steps = [promise, &realm, writer](ByteBuffer) { + // Make sure we close the acquired writer. + WebIDL::resolve_promise(realm, writable_stream_default_writer_close(*writer), JS::js_undefined()); + WebIDL::resolve_promise(realm, promise, JS::js_undefined()); }; - auto failure_steps = [promise, &realm](JS::Value error) { + auto failure_steps = [promise, &realm, writer](JS::Value error) { + // Make sure we close the acquired writer. + WebIDL::resolve_promise(realm, writable_stream_default_writer_close(*writer), JS::js_undefined()); + WebIDL::reject_promise(realm, promise, error); };