From f1d69d789b6555d32c61c9473fa6e2c00ea1bed8 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Thu, 6 Jul 2023 19:37:12 +0200 Subject: [PATCH] LibWeb: Add TransformStream scaffolding This adds the scaffolding of TransformStream so we can start implementing the necessary abstract operations for it. --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 2 + .../LibWeb/Streams/TransformStream.cpp | 50 +++++++++++++ .../LibWeb/Streams/TransformStream.h | 74 +++++++++++++++++++ .../LibWeb/Streams/TransformStream.idl | 12 +++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 6 files changed, 140 insertions(+) create mode 100644 Userland/Libraries/LibWeb/Streams/TransformStream.cpp create mode 100644 Userland/Libraries/LibWeb/Streams/TransformStream.h create mode 100644 Userland/Libraries/LibWeb/Streams/TransformStream.idl diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index daaf7afd57..89f90999b8 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -514,6 +514,7 @@ set(SOURCES Streams/ReadableStreamDefaultReader.cpp Streams/ReadableStreamGenericReader.cpp Streams/Transformer.cpp + Streams/TransformStream.cpp Streams/UnderlyingSink.cpp Streams/UnderlyingSource.cpp Streams/WritableStream.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 30c1141140..80fc0ff4ee 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -556,6 +556,8 @@ class ReadableStreamDefaultController; class ReadableStreamDefaultReader; class ReadableStreamGenericReaderMixin; class ReadRequest; +class TransformStream; +class TransformStreamDefaultController; class WritableStream; class WritableStreamDefaultController; class WritableStreamDefaultWriter; diff --git a/Userland/Libraries/LibWeb/Streams/TransformStream.cpp b/Userland/Libraries/LibWeb/Streams/TransformStream.cpp new file mode 100644 index 0000000000..79dc4a8fad --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/TransformStream.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2023, Kenneth Myhra + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include + +namespace Web::Streams { + +// https://streams.spec.whatwg.org/#ts-construct +WebIDL::ExceptionOr> TransformStream::construct_impl(JS::Realm& realm, Optional> transformer_object, QueuingStrategy const& writable_strategy, QueuingStrategy const& readable_strategy) +{ + (void)transformer_object; + (void)writable_strategy; + (void)readable_strategy; + + return MUST_OR_THROW_OOM(realm.heap().allocate(realm, realm)); +} + +TransformStream::TransformStream(JS::Realm& realm) + : Bindings::PlatformObject(realm) +{ +} + +TransformStream::~TransformStream() = default; + +JS::ThrowCompletionOr TransformStream::initialize(JS::Realm& realm) +{ + MUST_OR_THROW_OOM(Base::initialize(realm)); + set_prototype(&Bindings::ensure_web_prototype(realm, "TransformStream")); + + return {}; +} + +void TransformStream::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_backpressure_change_promise); + visitor.visit(m_controller); + visitor.visit(m_readable); + visitor.visit(m_writable); +} + +} diff --git a/Userland/Libraries/LibWeb/Streams/TransformStream.h b/Userland/Libraries/LibWeb/Streams/TransformStream.h new file mode 100644 index 0000000000..514fe42598 --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/TransformStream.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2023, Kenneth Myhra + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace Web::Streams { + +class TransformStream final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(TransformStream, Bindings::PlatformObject); + +public: + virtual ~TransformStream() override; + + static WebIDL::ExceptionOr> construct_impl(JS::Realm&, Optional> transformer_object = {}, QueuingStrategy const& writable_strategy = {}, QueuingStrategy const& readable_strategy = {}); + + // https://streams.spec.whatwg.org/#ts-readable + JS::NonnullGCPtr readable() { return *m_readable; } + void set_readable(ReadableStream& readable) { m_readable = readable; } + + // https://streams.spec.whatwg.org/#ts-writable + JS::NonnullGCPtr writable() { return *m_writable; } + void set_writable(WritableStream& writable) { m_writable = writable; } + + Optional backpressure() const { return m_backpressure; } + void set_backpressure(Optional value) { m_backpressure = move(value); } + + JS::GCPtr backpressure_change_promise() const { return m_backpressure_change_promise; } + void set_backpressure_change_promise(JS::GCPtr value) { m_backpressure_change_promise = value; } + + JS::GCPtr controller() const { return m_controller; } + void set_controller(JS::GCPtr value) { m_controller = value; } + +private: + explicit TransformStream(JS::Realm& realm); + + virtual JS::ThrowCompletionOr initialize(JS::Realm&) override; + + virtual void visit_edges(Cell::Visitor&) override; + + // https://streams.spec.whatwg.org/#transformstream-backpressure + // Whether there was backpressure on [[readable]] the last time it was observed + Optional m_backpressure { false }; + + // https://streams.spec.whatwg.org/#transformstream-backpressurechangepromise + // A promise which is fulfilled and replaced every time the value of [[backpressure]] changes + JS::GCPtr m_backpressure_change_promise; + + // https://streams.spec.whatwg.org/#transformstream-controller + // A TransformStreamDefaultController created with the ability to control [[readable]] and [[writable]] + JS::GCPtr m_controller; + + // https://streams.spec.whatwg.org/#transformstream-detached + // A boolean flag set to true when the stream is transferred + bool m_detached { false }; + + // https://streams.spec.whatwg.org/#transformstream-readable + // The ReadableStream instance controlled by this object + JS::GCPtr m_readable; + + // https://streams.spec.whatwg.org/#transformstream-writable + // The WritableStream instance controlled by this object + JS::GCPtr m_writable; +}; + +} diff --git a/Userland/Libraries/LibWeb/Streams/TransformStream.idl b/Userland/Libraries/LibWeb/Streams/TransformStream.idl new file mode 100644 index 0000000000..74bca04548 --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/TransformStream.idl @@ -0,0 +1,12 @@ +#import +#import +#import + +// https://streams.spec.whatwg.org/#transformstream +[Exposed=*, Transferable] +interface TransformStream { + constructor(optional object transformer, optional QueuingStrategy writableStrategy = {}, optional QueuingStrategy readableStrategy = {}); + + readonly attribute ReadableStream readable; + readonly attribute WritableStream writable; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 64a9ac8317..b9f8bd2897 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -196,6 +196,7 @@ libweb_js_bindings(Streams/ReadableStreamBYOBReader) libweb_js_bindings(Streams/ReadableStreamBYOBRequest) libweb_js_bindings(Streams/ReadableStreamDefaultController) libweb_js_bindings(Streams/ReadableStreamDefaultReader) +libweb_js_bindings(Streams/TransformStream) libweb_js_bindings(Streams/WritableStream) libweb_js_bindings(Streams/WritableStreamDefaultWriter) libweb_js_bindings(SVG/SVGAnimatedLength)