imagebitmap: Make ImageBitmap serializable and transferable (#37101)

According to specification ImageBitmap objects are serializable objects
and transferable objects.

https://html.spec.whatwg.org/multipage/#the-imagebitmap-interface:imagebitmap-11

Testing:
 - html/canvas/element/manual/imagebitmap/*
 - html/infrastructure/safe-passing-of-structured-data/*
 - html/webappapis/structured-clone/*
 - workers/semantics/structured-clone/*

Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
This commit is contained in:
Andrei Volykhin 2025-05-23 23:40:25 +03:00 committed by GitHub
parent cd36c35cf2
commit 1f5087d773
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 215 additions and 103 deletions

View file

@ -11,7 +11,7 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::path::PathBuf;
use base::id::{BlobId, DomExceptionId, DomPointId};
use base::id::{BlobId, DomExceptionId, DomPointId, ImageBitmapId};
use malloc_size_of_derive::MallocSizeOf;
use net_traits::filemanager_thread::RelativePos;
use serde::{Deserialize, Serialize};
@ -47,6 +47,8 @@ pub enum Serializable {
DomPointReadOnly,
/// The `DOMException` interface.
DomException,
/// The `ImageBitmap` interface.
ImageBitmap,
}
impl Serializable {
@ -62,6 +64,9 @@ impl Serializable {
Serializable::DomException => {
StructuredSerializedData::clone_all_of_type::<DomException>
},
Serializable::ImageBitmap => {
StructuredSerializedData::clone_all_of_type::<SerializableImageBitmap>
},
}
}
}
@ -312,3 +317,31 @@ impl BroadcastClone for DomException {
Some(self.clone())
}
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
/// A serializable version of the ImageBitmap interface.
pub struct SerializableImageBitmap {
pub width: u32,
pub height: u32,
pub bitmap_data: Vec<u8>,
}
impl BroadcastClone for SerializableImageBitmap {
type Id = ImageBitmapId;
fn source(
data: &StructuredSerializedData,
) -> &Option<std::collections::HashMap<Self::Id, Self>> {
&data.image_bitmaps
}
fn destination(
data: &mut StructuredSerializedData,
) -> &mut Option<std::collections::HashMap<Self::Id, Self>> {
&mut data.image_bitmaps
}
fn clone_for_broadcast(&self) -> Option<Self> {
Some(self.clone())
}
}