Browse Source

LibWeb: Implement ReadableStreamBYOBRequest.respond

The parameter in IDL is left as an unsigned long instead of an unsigned
long long as the IDL generator does not currently support that.
Shannon Booth 1 year ago
parent
commit
feb7fbb95d

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

@@ -39,4 +39,24 @@ void ReadableStreamBYOBRequest::visit_edges(Cell::Visitor& visitor)
     visitor.visit(m_view);
 }
 
+WebIDL::ExceptionOr<void> ReadableStreamBYOBRequest::respond(u64 bytes_written)
+{
+    // 1. If this.[[controller]] is undefined, throw a TypeError exception.
+    if (!m_controller)
+        return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "Controller is undefined"_string };
+
+    // 2. If ! IsDetachedBuffer(this.[[view]].[[ArrayBuffer]]) is true, throw a TypeError exception.
+    if (m_view->viewed_array_buffer()->is_detached())
+        return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "Unable to respond to detached ArrayBuffer"_string };
+
+    // 3. Assert: this.[[view]].[[ByteLength]] > 0.
+    VERIFY(m_view->viewed_array_buffer()->byte_length() > 0);
+
+    // 4. Assert: this.[[view]].[[ViewedArrayBuffer]].[[ByteLength]] > 0.
+    VERIFY(m_view->viewed_array_buffer()->byte_length() > 0);
+
+    // 5. Perform ? ReadableByteStreamControllerRespond(this.[[controller]], bytesWritten).
+    return readable_byte_stream_controller_respond(*m_controller, bytes_written);
+}
+
 }

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

@@ -28,6 +28,8 @@ public:
 
     void set_view(JS::GCPtr<WebIDL::ArrayBufferView> value) { m_view = value; }
 
+    WebIDL::ExceptionOr<void> respond(u64 bytes_written);
+
 private:
     explicit ReadableStreamBYOBRequest(JS::Realm&);
 

+ 2 - 1
Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBRequest.idl

@@ -3,6 +3,7 @@
 interface ReadableStreamBYOBRequest {
     readonly attribute ArrayBufferView? view;
 
-    // FIXME: undefined respond([EnforceRange] unsigned long long bytesWritten);
+    // FIXME: Should be unsigned long long
+    undefined respond([EnforceRange] unsigned long bytesWritten);
     // FIXME: undefined respondWithNewView(ArrayBufferView view);
 };