/* 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 https://mozilla.org/MPL/2.0/. */ //! The `Castable` trait. pub use crate::dom::bindings::codegen::InheritTypes::*; use crate::dom::bindings::conversions::get_dom_class; use crate::dom::bindings::conversions::{DerivedFrom, IDLInterface}; use crate::dom::bindings::reflector::DomObject; use std::mem; /// A trait to hold the cast functions of IDL interfaces that either derive /// or are derived from other interfaces. pub trait Castable: IDLInterface + DomObject + Sized { /// Check whether a DOM object implements one of its deriving interfaces. fn is(&self) -> bool where T: DerivedFrom, { let class = unsafe { get_dom_class(self.reflector().get_jsobject().get()).unwrap() }; T::derives(class) } /// Cast a DOM object upwards to one of the interfaces it derives from. fn upcast(&self) -> &T where T: Castable, Self: DerivedFrom, { unsafe { mem::transmute(self) } } /// Cast a DOM object downwards to one of the interfaces it might implement. fn downcast(&self) -> Option<&T> where T: DerivedFrom, { if self.is::() { Some(unsafe { mem::transmute(self) }) } else { None } } } pub trait HasParent { type Parent; fn as_parent(&self) -> &Self::Parent; }