diff --git a/Libraries/LibWeb/WebIDL/Buffers.cpp b/Libraries/LibWeb/WebIDL/Buffers.cpp index 8529496a0a0..94477be5638 100644 --- a/Libraries/LibWeb/WebIDL/Buffers.cpp +++ b/Libraries/LibWeb/WebIDL/Buffers.cpp @@ -90,6 +90,26 @@ u32 ArrayBufferView::byte_offset() const [](auto& view) -> u32 { return static_cast(view->byte_offset()); }); } +// https://webidl.spec.whatwg.org/#arraybufferview-write +void ArrayBufferView::write(ReadonlyBytes bytes, u32 starting_offset) +{ + // 1. Let jsView be the result of converting view to a JavaScript value. + // 2. Assert: bytes’s length ≤ jsView.[[ByteLength]] − startingOffset. + VERIFY(bytes.size() <= byte_length() - starting_offset); + + // 3. Assert: if view is not a DataView, then bytes’s length modulo the element size of view’s type is 0. + if (!m_bufferable_object.has>()) { + auto element_size = m_bufferable_object.get>()->element_size(); + VERIFY(bytes.size() % element_size == 0); + } + + // 4. Let arrayBuffer be the result of converting jsView.[[ViewedArrayBuffer]] to an IDL value of type ArrayBuffer. + auto array_buffer = viewed_array_buffer(); + + // 5. Write bytes into arrayBuffer with startingOffset set to jsView.[[ByteOffset]] + startingOffset. + array_buffer->buffer().overwrite(byte_offset() + starting_offset, bytes.data(), bytes.size()); +} + BufferSource::~BufferSource() = default; } diff --git a/Libraries/LibWeb/WebIDL/Buffers.h b/Libraries/LibWeb/WebIDL/Buffers.h index 2381e286205..10df7ea44f1 100644 --- a/Libraries/LibWeb/WebIDL/Buffers.h +++ b/Libraries/LibWeb/WebIDL/Buffers.h @@ -69,6 +69,7 @@ public: using BufferableObjectBase::is_typed_array_base; u32 byte_offset() const; + void write(ReadonlyBytes, u32 starting_offset = 0); }; // https://webidl.spec.whatwg.org/#BufferSource