From b0bc8f2282cf32dbac8149f8bf642466cfdf5cd6 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sat, 17 Jun 2023 15:27:14 +1200 Subject: [PATCH] LibWeb: Add ReadableStreamDefaultReader::read_all_bytes_deprecated This is not to the specification, but as the FIXME comment for the function states, we need it to be able to properly interface with the FileAPI spcification, which seems to have not been updated to the non promise based API. --- .../Streams/ReadableStreamDefaultReader.cpp | 23 +++++++++++++++++++ .../Streams/ReadableStreamDefaultReader.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp index f6592bdbf7..50916babee 100644 --- a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.cpp @@ -185,6 +185,29 @@ WebIDL::ExceptionOr ReadableStreamDefaultReader::read_all_bytes(ReadLoopRe return {}; } +// FIXME: This function is a promise-based wrapper around "read all bytes". The spec changed this function to not use promises +// in https://github.com/whatwg/streams/commit/f894acdd417926a2121710803cef593e15127964 - however, it seems that the +// FileAPI blob specification has not been updated to match, see: https://github.com/w3c/FileAPI/issues/187. +WebIDL::ExceptionOr> ReadableStreamDefaultReader::read_all_bytes_deprecated() +{ + auto& realm = this->realm(); + + auto promise = WebIDL::create_promise(realm); + + auto success_steps = [promise, &realm](ByteBuffer bytes) { + auto buffer = JS::ArrayBuffer::create(realm, move(bytes)); + WebIDL::resolve_promise(realm, promise, buffer); + }; + + auto failure_steps = [promise, &realm](JS::Value error) { + WebIDL::reject_promise(realm, promise, error); + }; + + TRY(read_all_bytes(move(success_steps), move(failure_steps))); + + return promise; +} + // https://streams.spec.whatwg.org/#default-reader-release-lock WebIDL::ExceptionOr ReadableStreamDefaultReader::release_lock() { diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h index c5a32b7baf..1a2efa8824 100644 --- a/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamDefaultReader.h @@ -68,6 +68,8 @@ public: WebIDL::ExceptionOr> read(); WebIDL::ExceptionOr read_all_bytes(ReadLoopReadRequest::SuccessSteps, ReadLoopReadRequest::FailureSteps); + WebIDL::ExceptionOr> read_all_bytes_deprecated(); + WebIDL::ExceptionOr release_lock(); SinglyLinkedList>& read_requests() { return m_read_requests; }