From 12380edc63fa69c1ab2c84677a73d9cea9ceac50 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 13:17:36 +0100 Subject: [PATCH 1/6] Merge the Wrap and Wrap_ functions in codegen. --- .../script/dom/bindings/codegen/CodegenRust.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 7492723eca4..8ac195ef5e1 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2596,12 +2596,12 @@ def CreateBindingJSObject(descriptor, parent=None): """ return create -class CGWrapWithCacheMethod(CGAbstractMethod): +class CGWrapMethod(CGAbstractMethod): def __init__(self, descriptor): assert descriptor.interface.hasInterfacePrototypeObject() args = [Argument('*JSContext', 'aCx'), Argument('*JSObject', 'aScope'), Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] - CGAbstractMethod.__init__(self, descriptor, 'Wrap_', '*JSObject', args) + CGAbstractMethod.__init__(self, descriptor, 'Wrap', '*JSObject', args, pub=True) def definition_body(self): if not self.descriptor.createGlobal: @@ -2630,17 +2630,6 @@ class CGWrapWithCacheMethod(CGAbstractMethod): (*raw).mut_reflector().set_jsobject(obj); return obj;""" % CreateBindingJSObject(self.descriptor) -class CGWrapMethod(CGAbstractMethod): - def __init__(self, descriptor): - # XXX can we wrap if we don't have an interface prototype object? - assert descriptor.interface.hasInterfacePrototypeObject() - args = [Argument('*JSContext', 'aCx'), Argument('*JSObject', 'aScope'), - Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] - CGAbstractMethod.__init__(self, descriptor, 'Wrap', '*JSObject', args, inline=True, pub=True) - - def definition_body(self): - return "return Wrap_(aCx, aScope, aObject);" - class CGAbstractExternMethod(CGAbstractMethod): """ Abstract base class for codegen of implementation-only (no @@ -4937,7 +4926,6 @@ class CGDescriptor(CGThing): cgThings.append(CGDOMJSClass(descriptor)) pass - cgThings.append(CGWrapWithCacheMethod(descriptor)) cgThings.append(CGWrapMethod(descriptor)) cgThings = CGList((CGIndenter(t, declareOnly=True) for t in cgThings), "\n") From b6138580d3d44fe1c34dd863faa38bf1fe4665d9 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 13:24:16 +0100 Subject: [PATCH 2/6] Stop passing the scope argument to global object bindings' Wrap functions. --- .../script/dom/bindings/codegen/CodegenRust.py | 10 ++++++---- src/components/script/dom/window.rs | 3 +-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 8ac195ef5e1..71c46b09119 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2599,8 +2599,12 @@ def CreateBindingJSObject(descriptor, parent=None): class CGWrapMethod(CGAbstractMethod): def __init__(self, descriptor): assert descriptor.interface.hasInterfacePrototypeObject() - args = [Argument('*JSContext', 'aCx'), Argument('*JSObject', 'aScope'), - Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] + if not descriptor.createGlobal: + args = [Argument('*JSContext', 'aCx'), Argument('*JSObject', 'aScope'), + Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] + else: + args = [Argument('*JSContext', 'aCx'), + Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] CGAbstractMethod.__init__(self, descriptor, 'Wrap', '*JSObject', args, pub=True) def definition_body(self): @@ -2622,8 +2626,6 @@ class CGWrapMethod(CGAbstractMethod): return obj;""" % CreateBindingJSObject(self.descriptor, "aScope") else: return """ - assert!(aScope.is_null()); - %s let proto = GetProtoObject(aCx, obj, obj); JS_SetPrototype(aCx, obj, proto); diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 68a9e3364b9..884e691fab7 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -29,7 +29,6 @@ use std::comm::Select; use std::hashmap::HashSet; use std::io::timer::Timer; use std::num; -use std::ptr; use std::rc::Rc; use std::to_bytes::Cb; @@ -311,7 +310,7 @@ impl Window { }; let raw: *mut Window = &mut *win; - let global = WindowBinding::Wrap(cx, ptr::null(), win); + let global = WindowBinding::Wrap(cx, win); assert!(global.is_not_null()); unsafe { let fn_names = ["window","self"]; From 6291aac1701430ec9c55ff852bbdd653a8a9acb4 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 14:10:33 +0100 Subject: [PATCH 3/6] Pass &JS to some constructors. --- src/components/script/dom/attr.rs | 8 ++++---- .../script/dom/bindings/codegen/Bindings.conf | 5 +++++ src/components/script/dom/console.rs | 4 ++-- src/components/script/dom/domexception.rs | 4 ++-- src/components/script/dom/element.rs | 2 +- src/components/script/dom/location.rs | 4 ++-- src/components/script/dom/navigator.rs | 4 ++-- src/components/script/dom/nodelist.rs | 6 +++--- src/components/script/dom/window.rs | 12 ++++++------ src/components/script/dom/windowproxy.rs | 2 +- src/components/script/script_task.rs | 2 +- 11 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index 906e1b7f02c..f632d047670 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -43,22 +43,22 @@ impl Attr { } } - pub fn new(window: &Window, local_name: DOMString, value: DOMString) -> JS { + pub fn new(window: &JS, local_name: DOMString, value: DOMString) -> JS { let name = local_name.clone(); Attr::new_helper(window, local_name, value, name, Null, None) } - pub fn new_ns(window: &Window, local_name: DOMString, value: DOMString, + pub fn new_ns(window: &JS, local_name: DOMString, value: DOMString, name: DOMString, namespace: Namespace, prefix: Option) -> JS { Attr::new_helper(window, local_name, value, name, namespace, prefix) } - fn new_helper(window: &Window, local_name: DOMString, value: DOMString, + fn new_helper(window: &JS, local_name: DOMString, value: DOMString, name: DOMString, namespace: Namespace, prefix: Option) -> JS { let attr = Attr::new_inherited(local_name, value, name, namespace, prefix); - reflect_dom_object(~attr, window, AttrBinding::Wrap) + reflect_dom_object(~attr, window.get(), AttrBinding::Wrap) } pub fn set_value(&mut self, value: DOMString) { diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index aabb3511bee..f6028bdd536 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -85,6 +85,11 @@ DOMInterfaces = { 'ValidityState': {}, 'Window': { 'createGlobal': True, + 'needsAbstract': [ + 'console', + 'location', + 'navigator', + ], }, 'WindowProxy': {}, diff --git a/src/components/script/dom/console.rs b/src/components/script/dom/console.rs index 3c5a219b39c..e41a747e054 100644 --- a/src/components/script/dom/console.rs +++ b/src/components/script/dom/console.rs @@ -20,8 +20,8 @@ impl Console { } } - pub fn new(window: &Window) -> JS { - reflect_dom_object(~Console::new_inherited(), window, ConsoleBinding::Wrap) + pub fn new(window: &JS) -> JS { + reflect_dom_object(~Console::new_inherited(), window.get(), ConsoleBinding::Wrap) } pub fn Log(&self, message: DOMString) { diff --git a/src/components/script/dom/domexception.rs b/src/components/script/dom/domexception.rs index f6eb1751adc..f5da5021e53 100644 --- a/src/components/script/dom/domexception.rs +++ b/src/components/script/dom/domexception.rs @@ -48,8 +48,8 @@ impl DOMException { } } - pub fn new(window: &Window, code: DOMErrorName) -> JS { - reflect_dom_object(~DOMException::new_inherited(code), window, DOMExceptionBinding::Wrap) + pub fn new(window: &JS, code: DOMErrorName) -> JS { + reflect_dom_object(~DOMException::new_inherited(code), window.get(), DOMExceptionBinding::Wrap) } } diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 2805ea8c25e..4ff7872aa80 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -220,7 +220,7 @@ impl Element { None => { let doc = self.node.owner_doc(); let doc = doc.get(); - let new_attr = Attr::new_ns(doc.window.get(), local_name.clone(), value.clone(), + let new_attr = Attr::new_ns(&doc.window, local_name.clone(), value.clone(), name.clone(), namespace.clone(), prefix); self.attrs.push(new_attr); diff --git a/src/components/script/dom/location.rs b/src/components/script/dom/location.rs index 7d0c5294711..641e0a1eb74 100644 --- a/src/components/script/dom/location.rs +++ b/src/components/script/dom/location.rs @@ -41,9 +41,9 @@ impl Location { } } - pub fn new(window: &Window, page: Rc) -> JS { + pub fn new(window: &JS, page: Rc) -> JS { reflect_dom_object(~Location::new_inherited(page), - window, + window.get(), LocationBinding::Wrap) } diff --git a/src/components/script/dom/navigator.rs b/src/components/script/dom/navigator.rs index e3c648ec4ed..245312d1840 100644 --- a/src/components/script/dom/navigator.rs +++ b/src/components/script/dom/navigator.rs @@ -21,9 +21,9 @@ impl Navigator { } } - pub fn new(window: &Window) -> JS { + pub fn new(window: &JS) -> JS { reflect_dom_object(~Navigator::new_inherited(), - window, + window.get(), NavigatorBinding::Wrap) } diff --git a/src/components/script/dom/nodelist.rs b/src/components/script/dom/nodelist.rs index 84de1a56d19..9274e4faed5 100644 --- a/src/components/script/dom/nodelist.rs +++ b/src/components/script/dom/nodelist.rs @@ -31,18 +31,18 @@ impl NodeList { } } - pub fn new(window: JS, + pub fn new(window: &JS, list_type: NodeListType) -> JS { reflect_dom_object(~NodeList::new_inherited(window.clone(), list_type), window.get(), NodeListBinding::Wrap) } pub fn new_simple_list(window: &JS, elements: ~[JS]) -> JS { - NodeList::new(window.clone(), Simple(elements)) + NodeList::new(window, Simple(elements)) } pub fn new_child_list(window: &JS, node: &JS) -> JS { - NodeList::new(window.clone(), Children(node.clone())) + NodeList::new(window, Children(node.clone())) } pub fn Length(&self) -> u32 { diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 884e691fab7..a3c6c7f866e 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -175,23 +175,23 @@ impl Window { None } - pub fn Location(&mut self) -> JS { + pub fn Location(&mut self, abstract_self: &JS) -> JS { if self.location.is_none() { - self.location = Some(Location::new(self, self.extra.page.clone())); + self.location = Some(Location::new(abstract_self, self.extra.page.clone())); } self.location.get_ref().clone() } - pub fn Console(&mut self) -> JS { + pub fn Console(&mut self, abstract_self: &JS) -> JS { if self.console.is_none() { - self.console = Some(Console::new(self)); + self.console = Some(Console::new(abstract_self)); } self.console.get_ref().clone() } - pub fn Navigator(&mut self) -> JS { + pub fn Navigator(&mut self, abstract_self: &JS) -> JS { if self.navigator.is_none() { - self.navigator = Some(Navigator::new(self)); + self.navigator = Some(Navigator::new(abstract_self)); } self.navigator.get_ref().clone() } diff --git a/src/components/script/dom/windowproxy.rs b/src/components/script/dom/windowproxy.rs index 35304d25d3c..94164fb82ac 100644 --- a/src/components/script/dom/windowproxy.rs +++ b/src/components/script/dom/windowproxy.rs @@ -13,7 +13,7 @@ pub struct WindowProxy { } impl WindowProxy { - pub fn new(owner: JS) -> JS { + pub fn new(owner: &JS) -> JS { let proxy = ~WindowProxy { reflector_: Reflector::new() }; diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index d6f17e4801c..5bc064c77cf 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -984,7 +984,7 @@ impl ScriptTask { Some(ref frame) => { // http://dev.w3.org/csswg/cssom-view/#resizing-viewports // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-type-resize - let window_proxy: JS = WindowProxy::new(frame.window.clone()); + let window_proxy: JS = WindowProxy::new(&frame.window); let mut uievent = UIEvent::new(&frame.window); uievent.get_mut().InitUIEvent(~"resize", false, false, Some(window_proxy), 0i32); let event: &mut JS = &mut EventCast::from(&uievent); From 23b7277b5465d8dbf9cdf94f672688e7af9b89ab Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 14:13:58 +0100 Subject: [PATCH 4/6] Pass &JS to reflect_dom_object. --- src/components/script/dom/attr.rs | 2 +- src/components/script/dom/attrlist.rs | 2 +- src/components/script/dom/bindings/js.rs | 8 ++++---- src/components/script/dom/bindings/utils.rs | 2 +- src/components/script/dom/blob.rs | 2 +- src/components/script/dom/clientrect.rs | 2 +- src/components/script/dom/clientrectlist.rs | 2 +- src/components/script/dom/console.rs | 2 +- src/components/script/dom/document.rs | 2 +- src/components/script/dom/domexception.rs | 2 +- src/components/script/dom/domimplementation.rs | 2 +- src/components/script/dom/domparser.rs | 2 +- src/components/script/dom/event.rs | 2 +- src/components/script/dom/formdata.rs | 2 +- src/components/script/dom/htmlcollection.rs | 2 +- src/components/script/dom/location.rs | 2 +- src/components/script/dom/mouseevent.rs | 2 +- src/components/script/dom/navigator.rs | 2 +- src/components/script/dom/node.rs | 2 +- src/components/script/dom/nodelist.rs | 2 +- src/components/script/dom/uievent.rs | 2 +- src/components/script/dom/validitystate.rs | 2 +- src/components/script/dom/windowproxy.rs | 2 +- 23 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index f632d047670..8357665b63d 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -58,7 +58,7 @@ impl Attr { name: DOMString, namespace: Namespace, prefix: Option) -> JS { let attr = Attr::new_inherited(local_name, value, name, namespace, prefix); - reflect_dom_object(~attr, window.get(), AttrBinding::Wrap) + reflect_dom_object(~attr, window, AttrBinding::Wrap) } pub fn set_value(&mut self, value: DOMString) { diff --git a/src/components/script/dom/attrlist.rs b/src/components/script/dom/attrlist.rs index 100f057fe8f..b172e976705 100644 --- a/src/components/script/dom/attrlist.rs +++ b/src/components/script/dom/attrlist.rs @@ -27,7 +27,7 @@ impl AttrList { pub fn new(window: &JS, elem: &JS) -> JS { reflect_dom_object(~AttrList::new_inherited(window.clone(), elem.clone()), - window.get(), AttrListBinding::Wrap) + window, AttrListBinding::Wrap) } pub fn Length(&self) -> u32 { diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs index 4aaf3506ae8..29efaddd840 100644 --- a/src/components/script/dom/bindings/js.rs +++ b/src/components/script/dom/bindings/js.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::utils::{Reflector, Reflectable}; -use dom::window; +use dom::window::Window; use js::jsapi::{JSContext, JSObject}; use layout_interface::TrustedNodeAddress; @@ -31,10 +31,10 @@ impl Clone for JS { impl JS { pub fn new(mut obj: ~T, - window: &window::Window, + window: &JS, wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) -> JS { - let cx = window.get_cx(); - let scope = window.reflector().get_jsobject(); + let cx = window.get().get_cx(); + let scope = window.get().reflector().get_jsobject(); let raw: *mut T = &mut *obj; if wrap_fn(cx, scope, obj).is_null() { fail!("Could not eagerly wrap object"); diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 22f10b65c47..6f82d161811 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -493,7 +493,7 @@ pub trait Reflectable { pub fn reflect_dom_object (obj: ~T, - window: &window::Window, + window: &JS, wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) -> JS { JS::new(obj, window, wrap_fn) diff --git a/src/components/script/dom/blob.rs b/src/components/script/dom/blob.rs index 87034e5107e..f1c4f677cf3 100644 --- a/src/components/script/dom/blob.rs +++ b/src/components/script/dom/blob.rs @@ -25,7 +25,7 @@ impl Blob { pub fn new(window: &JS) -> JS { reflect_dom_object(~Blob::new_inherited(window.clone()), - window.get(), + window, BlobBinding::Wrap) } } diff --git a/src/components/script/dom/clientrect.rs b/src/components/script/dom/clientrect.rs index e4fd8716c26..2e68044c115 100644 --- a/src/components/script/dom/clientrect.rs +++ b/src/components/script/dom/clientrect.rs @@ -36,7 +36,7 @@ impl ClientRect { top: Au, bottom: Au, left: Au, right: Au) -> JS { let rect = ClientRect::new_inherited(window.clone(), top, bottom, left, right); - reflect_dom_object(~rect, window.get(), ClientRectBinding::Wrap) + reflect_dom_object(~rect, window, ClientRectBinding::Wrap) } diff --git a/src/components/script/dom/clientrectlist.rs b/src/components/script/dom/clientrectlist.rs index bae001379ae..3d8ade6031f 100644 --- a/src/components/script/dom/clientrectlist.rs +++ b/src/components/script/dom/clientrectlist.rs @@ -28,7 +28,7 @@ impl ClientRectList { pub fn new(window: &JS, rects: ~[JS]) -> JS { reflect_dom_object(~ClientRectList::new_inherited(window.clone(), rects), - window.get(), ClientRectListBinding::Wrap) + window, ClientRectListBinding::Wrap) } pub fn Length(&self) -> u32 { diff --git a/src/components/script/dom/console.rs b/src/components/script/dom/console.rs index e41a747e054..8a7a935e918 100644 --- a/src/components/script/dom/console.rs +++ b/src/components/script/dom/console.rs @@ -21,7 +21,7 @@ impl Console { } pub fn new(window: &JS) -> JS { - reflect_dom_object(~Console::new_inherited(), window.get(), ConsoleBinding::Wrap) + reflect_dom_object(~Console::new_inherited(), window, ConsoleBinding::Wrap) } pub fn Log(&self, message: DOMString) { diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 5994f653f18..f0bf35db84b 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -89,7 +89,7 @@ impl Document { wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~D) -> *JSObject) -> JS { assert!(document.reflector().get_jsobject().is_null()); - let raw_doc = reflect_dom_object(document, window.get(), wrap_fn); + let raw_doc = reflect_dom_object(document, window, wrap_fn); assert!(raw_doc.reflector().get_jsobject().is_not_null()); let document = DocumentCast::from(&raw_doc); diff --git a/src/components/script/dom/domexception.rs b/src/components/script/dom/domexception.rs index f5da5021e53..9d8142ac938 100644 --- a/src/components/script/dom/domexception.rs +++ b/src/components/script/dom/domexception.rs @@ -49,7 +49,7 @@ impl DOMException { } pub fn new(window: &JS, code: DOMErrorName) -> JS { - reflect_dom_object(~DOMException::new_inherited(code), window.get(), DOMExceptionBinding::Wrap) + reflect_dom_object(~DOMException::new_inherited(code), window, DOMExceptionBinding::Wrap) } } diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs index 47ba1026dec..5a11d0119d4 100644 --- a/src/components/script/dom/domimplementation.rs +++ b/src/components/script/dom/domimplementation.rs @@ -34,7 +34,7 @@ impl DOMImplementation { } pub fn new(owner: &JS) -> JS { - reflect_dom_object(~DOMImplementation::new_inherited(owner.clone()), owner.get(), + reflect_dom_object(~DOMImplementation::new_inherited(owner.clone()), owner, DOMImplementationBinding::Wrap) } } diff --git a/src/components/script/dom/domparser.rs b/src/components/script/dom/domparser.rs index 3e20ea2941a..1ab00d1f14d 100644 --- a/src/components/script/dom/domparser.rs +++ b/src/components/script/dom/domparser.rs @@ -26,7 +26,7 @@ impl DOMParser { } pub fn new(owner: &JS) -> JS { - reflect_dom_object(~DOMParser::new_inherited(owner.clone()), owner.get(), + reflect_dom_object(~DOMParser::new_inherited(owner.clone()), owner, DOMParserBinding::Wrap) } diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index 4c3fb0e5b5b..6b612b4a220 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -77,7 +77,7 @@ impl Event { pub fn new(window: &JS) -> JS { reflect_dom_object(~Event::new_inherited(HTMLEventTypeId), - window.get(), + window, EventBinding::Wrap) } diff --git a/src/components/script/dom/formdata.rs b/src/components/script/dom/formdata.rs index 011722ea275..bd4c7a03d6e 100644 --- a/src/components/script/dom/formdata.rs +++ b/src/components/script/dom/formdata.rs @@ -38,7 +38,7 @@ impl FormData { } pub fn new(form: Option>, window: &JS) -> JS { - reflect_dom_object(~FormData::new_inherited(form, window.clone()), window.get(), FormDataBinding::Wrap) + reflect_dom_object(~FormData::new_inherited(form, window.clone()), window, FormDataBinding::Wrap) } pub fn Constructor(window: &JS, form: Option>) diff --git a/src/components/script/dom/htmlcollection.rs b/src/components/script/dom/htmlcollection.rs index 0ad4d94d357..ff2cfa7b5a1 100644 --- a/src/components/script/dom/htmlcollection.rs +++ b/src/components/script/dom/htmlcollection.rs @@ -32,7 +32,7 @@ impl HTMLCollection { pub fn new(window: &JS, elements: ~[JS]) -> JS { reflect_dom_object(~HTMLCollection::new_inherited(window.clone(), elements), - window.get(), HTMLCollectionBinding::Wrap) + window, HTMLCollectionBinding::Wrap) } pub fn Length(&self) -> u32 { diff --git a/src/components/script/dom/location.rs b/src/components/script/dom/location.rs index 641e0a1eb74..2fc06fb353b 100644 --- a/src/components/script/dom/location.rs +++ b/src/components/script/dom/location.rs @@ -43,7 +43,7 @@ impl Location { pub fn new(window: &JS, page: Rc) -> JS { reflect_dom_object(~Location::new_inherited(page), - window.get(), + window, LocationBinding::Wrap) } diff --git a/src/components/script/dom/mouseevent.rs b/src/components/script/dom/mouseevent.rs index 0e11d2e838b..8741ea48a68 100644 --- a/src/components/script/dom/mouseevent.rs +++ b/src/components/script/dom/mouseevent.rs @@ -54,7 +54,7 @@ impl MouseEvent { pub fn new(window: &JS) -> JS { reflect_dom_object(~MouseEvent::new_inherited(), - window.get(), + window, MouseEventBinding::Wrap) } diff --git a/src/components/script/dom/navigator.rs b/src/components/script/dom/navigator.rs index 245312d1840..140fa082f91 100644 --- a/src/components/script/dom/navigator.rs +++ b/src/components/script/dom/navigator.rs @@ -23,7 +23,7 @@ impl Navigator { pub fn new(window: &JS) -> JS { reflect_dom_object(~Navigator::new_inherited(), - window.get(), + window, NavigatorBinding::Wrap) } diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index ef3b4a03ffa..60e53504417 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -757,7 +757,7 @@ impl Node { wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~N) -> *JSObject) -> JS { assert!(node.reflector().get_jsobject().is_null()); - let node = reflect_dom_object(node, document.get().window.get(), wrap_fn); + let node = reflect_dom_object(node, &document.get().window, wrap_fn); assert!(node.reflector().get_jsobject().is_not_null()); node } diff --git a/src/components/script/dom/nodelist.rs b/src/components/script/dom/nodelist.rs index 9274e4faed5..ab2bbb7f575 100644 --- a/src/components/script/dom/nodelist.rs +++ b/src/components/script/dom/nodelist.rs @@ -34,7 +34,7 @@ impl NodeList { pub fn new(window: &JS, list_type: NodeListType) -> JS { reflect_dom_object(~NodeList::new_inherited(window.clone(), list_type), - window.get(), NodeListBinding::Wrap) + window, NodeListBinding::Wrap) } pub fn new_simple_list(window: &JS, elements: ~[JS]) -> JS { diff --git a/src/components/script/dom/uievent.rs b/src/components/script/dom/uievent.rs index f5564bee284..46ca3736fc3 100644 --- a/src/components/script/dom/uievent.rs +++ b/src/components/script/dom/uievent.rs @@ -37,7 +37,7 @@ impl UIEvent { pub fn new(window: &JS) -> JS { reflect_dom_object(~UIEvent::new_inherited(UIEventTypeId), - window.get(), + window, UIEventBinding::Wrap) } diff --git a/src/components/script/dom/validitystate.rs b/src/components/script/dom/validitystate.rs index 1d7a690ffab..4ad6d8657e4 100644 --- a/src/components/script/dom/validitystate.rs +++ b/src/components/script/dom/validitystate.rs @@ -25,7 +25,7 @@ impl ValidityState { pub fn new(window: &JS) -> JS { reflect_dom_object(~ValidityState::new_inherited(window.clone()), - window.get(), + window, ValidityStateBinding::Wrap) } } diff --git a/src/components/script/dom/windowproxy.rs b/src/components/script/dom/windowproxy.rs index 94164fb82ac..dc1e0092f36 100644 --- a/src/components/script/dom/windowproxy.rs +++ b/src/components/script/dom/windowproxy.rs @@ -17,7 +17,7 @@ impl WindowProxy { let proxy = ~WindowProxy { reflector_: Reflector::new() }; - reflect_dom_object(proxy, owner.get(), WindowProxyBinding::Wrap) + reflect_dom_object(proxy, owner, WindowProxyBinding::Wrap) } } From 787108deaf83cd7bd3e26e4c3aee11469c21c4c8 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 15:08:44 +0100 Subject: [PATCH 5/6] Pass &JS to the Wrap functions in codegen. --- .../script/dom/bindings/codegen/CodegenRust.py | 13 +++++++------ src/components/script/dom/bindings/js.rs | 5 ++--- src/components/script/dom/bindings/utils.rs | 2 +- src/components/script/dom/document.rs | 2 +- src/components/script/dom/node.rs | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 71c46b09119..fd6d83d09ec 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2600,7 +2600,7 @@ class CGWrapMethod(CGAbstractMethod): def __init__(self, descriptor): assert descriptor.interface.hasInterfacePrototypeObject() if not descriptor.createGlobal: - args = [Argument('*JSContext', 'aCx'), Argument('*JSObject', 'aScope'), + args = [Argument('*JSContext', 'aCx'), Argument('&JS', 'aScope'), Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] else: args = [Argument('*JSContext', 'aCx'), @@ -2610,11 +2610,12 @@ class CGWrapMethod(CGAbstractMethod): def definition_body(self): if not self.descriptor.createGlobal: return """ - assert!(aScope.is_not_null()); - assert!(((*JS_GetClass(aScope)).flags & JSCLASS_IS_GLOBAL) != 0); + let scope = aScope.reflector().get_jsobject(); + assert!(scope.is_not_null()); + assert!(((*JS_GetClass(scope)).flags & JSCLASS_IS_GLOBAL) != 0); - //JSAutoCompartment ac(aCx, aScope); - let proto = GetProtoObject(aCx, aScope, aScope); + //JSAutoCompartment ac(aCx, scope); + let proto = GetProtoObject(aCx, scope, scope); if proto.is_null() { return ptr::null(); } @@ -2623,7 +2624,7 @@ class CGWrapMethod(CGAbstractMethod): (*raw).mut_reflector().set_jsobject(obj); - return obj;""" % CreateBindingJSObject(self.descriptor, "aScope") + return obj;""" % CreateBindingJSObject(self.descriptor, "scope") else: return """ %s diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs index 29efaddd840..9f8e44ba06f 100644 --- a/src/components/script/dom/bindings/js.rs +++ b/src/components/script/dom/bindings/js.rs @@ -32,11 +32,10 @@ impl Clone for JS { impl JS { pub fn new(mut obj: ~T, window: &JS, - wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) -> JS { + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> *JSObject) -> JS { let cx = window.get().get_cx(); - let scope = window.get().reflector().get_jsobject(); let raw: *mut T = &mut *obj; - if wrap_fn(cx, scope, obj).is_null() { + if wrap_fn(cx, window, obj).is_null() { fail!("Could not eagerly wrap object"); } JS { diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 6f82d161811..b27b75646b5 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -494,7 +494,7 @@ pub trait Reflectable { pub fn reflect_dom_object (obj: ~T, window: &JS, - wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> *JSObject) -> JS { JS::new(obj, window, wrap_fn) } diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index f0bf35db84b..f2e6370f599 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -86,7 +86,7 @@ impl Document { pub fn reflect_document (document: ~D, window: &JS, - wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~D) -> *JSObject) + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~D) -> *JSObject) -> JS { assert!(document.reflector().get_jsobject().is_null()); let raw_doc = reflect_dom_object(document, window, wrap_fn); diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 60e53504417..f323421a8d7 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -754,7 +754,7 @@ impl Node { pub fn reflect_node (node: ~N, document: &JS, - wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~N) -> *JSObject) + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~N) -> *JSObject) -> JS { assert!(node.reflector().get_jsobject().is_null()); let node = reflect_dom_object(node, &document.get().window, wrap_fn); From d3ca4afaf57680ec9c26666cf36710b87bc8012d Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 15:17:12 +0100 Subject: [PATCH 6/6] Get the Page directly off the Window in CreateBindingJSObject. --- src/components/script/dom/bindings/codegen/CodegenRust.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index fd6d83d09ec..28cc819972c 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2569,8 +2569,7 @@ def CreateBindingJSObject(descriptor, parent=None): if descriptor.proxy: assert not descriptor.createGlobal handler = """ - let page = page_from_context(aCx); - let mut js_info = (*page).js_info(); + let js_info = aScope.get().page().js_info(); let handler = js_info.get().get_ref().dom_static.proxy_handlers.get(&(PrototypeList::id::%s as uint)); """ % descriptor.name create += handler + """ let obj = NewProxyObject(aCx, *handler,