From c8bd9615f43f7e33dcdd8056c9044fba7c4da2be Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 10:46:49 +0100 Subject: [PATCH] When calling constructors, retrieve the global object from the callee rather than the JSContext. --- .../script/dom/bindings/codegen/CodegenRust.py | 9 ++------- src/components/script/dom/bindings/utils.rs | 6 +++--- src/support/spidermonkey/rust-mozjs | 2 +- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 7492723eca4..cb37bec5a8b 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -4805,13 +4805,8 @@ class CGClassConstructHook(CGAbstractExternMethod): def generate_code(self): preamble = """ - //JSObject* obj = JS_GetGlobalForObject(cx, JSVAL_TO_OBJECT(JS_CALLEE(cx, vp))); - //XXXjdm Gecko obtains a GlobalObject from the global (maybe from the private value, - // or through unwrapping a slot or something). We'll punt and get the Window - // from the context for now. - let page = page_from_context(cx); - let frame = (*page).frame(); - let global = frame.get().get_ref().window.clone(); + let window = global_object_for_js_object(RUST_JSVAL_TO_OBJECT(JS_CALLEE(cx, &*vp))); + let global = JS::from_box(window); let obj = global.reflector().get_jsobject(); """ nativeName = MakeNativeName(self._ctor.identifier.name) diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 22f10b65c47..adfcc3986c5 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -720,13 +720,13 @@ pub fn CreateDOMGlobal(cx: *JSContext, class: *JSClass) -> *JSObject { } /// Returns the global object of the realm that the given JS object was created in. -fn global_object_for_js_object(obj: *JSObject) -> *Box { +pub fn global_object_for_js_object(obj: *JSObject) -> *mut Box { unsafe { let global = GetGlobalForObjectCrossCompartment(obj); let clasp = JS_GetClass(global); assert!(((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)) != 0); // FIXME(jdm): Either don't hardcode or sanity assert prototype stuff. - match unwrap_object::<*Box>(global, PrototypeList::id::Window, 1) { + match unwrap_object::<*mut Box>(global, PrototypeList::id::Window, 1) { Ok(win) => win, Err(_) => fail!("found DOM global that doesn't unwrap to Window"), } @@ -745,7 +745,7 @@ fn cx_for_dom_reflector(obj: *JSObject) -> *JSContext { } /// Returns the global object of the realm that the given DOM object was created in. -pub fn global_object_for_dom_object(obj: &T) -> *Box { +pub fn global_object_for_dom_object(obj: &T) -> *mut Box { global_object_for_js_object(obj.reflector().get_jsobject()) } diff --git a/src/support/spidermonkey/rust-mozjs b/src/support/spidermonkey/rust-mozjs index b04df09b61a..1730e6bf24f 160000 --- a/src/support/spidermonkey/rust-mozjs +++ b/src/support/spidermonkey/rust-mozjs @@ -1 +1 @@ -Subproject commit b04df09b61a68ed47e4829045804173fc849f370 +Subproject commit 1730e6bf24fdacb958061b8ee80d5289f7a7b496