From ed3d0d76ecb73bd0bb08f53c100905289062ae20 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Sat, 19 Jul 2025 08:07:15 +0200 Subject: [PATCH] LibWeb: Implement transfer {,receiving} steps for ImageBitmap --- Libraries/LibWeb/HTML/ImageBitmap.cpp | 25 ++++++++++++------- Libraries/LibWeb/HTML/StructuredSerialize.cpp | 5 ++++ .../LibWeb/HTML/StructuredSerializeTypes.h | 1 + 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Libraries/LibWeb/HTML/ImageBitmap.cpp b/Libraries/LibWeb/HTML/ImageBitmap.cpp index ed02e9ee54e..c60955ec523 100644 --- a/Libraries/LibWeb/HTML/ImageBitmap.cpp +++ b/Libraries/LibWeb/HTML/ImageBitmap.cpp @@ -82,25 +82,32 @@ WebIDL::ExceptionOr ImageBitmap::deserialization_steps(HTML::TransferDataD return {}; } -WebIDL::ExceptionOr ImageBitmap::transfer_steps(HTML::TransferDataEncoder&) +// https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#the-imagebitmap-interface:transfer-steps +WebIDL::ExceptionOr ImageBitmap::transfer_steps(HTML::TransferDataEncoder& data_holder) { - // FIXME: Implement this - dbgln("(STUBBED) ImageBitmap::transfer_steps(HTML::TransferDataEncoder&)"); + // FIXME: 1. If value's origin-clean flag is not set, then throw a "DataCloneError" DOMException. + + // 2. Set dataHolder.[[BitmapData]] to value's bitmap data. + serialize_bitmap(data_holder, *m_bitmap); + + // 3. Unset value's bitmap data. + m_bitmap = nullptr; + return {}; } -WebIDL::ExceptionOr ImageBitmap::transfer_receiving_steps(HTML::TransferDataDecoder&) +// https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#the-imagebitmap-interface:transfer-receiving-steps +WebIDL::ExceptionOr ImageBitmap::transfer_receiving_steps(HTML::TransferDataDecoder& data_holder) { - // FIXME: Implement this - dbgln("(STUBBED) ImageBitmap::transfer_receiving_steps(HTML::TransferDataDecoder&)"); + // 1. Set value's bitmap data to dataHolder.[[BitmapData]]. + m_bitmap = TRY(deserialize_bitmap(this->realm(), data_holder)); + return {}; } HTML::TransferType ImageBitmap::primary_interface() const { - // FIXME: Implement this - dbgln("(STUBBED) ImageBitmap::primary_interface()"); - return TransferType::Unknown; + return TransferType::ImageBitmap; } // https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-imagebitmap-width diff --git a/Libraries/LibWeb/HTML/StructuredSerialize.cpp b/Libraries/LibWeb/HTML/StructuredSerialize.cpp index 647ee274be2..c8ecae97c15 100644 --- a/Libraries/LibWeb/HTML/StructuredSerialize.cpp +++ b/Libraries/LibWeb/HTML/StructuredSerialize.cpp @@ -1147,6 +1147,11 @@ static WebIDL::ExceptionOr> create_transferred TRY(transform_stream->transfer_receiving_steps(decoder)); return transform_stream; } + case TransferType::ImageBitmap: { + auto image_bitmap = target_realm.create(target_realm); + TRY(image_bitmap->transfer_receiving_steps(decoder)); + return image_bitmap; + } case TransferType::ArrayBuffer: case TransferType::ResizableArrayBuffer: case TransferType::Unknown: diff --git a/Libraries/LibWeb/HTML/StructuredSerializeTypes.h b/Libraries/LibWeb/HTML/StructuredSerializeTypes.h index 6f1a52cad41..a926ceac4d1 100644 --- a/Libraries/LibWeb/HTML/StructuredSerializeTypes.h +++ b/Libraries/LibWeb/HTML/StructuredSerializeTypes.h @@ -44,6 +44,7 @@ enum class TransferType : u8 { ReadableStream = 4, WritableStream = 5, TransformStream = 6, + ImageBitmap = 7, }; }