diff options
Diffstat (limited to 'components/script/dom/bindings/global.rs')
-rw-r--r-- | components/script/dom/bindings/global.rs | 31 |
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") + } +} |