use std::hash::Hash;
use rustc_hash::FxHashMap;
use script_bindings::structuredclone::MarkedAsTransferableInIdl;
use servo_base::id::NamespaceIndex;
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
}
fn transfer(
&self,
cx: &mut js::context::JSContext,
) -> Fallible<(NamespaceIndex<Self::Index>, Self::Data)>;
fn transfer_receive(
cx: &mut js::context::JSContext,
owner: &GlobalScope,
id: NamespaceIndex<Self::Index>,
serialized: Self::Data,
) -> Result<DomRoot<Self>, ()>;
fn serialized_storage<'a>(
data: StructuredData<'a, '_>,
) -> &'a mut Option<FxHashMap<NamespaceIndex<Self::Index>, Self::Data>>;
}
pub(crate) fn assert_transferable<T: Transferable>() {}