From 5a9f602fef60a508f863234a9b34d9e4cf8cd14a Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Sun, 1 Dec 2024 21:36:06 +0100 Subject: [PATCH] LibWeb: Add AO CanCopyDataBlockBytes() --- .../LibWeb/Streams/AbstractOperations.cpp | 32 +++++++++++++++++++ Libraries/LibWeb/Streams/AbstractOperations.h | 1 + 2 files changed, 33 insertions(+) diff --git a/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Libraries/LibWeb/Streams/AbstractOperations.cpp index ec85e46ce19..845317472dc 100644 --- a/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -5353,6 +5353,38 @@ bool is_non_negative_number(JS::Value value) return true; } +// https://streams.spec.whatwg.org/#abstract-opdef-cancopydatablockbytes +bool can_copy_data_block_bytes_buffer(JS::ArrayBuffer const& to_buffer, u64 to_index, JS::ArrayBuffer const& from_buffer, u64 from_index, u64 count) +{ + // 1. Assert: toBuffer is an Object. + // 2. Assert: toBuffer has an [[ArrayBufferData]] internal slot. + // 3. Assert: fromBuffer is an Object. + // 4. Assert: fromBuffer has an [[ArrayBufferData]] internal slot. + + // 5. If toBuffer is fromBuffer, return false. + if (&to_buffer == &from_buffer) + return false; + + // 6. If ! IsDetachedBuffer(toBuffer) is true, return false. + if (to_buffer.is_detached()) + return false; + + // 7. If ! IsDetachedBuffer(fromBuffer) is true, return false. + if (from_buffer.is_detached()) + return false; + + // 8. If toIndex + count > toBuffer.[[ArrayBufferByteLength]], return false. + if (to_index + count > to_buffer.byte_length()) + return false; + + // 9. If fromIndex + count > fromBuffer.[[ArrayBufferByteLength]], return false. + if (from_index + count > from_buffer.byte_length()) + return false; + + // 10. Return true. + return true; +} + // https://streams.spec.whatwg.org/#can-transfer-array-buffer bool can_transfer_array_buffer(JS::ArrayBuffer const& array_buffer) { diff --git a/Libraries/LibWeb/Streams/AbstractOperations.h b/Libraries/LibWeb/Streams/AbstractOperations.h index ce31666f07c..156080e0183 100644 --- a/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Libraries/LibWeb/Streams/AbstractOperations.h @@ -188,6 +188,7 @@ void transform_stream_set_up(TransformStream&, GC::Ref, GC:: void transform_stream_unblock_write(TransformStream&); bool is_non_negative_number(JS::Value); +bool can_copy_data_block_bytes_buffer(JS::ArrayBuffer const& to_buffer, u64 to_index, JS::ArrayBuffer const& from_buffer, u64 from_index, u64 count); bool can_transfer_array_buffer(JS::ArrayBuffer const& array_buffer); WebIDL::ExceptionOr clone_as_uint8_array(JS::Realm&, WebIDL::ArrayBufferView&); WebIDL::ExceptionOr structured_clone(JS::Realm&, JS::Value value);