aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/reflector.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/reflector.rs')
-rw-r--r--components/script/dom/bindings/reflector.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs
new file mode 100644
index 00000000000..3279f4de55e
--- /dev/null
+++ b/components/script/dom/bindings/reflector.rs
@@ -0,0 +1,79 @@
+/* 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/. */
+
+//! The `Reflector` struct.
+
+use dom::bindings::global::GlobalRef;
+use dom::bindings::js::Root;
+use js::jsapi::{HandleObject, JSContext, JSObject};
+use std::cell::UnsafeCell;
+use std::ptr;
+
+/// Create the reflector for a new DOM object and yield ownership to the
+/// reflector.
+pub fn reflect_dom_object<T: Reflectable>
+ (obj: Box<T>,
+ global: GlobalRef,
+ wrap_fn: extern "Rust" fn(*mut JSContext, GlobalRef, Box<T>) -> Root<T>)
+ -> Root<T> {
+ wrap_fn(global.get_cx(), global, obj)
+}
+
+/// A struct to store a reference to the reflector of a DOM object.
+#[allow(raw_pointer_derive, unrooted_must_root)]
+#[must_root]
+#[servo_lang = "reflector"]
+#[derive(HeapSizeOf)]
+// If you're renaming or moving this field, update the path in plugins::reflector as well
+pub struct Reflector {
+ #[ignore_heap_size_of = "defined and measured in rust-mozjs"]
+ object: UnsafeCell<*mut JSObject>,
+}
+
+#[allow(unrooted_must_root)]
+impl PartialEq for Reflector {
+ fn eq(&self, other: &Reflector) -> bool {
+ unsafe { *self.object.get() == *other.object.get() }
+ }
+}
+
+impl Reflector {
+ /// Get the reflector.
+ #[inline]
+ pub fn get_jsobject(&self) -> HandleObject {
+ unsafe { HandleObject::from_marked_location(self.object.get()) }
+ }
+
+ /// Initialize the reflector. (May be called only once.)
+ pub fn set_jsobject(&mut self, object: *mut JSObject) {
+ unsafe {
+ let obj = self.object.get();
+ assert!((*obj).is_null());
+ assert!(!object.is_null());
+ *obj = object;
+ }
+ }
+
+ /// Return a pointer to the memory location at which the JS reflector
+ /// object is stored. Used to root the reflector, as
+ /// required by the JSAPI rooting APIs.
+ pub fn rootable(&self) -> *mut *mut JSObject {
+ self.object.get()
+ }
+
+ /// Create an uninitialized `Reflector`.
+ pub fn new() -> Reflector {
+ Reflector {
+ object: UnsafeCell::new(ptr::null_mut())
+ }
+ }
+}
+
+/// A trait to provide access to the `Reflector` for a DOM object.
+pub trait Reflectable {
+ /// Returns the receiver's reflector.
+ fn reflector(&self) -> &Reflector;
+ /// Initializes the Reflector
+ fn init_reflector(&mut self, obj: *mut JSObject);
+} \ No newline at end of file