diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 89f90999b8..2ca8ccccf3 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -515,6 +515,7 @@ set(SOURCES Streams/ReadableStreamGenericReader.cpp Streams/Transformer.cpp Streams/TransformStream.cpp + Streams/TransformStreamDefaultController.cpp Streams/UnderlyingSink.cpp Streams/UnderlyingSource.cpp Streams/WritableStream.cpp diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h index 79ecb5eb40..bebeee04b8 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h @@ -24,6 +24,8 @@ using StartAlgorithm = JS::SafeFunction()>; using AbortAlgorithm = JS::SafeFunction>(JS::Value)>; using CloseAlgorithm = JS::SafeFunction>()>; using WriteAlgorithm = JS::SafeFunction>(JS::Value)>; +using FlushAlgorithm = JS::SafeFunction>()>; +using TransformAlgorithm = JS::SafeFunction>(JS::Value)>; WebIDL::ExceptionOr> acquire_readable_stream_default_reader(ReadableStream&); WebIDL::ExceptionOr> acquire_readable_stream_byob_reader(ReadableStream&); diff --git a/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.cpp b/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.cpp new file mode 100644 index 0000000000..84b8fd74f6 --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023, Kenneth Myhra + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::Streams { + +TransformStreamDefaultController::TransformStreamDefaultController(JS::Realm& realm) + : Bindings::PlatformObject(realm) +{ +} + +TransformStreamDefaultController::~TransformStreamDefaultController() = default; + +JS::ThrowCompletionOr TransformStreamDefaultController::initialize(JS::Realm& realm) +{ + MUST_OR_THROW_OOM(Base::initialize(realm)); + set_prototype(&Bindings::ensure_web_prototype(realm, "TransformStreamDefaultController")); + + return {}; +} + +void TransformStreamDefaultController::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_stream); +} + +// https://streams.spec.whatwg.org/#ts-default-controller-desired-size +Optional TransformStreamDefaultController::desired_size() +{ + VERIFY(stream()->readable()->controller().has_value() && stream()->readable()->controller()->has>()); + + // 1. Let readableController be this.[[stream]].[[readable]].[[controller]]. + auto readable_controller = stream()->readable()->controller()->get>(); + + // 2. Return ! ReadableStreamDefaultControllerGetDesiredSize(readableController). + return readable_stream_default_controller_get_desired_size(*readable_controller); +} + +} diff --git a/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.h b/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.h new file mode 100644 index 0000000000..8854941a4d --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023, Kenneth Myhra + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::Streams { + +class TransformStreamDefaultController : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(TransformStreamDefaultController, Bindings::PlatformObject); + +public: + explicit TransformStreamDefaultController(JS::Realm&); + virtual ~TransformStreamDefaultController() override; + + Optional desired_size(); + + auto& flush_algorithm() { return m_flush_algorithm; } + void set_flush_algorithm(Optional&& value) { m_flush_algorithm = move(value); } + + auto& transform_algorithm() { return m_transform_algorithm; } + void set_transform_algorithm(Optional&& value) { m_transform_algorithm = move(value); } + + JS::GCPtr stream() { return m_stream; } + void set_stream(JS::GCPtr stream) { m_stream = stream; } + +private: + virtual JS::ThrowCompletionOr initialize(JS::Realm&) override; + + virtual void visit_edges(Cell::Visitor&) override; + + // https://streams.spec.whatwg.org/#transformstreamdefaultcontroller-flushalgorithm + Optional m_flush_algorithm; + + // https://streams.spec.whatwg.org/#transformstreamdefaultcontroller-transformalgorithm + Optional m_transform_algorithm; + + // https://streams.spec.whatwg.org/#transformstreamdefaultcontroller-stream + JS::GCPtr m_stream; +}; + +} diff --git a/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.idl b/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.idl new file mode 100644 index 0000000000..fefd284d54 --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/TransformStreamDefaultController.idl @@ -0,0 +1,9 @@ +// https://streams.spec.whatwg.org/#transformstreamdefaultcontroller +[Exposed=*] +interface TransformStreamDefaultController { + readonly attribute unrestricted double? desiredSize; + + // FIXME: undefined enqueue(optional any chunk); + // FIXME: undefined error(optional any reason); + // FIXME: undefined terminate(); +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index b9f8bd2897..bb85128758 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -197,6 +197,7 @@ libweb_js_bindings(Streams/ReadableStreamBYOBRequest) libweb_js_bindings(Streams/ReadableStreamDefaultController) libweb_js_bindings(Streams/ReadableStreamDefaultReader) libweb_js_bindings(Streams/TransformStream) +libweb_js_bindings(Streams/TransformStreamDefaultController) libweb_js_bindings(Streams/WritableStream) libweb_js_bindings(Streams/WritableStreamDefaultWriter) libweb_js_bindings(SVG/SVGAnimatedLength)