| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| //! Trait representing the concept of [transferable objects] |
| //! (<https://html.spec.whatwg.org/multipage/#transferable-objects>). |
| |
| use std::collections::HashMap; |
| use std::hash::Hash; |
| |
| use base::id::NamespaceIndex; |
| use script_bindings::structuredclone::MarkedAsTransferableInIdl; |
| |
| use crate::dom::bindings::error::Fallible; |
| use crate::dom::bindings::reflector::DomObject; |
| use crate::dom::bindings::root::DomRoot; |
| use crate::dom::bindings::structuredclone::StructuredData; |
| use crate::dom::globalscope::GlobalScope; |
| |
| pub(crate) trait Transferable: DomObject + MarkedAsTransferableInIdl |
| where |
| Self: Sized, |
| { |
| type Index: Copy + Eq + Hash; |
| type Data; |
| |
| fn can_transfer(&self) -> bool { |
| true |
| } |
| |
| /// <https://html.spec.whatwg.org/multipage/#transfer-steps> |
| fn transfer(&self) -> Fallible<(NamespaceIndex<Self::Index>, Self::Data)>; |
| |
| /// <https://html.spec.whatwg.org/multipage/#transfer-receiving-steps> |
| fn transfer_receive( |
| owner: &GlobalScope, |
| id: NamespaceIndex<Self::Index>, |
| serialized: Self::Data, |
| ) -> Result<DomRoot<Self>, ()>; |
| |
| fn serialized_storage<'a>( |
| data: StructuredData<'a, '_>, |
| ) -> &'a mut Option<HashMap<NamespaceIndex<Self::Index>, Self::Data>>; |
| } |
| |
| pub(crate) fn assert_transferable<T: Transferable>() {} |