diff options
author | rohan.prinja <rohan.prinja@samsung.com> | 2015-10-27 14:56:41 +0900 |
---|---|---|
committer | rohan.prinja <rohan.prinja@samsung.com> | 2015-10-30 20:24:42 +0900 |
commit | bb2536cd014676263f5bfd5d98cf0fc69d2abee0 (patch) | |
tree | 0381f75788884d593358a7f4ea20c293999d3bee /components/script/dom/bindings/inheritance.rs | |
parent | 00b60b93860d32e1c5aaf0f9b4a2ce5110880652 (diff) | |
download | servo-bb2536cd014676263f5bfd5d98cf0fc69d2abee0.tar.gz servo-bb2536cd014676263f5bfd5d98cf0fc69d2abee0.zip |
move Castable into dom::bindings::inheritance
Diffstat (limited to 'components/script/dom/bindings/inheritance.rs')
-rw-r--r-- | components/script/dom/bindings/inheritance.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/components/script/dom/bindings/inheritance.rs b/components/script/dom/bindings/inheritance.rs new file mode 100644 index 00000000000..5878c44c5f3 --- /dev/null +++ b/components/script/dom/bindings/inheritance.rs @@ -0,0 +1,34 @@ +/* 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/. */ + +use dom::bindings::conversions::get_dom_class; +use dom::bindings::conversions::{DerivedFrom, IDLInterface}; +use dom::bindings::utils::Reflectable; +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 + Reflectable + Sized { + /// Check whether a DOM object implements one of its deriving interfaces. + fn is<T>(&self) -> bool where T: DerivedFrom<Self> { + 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<T>(&self) -> &T where T: Castable, Self: DerivedFrom<T> { + unsafe { mem::transmute(self) } + } + + /// Cast a DOM object downwards to one of the interfaces it might implement. + fn downcast<T>(&self) -> Option<&T> where T: DerivedFrom<Self> { + if self.is::<T>() { + Some(unsafe { mem::transmute(self) }) + } else { + None + } + } +} |