diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index 906e1b7f02c..8357665b63d 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -43,18 +43,18 @@ 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); 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/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 0b35b0ed416..3420e40a4dd 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/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 4cfa3c184de..c0631a0e257 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, @@ -2596,21 +2595,26 @@ 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) + if not descriptor.createGlobal: + args = [Argument('*JSContext', 'aCx'), Argument('&JS', '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): 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(); } @@ -2619,28 +2623,15 @@ class CGWrapWithCacheMethod(CGAbstractMethod): (*raw).mut_reflector().set_jsobject(obj); - return obj;""" % CreateBindingJSObject(self.descriptor, "aScope") + return obj;""" % CreateBindingJSObject(self.descriptor, "scope") else: return """ - assert!(aScope.is_null()); - %s let proto = GetProtoObject(aCx, obj, obj); JS_SetPrototype(aCx, obj, proto); (*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 @@ -4929,7 +4920,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") diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs index 4aaf3506ae8..9f8e44ba06f 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,12 +31,11 @@ impl Clone for JS { impl JS { pub fn new(mut obj: ~T, - window: &window::Window, - wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) -> JS { - let cx = window.get_cx(); - let scope = window.reflector().get_jsobject(); + window: &JS, + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> *JSObject) -> JS { + let cx = window.get().get_cx(); 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 1ce06bb78e9..a749b26b42c 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -491,8 +491,8 @@ pub trait Reflectable { pub fn reflect_dom_object (obj: ~T, - window: &window::Window, - wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) + window: &JS, + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~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 3c5a219b39c..8a7a935e918 100644 --- a/src/components/script/dom/console.rs +++ b/src/components/script/dom/console.rs @@ -20,7 +20,7 @@ impl Console { } } - pub fn new(window: &Window) -> JS { + pub fn new(window: &JS) -> JS { reflect_dom_object(~Console::new_inherited(), window, ConsoleBinding::Wrap) } diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 5c1fea26596..471d1439fec 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -87,10 +87,10 @@ 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.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 f6eb1751adc..9d8142ac938 100644 --- a/src/components/script/dom/domexception.rs +++ b/src/components/script/dom/domexception.rs @@ -48,7 +48,7 @@ impl DOMException { } } - pub fn new(window: &Window, code: DOMErrorName) -> JS { + pub fn new(window: &JS, code: DOMErrorName) -> JS { 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/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/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 7d0c5294711..2fc06fb353b 100644 --- a/src/components/script/dom/location.rs +++ b/src/components/script/dom/location.rs @@ -41,7 +41,7 @@ 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, 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 e3c648ec4ed..140fa082f91 100644 --- a/src/components/script/dom/navigator.rs +++ b/src/components/script/dom/navigator.rs @@ -21,7 +21,7 @@ impl Navigator { } } - pub fn new(window: &Window) -> JS { + pub fn new(window: &JS) -> JS { reflect_dom_object(~Navigator::new_inherited(), window, NavigatorBinding::Wrap) diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index ef3b4a03ffa..f323421a8d7 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -754,10 +754,10 @@ 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.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 84de1a56d19..ab2bbb7f575 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) + window, 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/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/window.rs b/src/components/script/dom/window.rs index 68a9e3364b9..a3c6c7f866e 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; @@ -176,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() } @@ -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"]; diff --git a/src/components/script/dom/windowproxy.rs b/src/components/script/dom/windowproxy.rs index 35304d25d3c..dc1e0092f36 100644 --- a/src/components/script/dom/windowproxy.rs +++ b/src/components/script/dom/windowproxy.rs @@ -13,11 +13,11 @@ pub struct WindowProxy { } impl WindowProxy { - pub fn new(owner: JS) -> JS { + pub fn new(owner: &JS) -> JS { let proxy = ~WindowProxy { reflector_: Reflector::new() }; - reflect_dom_object(proxy, owner.get(), WindowProxyBinding::Wrap) + reflect_dom_object(proxy, owner, WindowProxyBinding::Wrap) } } 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);