Quellcode durchsuchen

LibWeb: Implement CountQueuingStrategy highWaterMark property

Shannon Booth vor 2 Jahren
Ursprung
Commit
c9941ba95b

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -493,6 +493,7 @@ set(SOURCES
     SecureContexts/AbstractOperations.cpp
     SecureContexts/AbstractOperations.cpp
     SRI/SRI.cpp
     SRI/SRI.cpp
     Streams/AbstractOperations.cpp
     Streams/AbstractOperations.cpp
+    Streams/CountQueuingStrategy.cpp
     Streams/ReadableByteStreamController.cpp
     Streams/ReadableByteStreamController.cpp
     Streams/ReadableStream.cpp
     Streams/ReadableStream.cpp
     Streams/ReadableStreamBYOBReader.cpp
     Streams/ReadableStreamBYOBReader.cpp

+ 1 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -535,6 +535,7 @@ class Selection;
 }
 }
 
 
 namespace Web::Streams {
 namespace Web::Streams {
+class CountQueuingStrategy;
 class ReadableByteStreamController;
 class ReadableByteStreamController;
 class ReadableStream;
 class ReadableStream;
 class ReadableStreamBYOBReader;
 class ReadableStreamBYOBReader;

+ 38 - 0
Userland/Libraries/LibWeb/Streams/CountQueuingStrategy.cpp

@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2023, Shannon Booth <shannon.ml.booth@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Bindings/CountQueuingStrategyPrototype.h>
+#include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/Streams/CountQueuingStrategy.h>
+#include <LibWeb/WebIDL/ExceptionOr.h>
+
+namespace Web::Streams {
+
+// https://streams.spec.whatwg.org/#blqs-constructor
+WebIDL::ExceptionOr<JS::NonnullGCPtr<CountQueuingStrategy>> CountQueuingStrategy::construct_impl(JS::Realm& realm, QueuingStrategyInit const& init)
+{
+    // The new CountQueuingStrategy(init) constructor steps are:
+    // 1. Set this.[[highWaterMark]] to init["highWaterMark"].
+    return MUST_OR_THROW_OOM(realm.heap().allocate<CountQueuingStrategy>(realm, realm, init.high_water_mark));
+}
+
+CountQueuingStrategy::CountQueuingStrategy(JS::Realm& realm, double high_water_mark)
+    : PlatformObject(realm)
+    , m_high_water_mark(high_water_mark)
+{
+}
+
+CountQueuingStrategy::~CountQueuingStrategy() = default;
+
+JS::ThrowCompletionOr<void> CountQueuingStrategy::initialize(JS::Realm& realm)
+{
+    MUST_OR_THROW_OOM(Base::initialize(realm));
+    set_prototype(&Bindings::ensure_web_prototype<Bindings::CountQueuingStrategyPrototype>(realm, "CountQueuingStrategy"));
+
+    return {};
+}
+
+}

+ 43 - 0
Userland/Libraries/LibWeb/Streams/CountQueuingStrategy.h

@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2023, Shannon Booth <shannon.ml.booth@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Forward.h>
+#include <LibJS/Forward.h>
+#include <LibWeb/Bindings/PlatformObject.h>
+#include <LibWeb/Forward.h>
+#include <LibWeb/Streams/QueuingStrategyInit.h>
+
+namespace Web::Streams {
+
+// https://streams.spec.whatwg.org/#countqueuingstrategy
+class CountQueuingStrategy final : public Bindings::PlatformObject {
+    WEB_PLATFORM_OBJECT(CountQueuingStrategy, Bindings::PlatformObject);
+
+public:
+    static WebIDL::ExceptionOr<JS::NonnullGCPtr<CountQueuingStrategy>> construct_impl(JS::Realm&, QueuingStrategyInit const&);
+
+    virtual ~CountQueuingStrategy() override;
+
+    // https://streams.spec.whatwg.org/#cqs-high-water-mark
+    double high_water_mark() const
+    {
+        // The highWaterMark getter steps are:
+        // 1. Return this.[[highWaterMark]].
+        return m_high_water_mark;
+    }
+
+private:
+    explicit CountQueuingStrategy(JS::Realm&, double high_water_mark);
+
+    virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
+
+    // https://streams.spec.whatwg.org/#countqueuingstrategy-highwatermark
+    double m_high_water_mark { 0 };
+};
+
+}

+ 11 - 0
Userland/Libraries/LibWeb/Streams/CountQueuingStrategy.idl

@@ -0,0 +1,11 @@
+#import <Streams/QueuingStrategyInit.idl>
+
+// https://streams.spec.whatwg.org/#cqs-class-definition
+[Exposed=*]
+interface CountQueuingStrategy {
+    constructor(QueuingStrategyInit init);
+
+    readonly attribute unrestricted double highWaterMark;
+
+    // FIXME: readonly attribute Function size;
+};

+ 1 - 0
Userland/Libraries/LibWeb/idl_files.cmake

@@ -186,6 +186,7 @@ libweb_js_bindings(NavigationTiming/PerformanceTiming)
 libweb_js_bindings(PerformanceTimeline/PerformanceEntry)
 libweb_js_bindings(PerformanceTimeline/PerformanceEntry)
 libweb_js_bindings(RequestIdleCallback/IdleDeadline)
 libweb_js_bindings(RequestIdleCallback/IdleDeadline)
 libweb_js_bindings(ResizeObserver/ResizeObserver)
 libweb_js_bindings(ResizeObserver/ResizeObserver)
+libweb_js_bindings(Streams/CountQueuingStrategy)
 libweb_js_bindings(Streams/ReadableByteStreamController)
 libweb_js_bindings(Streams/ReadableByteStreamController)
 libweb_js_bindings(Streams/ReadableStream)
 libweb_js_bindings(Streams/ReadableStream)
 libweb_js_bindings(Streams/ReadableStreamBYOBReader)
 libweb_js_bindings(Streams/ReadableStreamBYOBReader)