Browse Source

LibWeb: Add ReadableStreamBYOBRequest interface

Matthew Olsson 2 years ago
parent
commit
c7aa4fa166

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

@@ -465,6 +465,7 @@ set(SOURCES
     SecureContexts/AbstractOperations.cpp
     Streams/AbstractOperations.cpp
     Streams/ReadableStream.cpp
+    Streams/ReadableStreamBYOBRequest.cpp
     Streams/ReadableStreamDefaultController.cpp
     Streams/ReadableStreamDefaultReader.cpp
     Streams/ReadableStreamGenericReader.cpp

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

@@ -426,6 +426,7 @@ class Selection;
 
 namespace Web::Streams {
 class ReadableStream;
+class ReadableStreamBYOBRequest;
 class ReadableStreamDefaultController;
 class ReadableStreamDefaultReader;
 class ReadableStreamGenericReaderMixin;

+ 30 - 0
Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBRequest.cpp

@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2023, Matthew Olsson <mattco@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Streams/ReadableStreamBYOBRequest.h>
+
+namespace Web::Streams {
+
+// https://streams.spec.whatwg.org/#rs-byob-request-view
+JS::GCPtr<JS::TypedArrayBase> ReadableStreamBYOBRequest::view()
+{
+    // 1. Return this.[[view]].
+    return m_view;
+}
+
+ReadableStreamBYOBRequest::ReadableStreamBYOBRequest(JS::Realm& realm)
+    : Bindings::PlatformObject(realm)
+{
+}
+
+void ReadableStreamBYOBRequest::visit_edges(Cell::Visitor& visitor)
+{
+    Base::visit_edges(visitor);
+    visitor.visit(m_controller);
+    visitor.visit(m_view);
+}
+
+}

+ 37 - 0
Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBRequest.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2023, Matthew Olsson <mattco@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Runtime/TypedArray.h>
+#include <LibWeb/Bindings/PlatformObject.h>
+
+namespace Web::Streams {
+
+// https://streams.spec.whatwg.org/#readablestreambyobrequest
+class ReadableStreamBYOBRequest : public Bindings::PlatformObject {
+    WEB_PLATFORM_OBJECT(ReadableStreamBYOBRequest, Bindings::PlatformObject);
+
+public:
+    virtual ~ReadableStreamBYOBRequest() override = default;
+
+    JS::GCPtr<JS::TypedArrayBase> view();
+
+private:
+    explicit ReadableStreamBYOBRequest(JS::Realm&);
+
+    virtual void visit_edges(Cell::Visitor&) override;
+
+    // https://streams.spec.whatwg.org/#readablestreambyobrequest-controller
+    // The parent ReadableByteStreamController instance
+    JS::GCPtr<JS::Object> m_controller;
+
+    // https://streams.spec.whatwg.org/#readablestreambyobrequest-view
+    // A typed array representing the destination region to which the controller can write generated data, or null after the BYOB request has been invalidated.
+    JS::GCPtr<JS::TypedArrayBase> m_view;
+};
+
+}

+ 9 - 0
Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBRequest.idl

@@ -0,0 +1,9 @@
+[Exposed=*]
+interface ReadableStreamBYOBRequest {
+    // FIXME: This should be an ArrayBufferView
+    readonly attribute any? view;
+
+    // FIXME: Implement
+    // undefined respond([EnforceRange] unsigned long long bytesWritten);
+    // undefined respondWithNewView(ArrayBufferView view);
+};

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

@@ -180,6 +180,7 @@ libweb_js_bindings(PerformanceTimeline/PerformanceEntry)
 libweb_js_bindings(RequestIdleCallback/IdleDeadline)
 libweb_js_bindings(ResizeObserver/ResizeObserver)
 libweb_js_bindings(Streams/ReadableStream)
+libweb_js_bindings(Streams/ReadableStreamBYOBRequest)
 libweb_js_bindings(Streams/ReadableStreamDefaultController)
 libweb_js_bindings(Streams/ReadableStreamDefaultReader)
 libweb_js_bindings(Streams/WritableStream)