diff options
author | Josh Matthews <josh@joshmatthews.net> | 2025-03-15 09:58:56 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-15 13:58:56 +0000 |
commit | d8fc1d8bb88d291233022f52550628e6fc0376a4 (patch) | |
tree | 3c99cae670682dbf5d7cf8cbffa151c8c55aef65 /components/script/dom/bindings/transferable.rs | |
parent | 21ecfdd088faa68ba470b15fff6eee61c05e6bba (diff) | |
download | servo-d8fc1d8bb88d291233022f52550628e6fc0376a4.tar.gz servo-d8fc1d8bb88d291233022f52550628e6fc0376a4.zip |
Refactor common boilerplate out of serialize/transfer implementations (#35831)
* script: Create infrastructure for reducing hand-written serializable/transferrable implementations.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Clone all serializable DOM interfaces.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Deserialize all serializable DOM interfaces.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Serialize all serializable DOM interfaces.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Transfer-receive all transferable DOM interfaces.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Transfer all transferable DOM interfaces.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Formatting.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Extract boilerplate from serialize/deserialize implementations.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Extract boilerplate from transfer-receive.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Extract boilerplate from transfer operation.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Tidy fixes.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Check transferability of all DOM interfaces.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Clippy fixes.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Clippy fixes.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Remove unnecessary duplicate crate.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Formatting.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Diffstat (limited to 'components/script/dom/bindings/transferable.rs')
-rw-r--r-- | components/script/dom/bindings/transferable.rs | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/components/script/dom/bindings/transferable.rs b/components/script/dom/bindings/transferable.rs index 674d652119b..7c052e41294 100644 --- a/components/script/dom/bindings/transferable.rs +++ b/components/script/dom/bindings/transferable.rs @@ -5,18 +5,45 @@ //! Trait representing the concept of [transferable objects] //! (<https://html.spec.whatwg.org/multipage/#transferable-objects>). -use js::jsapi::MutableHandleObject; +use std::collections::HashMap; +use std::num::NonZeroU32; + +use base::id::PipelineNamespaceId; use crate::dom::bindings::reflector::DomObject; -use crate::dom::bindings::structuredclone::{StructuredDataReader, StructuredDataWriter}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::structuredclone::{StructuredData, StructuredDataReader}; use crate::dom::globalscope::GlobalScope; -pub(crate) trait Transferable: DomObject { - fn transfer(&self, sc_writer: &mut StructuredDataWriter) -> Result<u64, ()>; +pub(crate) trait IdFromComponents +where + Self: Sized, +{ + fn from(namespace_id: PipelineNamespaceId, index: NonZeroU32) -> Self; +} + +pub(crate) trait ExtractComponents { + fn components(&self) -> (PipelineNamespaceId, NonZeroU32); +} + +pub(crate) trait Transferable: DomObject +where + Self: Sized, +{ + type Id: Eq + std::hash::Hash + Copy + IdFromComponents + ExtractComponents; + type Data; + + fn can_transfer(&self) -> bool { + true + } + + fn transfer(&self) -> Result<(Self::Id, Self::Data), ()>; fn transfer_receive( owner: &GlobalScope, - sc_reader: &mut StructuredDataReader, - extra_data: u64, - return_object: MutableHandleObject, - ) -> Result<(), ()>; + id: Self::Id, + serialized: Self::Data, + ) -> Result<DomRoot<Self>, ()>; + + fn serialized_storage(data: StructuredData<'_>) -> &mut Option<HashMap<Self::Id, Self::Data>>; + fn deserialized_storage(reader: &mut StructuredDataReader) -> &mut Option<Vec<DomRoot<Self>>>; } |