diff --git a/Libraries/LibWeb/HTML/ImageBitmap.cpp b/Libraries/LibWeb/HTML/ImageBitmap.cpp index 8c2043b7d36..9f809ae4e2c 100644 --- a/Libraries/LibWeb/HTML/ImageBitmap.cpp +++ b/Libraries/LibWeb/HTML/ImageBitmap.cpp @@ -20,19 +20,26 @@ GC_DEFINE_ALLOCATOR(ImageBitmap); return Gfx::Bitmap::create_wrapper(format, alpha_type, Gfx::IntSize(width, height), pitch, data.data()); } -static void serialize_bitmap(HTML::TransferDataEncoder& encoder, Gfx::Bitmap& bitmap) +static void serialize_bitmap(HTML::TransferDataEncoder& encoder, RefPtr const& bitmap) { - encoder.encode(bitmap.width()); - encoder.encode(bitmap.height()); - encoder.encode(bitmap.pitch()); - encoder.encode(bitmap.format()); - encoder.encode(bitmap.alpha_type()); - encoder.encode(ReadonlyBytes { bitmap.scanline_u8(0), bitmap.data_size() }); + if (!bitmap) { + encoder.encode(0); + return; + } + + encoder.encode(bitmap->width()); + encoder.encode(bitmap->height()); + encoder.encode(bitmap->pitch()); + encoder.encode(bitmap->format()); + encoder.encode(bitmap->alpha_type()); + encoder.encode(ReadonlyBytes { bitmap->scanline_u8(0), bitmap->data_size() }); } -[[nodiscard]] static WebIDL::ExceptionOr> deserialize_bitmap(JS::Realm& realm, HTML::TransferDataDecoder& decoder) +[[nodiscard]] static WebIDL::ExceptionOr> deserialize_bitmap(JS::Realm& realm, HTML::TransferDataDecoder& decoder) { auto const width = decoder.decode(); + if (width == 0) + return nullptr; auto const height = decoder.decode(); auto const pitch = decoder.decode(); auto const format = decoder.decode(); @@ -68,7 +75,7 @@ WebIDL::ExceptionOr ImageBitmap::serialization_steps(HTML::TransferDataEnc // FIXME: 1. If value's origin-clean flag is not set, then throw a "DataCloneError" DOMException. // 2. Set serialized.[[BitmapData]] to a copy of value's bitmap data. - serialize_bitmap(serialized, *m_bitmap); + serialize_bitmap(serialized, m_bitmap); return {}; } @@ -88,7 +95,7 @@ WebIDL::ExceptionOr 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); + serialize_bitmap(data_holder, m_bitmap); // 3. Unset value's bitmap data. m_bitmap = nullptr; diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/manual/imagebitmap/canvas-ImageBitmap-close.txt b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/manual/imagebitmap/canvas-ImageBitmap-close.txt new file mode 100644 index 00000000000..84011829c03 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/html/canvas/element/manual/imagebitmap/canvas-ImageBitmap-close.txt @@ -0,0 +1,6 @@ +Harness status: OK + +Found 1 tests + +1 Pass +Pass canvas-ImageBitmap-close \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/manual/imagebitmap/canvas-ImageBitmap-close.html b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/manual/imagebitmap/canvas-ImageBitmap-close.html new file mode 100644 index 00000000000..41b6eb84b7b --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/manual/imagebitmap/canvas-ImageBitmap-close.html @@ -0,0 +1,89 @@ + + +

Tests that the close method of ImageBitmap does dispose the image data.

+ + + + diff --git a/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/manual/imagebitmap/worker-onmessage-noop.js b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/manual/imagebitmap/worker-onmessage-noop.js new file mode 100644 index 00000000000..c0a352b4d9e --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/html/canvas/element/manual/imagebitmap/worker-onmessage-noop.js @@ -0,0 +1,3 @@ +self.onmessage = function(e) { +}; +