aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/global.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/global.rs')
-rw-r--r--components/script/dom/bindings/global.rs31
1 files changed, 29 insertions, 2 deletions
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs
index ac40de4370c..2a6252d4f1e 100644
--- a/components/script/dom/bindings/global.rs
+++ b/components/script/dom/bindings/global.rs
@@ -7,6 +7,7 @@
//! This module contains smart pointers to global scopes, to simplify writing
//! code that works in workers as well as window scopes.
+use dom::bindings::conversions::FromJSValConvertible;
use dom::bindings::js::{JS, JSRef, Root};
use dom::bindings::utils::{Reflectable, Reflector};
use dom::workerglobalscope::WorkerGlobalScope;
@@ -15,10 +16,15 @@ use script_task::ScriptChan;
use servo_net::resource_task::ResourceTask;
-use js::jsapi::JSContext;
-
+use js::{JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS};
+use js::glue::{GetGlobalForObjectCrossCompartment};
+use js::jsapi::{JSContext, JSObject};
+use js::jsapi::{JS_GetClass};
+use js::jsval::ObjectOrNullValue;
use url::Url;
+use std::ptr;
+
/// A freely-copyable reference to a rooted global object.
pub enum GlobalRef<'a> {
Window(JSRef<'a, Window>),
@@ -120,3 +126,24 @@ impl GlobalField {
}
}
}
+
+/// Returns the global object of the realm that the given JS object was created in.
+#[allow(unrooted_must_root)]
+pub fn global_object_for_js_object(obj: *mut JSObject) -> GlobalField {
+ unsafe {
+ let global = GetGlobalForObjectCrossCompartment(obj);
+ let clasp = JS_GetClass(global);
+ assert!(((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)) != 0);
+ match FromJSValConvertible::from_jsval(ptr::null_mut(), ObjectOrNullValue(global), ()) {
+ Ok(window) => return WindowField(window),
+ Err(_) => (),
+ }
+
+ match FromJSValConvertible::from_jsval(ptr::null_mut(), ObjectOrNullValue(global), ()) {
+ Ok(worker) => return WorkerField(worker),
+ Err(_) => (),
+ }
+
+ fail!("found DOM global that doesn't unwrap to Window or WorkerGlobalScope")
+ }
+}