From bd7809cc1825e8836410b8ee4f9187e61d1a2508 Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Sat, 8 Apr 2023 11:49:58 -0700 Subject: [PATCH] LibWeb: Mostly implement ReadableByteStreamController.[[ReleaseSteps]] --- .../Streams/ReadableByteStreamController.cpp | 21 +++++++++++++++++++ .../Streams/ReadableByteStreamController.h | 1 + 2 files changed, 22 insertions(+) diff --git a/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp b/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp index 1bca783d7ab..56b0d19e8c1 100644 --- a/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp +++ b/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp @@ -106,6 +106,27 @@ WebIDL::ExceptionOr ReadableByteStreamController::pull_steps(NonnullRefPtr return {}; } +// https://streams.spec.whatwg.org/#rbs-controller-private-pull +WebIDL::ExceptionOr ReadableByteStreamController::release_steps() +{ + auto& vm = this->vm(); + + // 1. If this.[[pendingPullIntos]] is not empty, + if (!m_pending_pull_intos.is_empty()) { + // 1. Let firstPendingPullInto be this.[[pendingPullIntos]][0]. + auto first_pending_pull_into = m_pending_pull_intos.first(); + + // 2. Set firstPendingPullInto’s reader type to "none". + first_pending_pull_into.reader_type = ReaderType::None; + + // 3. Set this.[[pendingPullIntos]] to the list « firstPendingPullInto ». + m_pending_pull_intos.clear(); + TRY_OR_THROW_OOM(vm, m_pending_pull_intos.try_append(first_pending_pull_into)); + } + + return {}; +} + void ReadableByteStreamController::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); diff --git a/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.h b/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.h index a55905249f9..ca16d3190a6 100644 --- a/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.h +++ b/Userland/Libraries/LibWeb/Streams/ReadableByteStreamController.h @@ -118,6 +118,7 @@ public: WebIDL::ExceptionOr> cancel_steps(JS::Value reason); WebIDL::ExceptionOr pull_steps(NonnullRefPtr); + WebIDL::ExceptionOr release_steps(); private: explicit ReadableByteStreamController(JS::Realm&);