ladybird/Libraries/LibWeb/Streams/WritableStreamDefaultController.h
Shannon Booth 637fd51595 LibWeb: Unify WebIDL C++ type generation
Represent WebIDL C++ types with a single CppType model that tracks
nullability, optional presence, and contained storage.

GC-like values now use GC::Ref/GC::Ptr directly, while containers choose
"plain", "Root", or "Conservative" container types depending on what
they contain. For example, sequence<Element> becomes a RootVector of
GC::Ref values, while sequence<SomeDictionary> becomes a
ConservativeVector only when the dictionary contains GC-like values.
This moves the generated bindings away from wrapping GC values in
GC::Root by default.

This has broad fallout as the types passed to interfaces for GC
objects changes almost fully across the board.
2026-05-23 18:26:12 +02:00

104 lines
4.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2023, Matthew Olsson <mattco@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/SinglyLinkedList.h>
#include <LibWeb/Bindings/PlatformObject.h>
#include <LibWeb/Streams/AbstractOperations.h>
namespace Web::Streams {
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller
class WritableStreamDefaultController final : public Bindings::PlatformObject {
WEB_PLATFORM_OBJECT(WritableStreamDefaultController, Bindings::PlatformObject);
GC_DECLARE_ALLOCATOR(WritableStreamDefaultController);
public:
virtual ~WritableStreamDefaultController() override = default;
void error(Optional<JS::Value> error);
GC::Ref<DOM::AbortSignal> signal() { return *m_signal; }
void set_signal(GC::Ref<DOM::AbortSignal> value) { m_signal = value; }
GC::Ptr<AbortAlgorithm> abort_algorithm() { return m_abort_algorithm; }
void set_abort_algorithm(GC::Ptr<AbortAlgorithm> value) { m_abort_algorithm = value; }
GC::Ptr<CloseAlgorithm> close_algorithm() { return m_close_algorithm; }
void set_close_algorithm(GC::Ptr<CloseAlgorithm> value) { m_close_algorithm = value; }
SinglyLinkedList<ValueWithSize>& queue() { return m_queue; }
double queue_total_size() const { return m_queue_total_size; }
void set_queue_total_size(double value) { m_queue_total_size = value; }
bool started() const { return m_started; }
void set_started(bool value) { m_started = value; }
double strategy_hwm() const { return m_strategy_hwm; }
void set_strategy_hwm(double value) { m_strategy_hwm = value; }
GC::Ptr<SizeAlgorithm> strategy_size_algorithm() { return m_strategy_size_algorithm; }
void set_strategy_size_algorithm(GC::Ptr<SizeAlgorithm> value) { m_strategy_size_algorithm = value; }
GC::Ref<WritableStream> stream() { return *m_stream; }
void set_stream(GC::Ref<WritableStream> value) { m_stream = value; }
GC::Ptr<WriteAlgorithm> write_algorithm() { return m_write_algorithm; }
void set_write_algorithm(GC::Ptr<WriteAlgorithm> value) { m_write_algorithm = value; }
GC::Ref<WebIDL::Promise> abort_steps(JS::Value reason);
void error_steps();
private:
explicit WritableStreamDefaultController(JS::Realm&);
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Visitor&) override;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-abortalgorithm
// A promise-returning algorithm, taking one argument (the abort reason), which communicates a requested abort to the underlying sink
GC::Ptr<AbortAlgorithm> m_abort_algorithm;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-closealgorithm
// A promise-returning algorithm which communicates a requested close to the underlying sink
GC::Ptr<CloseAlgorithm> m_close_algorithm;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-queue
// A list representing the streams internal queue of chunks
SinglyLinkedList<ValueWithSize> m_queue;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-queuetotalsize
// The total size of all the chunks stored in [[queue]]
double m_queue_total_size { 0 };
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-signal
// An AbortSignal that can be used to abort the pending write or close operation when the stream is aborted.
GC::Ptr<DOM::AbortSignal> m_signal;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-started
// A boolean flag indicating whether the underlying sink has finished starting
bool m_started { false };
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-strategyhwm
// A number supplied by the creator of the stream as part of the streams queuing strategy, indicating the point at which the stream will apply backpressure to its underlying sink
double m_strategy_hwm { 0 };
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-strategysizealgorithm
// An algorithm to calculate the size of enqueued chunks, as part of the streams queuing strategy
GC::Ptr<SizeAlgorithm> m_strategy_size_algorithm;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-stream
// The WritableStream instance controlled
GC::Ptr<WritableStream> m_stream;
// https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-writealgorithm
// A promise-returning algorithm, taking one argument (the chunk to write), which writes data to the underlying sink
GC::Ptr<WriteAlgorithm> m_write_algorithm;
};
}