diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index 2fb167a3bc..509518da8e 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -1308,6 +1308,19 @@ void writable_stream_update_backpressure(WritableStream& stream, bool backpressu stream.set_backpressure(backpressure); } +// https://streams.spec.whatwg.org/#writable-stream-default-writer-abort +WebIDL::ExceptionOr> writable_stream_default_writer_abort(WritableStreamDefaultWriter& writer, JS::Value reason) +{ + // 1. Let stream be writer.[[stream]]. + auto stream = writer.stream(); + + // 2. Assert: stream is not undefined. + VERIFY(stream); + + // 3. Return ! WritableStreamAbort(stream, reason). + return writable_stream_abort(*stream, reason); +} + // https://streams.spec.whatwg.org/#writable-stream-default-writer-ensure-ready-promise-rejected void writable_stream_default_writer_ensure_ready_promise_rejected(WritableStreamDefaultWriter& writer, JS::Value error) { diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h index d9a97f65cc..bc8ed2b420 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h @@ -73,6 +73,7 @@ void writable_stream_reject_close_and_closed_promise_if_needed(WritableStream&); WebIDL::ExceptionOr writable_stream_start_erroring(WritableStream&, JS::Value reason); void writable_stream_update_backpressure(WritableStream&, bool backpressure); +WebIDL::ExceptionOr> writable_stream_default_writer_abort(WritableStreamDefaultWriter&, JS::Value reason); void writable_stream_default_writer_ensure_ready_promise_rejected(WritableStreamDefaultWriter&, JS::Value error); Optional writable_stream_default_writer_get_desired_size(WritableStreamDefaultWriter const&); diff --git a/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.cpp b/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.cpp index 058b4f0b65..d393efb23f 100644 --- a/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.cpp +++ b/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.cpp @@ -49,6 +49,21 @@ JS::GCPtr WritableStreamDefaultWriter::ready() return m_ready_promise->promise(); } +// https://streams.spec.whatwg.org/#default-writer-abort +WebIDL::ExceptionOr> WritableStreamDefaultWriter::abort(JS::Value reason) +{ + auto& realm = this->realm(); + + // 1. If this.[[stream]] is undefined, return a promise rejected with a TypeError exception. + if (!m_stream) { + auto exception = MUST_OR_THROW_OOM(JS::TypeError::create(realm, "Cannot abort a writer that has no locked stream"sv)); + return WebIDL::create_rejected_promise(realm, exception)->promise(); + } + + // 2. Return ! WritableStreamDefaultWriterAbort(this, reason). + return TRY(writable_stream_default_writer_abort(*this, reason))->promise(); +} + WritableStreamDefaultWriter::WritableStreamDefaultWriter(JS::Realm& realm) : Bindings::PlatformObject(realm) { diff --git a/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.h b/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.h index a11b1be596..e328613df9 100644 --- a/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.h +++ b/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.h @@ -27,6 +27,7 @@ public: JS::GCPtr closed(); WebIDL::ExceptionOr> desired_size() const; JS::GCPtr ready(); + WebIDL::ExceptionOr> abort(JS::Value reason); JS::GCPtr closed_promise() { return m_closed_promise; } void set_closed_promise(JS::GCPtr value) { m_closed_promise = value; } diff --git a/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.idl b/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.idl index dd6fff7e21..b61d6afb0d 100644 --- a/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.idl +++ b/Userland/Libraries/LibWeb/Streams/WritableStreamDefaultWriter.idl @@ -8,8 +8,9 @@ interface WritableStreamDefaultWriter { readonly attribute unrestricted double? desiredSize; readonly attribute Promise ready; + Promise abort(optional any reason); + // FIXME: - // Promise abort(optional any reason); // Promise close(); // undefined releaseLock(); // Promise write(optional any chunk);