auto merge of #1811 : Ms2ger/servo/Wrap_, r=jdm

This commit is contained in:
bors-servo 2014-03-05 09:31:44 -05:00
commit da6a571f9e
28 changed files with 65 additions and 72 deletions

View file

@ -43,18 +43,18 @@ impl Attr {
} }
} }
pub fn new(window: &Window, local_name: DOMString, value: DOMString) -> JS<Attr> { pub fn new(window: &JS<Window>, local_name: DOMString, value: DOMString) -> JS<Attr> {
let name = local_name.clone(); let name = local_name.clone();
Attr::new_helper(window, local_name, value, name, Null, None) 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<Window>, local_name: DOMString, value: DOMString,
name: DOMString, namespace: Namespace, name: DOMString, namespace: Namespace,
prefix: Option<DOMString>) -> JS<Attr> { prefix: Option<DOMString>) -> JS<Attr> {
Attr::new_helper(window, local_name, value, name, namespace, prefix) 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<Window>, local_name: DOMString, value: DOMString,
name: DOMString, namespace: Namespace, name: DOMString, namespace: Namespace,
prefix: Option<DOMString>) -> JS<Attr> { prefix: Option<DOMString>) -> JS<Attr> {
let attr = Attr::new_inherited(local_name, value, name, namespace, prefix); let attr = Attr::new_inherited(local_name, value, name, namespace, prefix);

View file

@ -27,7 +27,7 @@ impl AttrList {
pub fn new(window: &JS<Window>, elem: &JS<Element>) -> JS<AttrList> { pub fn new(window: &JS<Window>, elem: &JS<Element>) -> JS<AttrList> {
reflect_dom_object(~AttrList::new_inherited(window.clone(), elem.clone()), reflect_dom_object(~AttrList::new_inherited(window.clone(), elem.clone()),
window.get(), AttrListBinding::Wrap) window, AttrListBinding::Wrap)
} }
pub fn Length(&self) -> u32 { pub fn Length(&self) -> u32 {

View file

@ -85,6 +85,11 @@ DOMInterfaces = {
'ValidityState': {}, 'ValidityState': {},
'Window': { 'Window': {
'createGlobal': True, 'createGlobal': True,
'needsAbstract': [
'console',
'location',
'navigator',
],
}, },
'WindowProxy': {}, 'WindowProxy': {},

View file

@ -2569,8 +2569,7 @@ def CreateBindingJSObject(descriptor, parent=None):
if descriptor.proxy: if descriptor.proxy:
assert not descriptor.createGlobal assert not descriptor.createGlobal
handler = """ handler = """
let page = page_from_context(aCx); let js_info = aScope.get().page().js_info();
let mut js_info = (*page).js_info();
let handler = js_info.get().get_ref().dom_static.proxy_handlers.get(&(PrototypeList::id::%s as uint)); let handler = js_info.get().get_ref().dom_static.proxy_handlers.get(&(PrototypeList::id::%s as uint));
""" % descriptor.name """ % descriptor.name
create += handler + """ let obj = NewProxyObject(aCx, *handler, create += handler + """ let obj = NewProxyObject(aCx, *handler,
@ -2596,21 +2595,26 @@ def CreateBindingJSObject(descriptor, parent=None):
""" """
return create return create
class CGWrapWithCacheMethod(CGAbstractMethod): class CGWrapMethod(CGAbstractMethod):
def __init__(self, descriptor): def __init__(self, descriptor):
assert descriptor.interface.hasInterfacePrototypeObject() assert descriptor.interface.hasInterfacePrototypeObject()
args = [Argument('*JSContext', 'aCx'), Argument('*JSObject', 'aScope'), if not descriptor.createGlobal:
Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] args = [Argument('*JSContext', 'aCx'), Argument('&JS<Window>', 'aScope'),
CGAbstractMethod.__init__(self, descriptor, 'Wrap_', '*JSObject', args) 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): def definition_body(self):
if not self.descriptor.createGlobal: if not self.descriptor.createGlobal:
return """ return """
assert!(aScope.is_not_null()); let scope = aScope.reflector().get_jsobject();
assert!(((*JS_GetClass(aScope)).flags & JSCLASS_IS_GLOBAL) != 0); assert!(scope.is_not_null());
assert!(((*JS_GetClass(scope)).flags & JSCLASS_IS_GLOBAL) != 0);
//JSAutoCompartment ac(aCx, aScope); //JSAutoCompartment ac(aCx, scope);
let proto = GetProtoObject(aCx, aScope, aScope); let proto = GetProtoObject(aCx, scope, scope);
if proto.is_null() { if proto.is_null() {
return ptr::null(); return ptr::null();
} }
@ -2619,28 +2623,15 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
(*raw).mut_reflector().set_jsobject(obj); (*raw).mut_reflector().set_jsobject(obj);
return obj;""" % CreateBindingJSObject(self.descriptor, "aScope") return obj;""" % CreateBindingJSObject(self.descriptor, "scope")
else: else:
return """ return """
assert!(aScope.is_null());
%s %s
let proto = GetProtoObject(aCx, obj, obj); let proto = GetProtoObject(aCx, obj, obj);
JS_SetPrototype(aCx, obj, proto); JS_SetPrototype(aCx, obj, proto);
(*raw).mut_reflector().set_jsobject(obj); (*raw).mut_reflector().set_jsobject(obj);
return obj;""" % CreateBindingJSObject(self.descriptor) 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): class CGAbstractExternMethod(CGAbstractMethod):
""" """
Abstract base class for codegen of implementation-only (no Abstract base class for codegen of implementation-only (no
@ -4929,7 +4920,6 @@ class CGDescriptor(CGThing):
cgThings.append(CGDOMJSClass(descriptor)) cgThings.append(CGDOMJSClass(descriptor))
pass pass
cgThings.append(CGWrapWithCacheMethod(descriptor))
cgThings.append(CGWrapMethod(descriptor)) cgThings.append(CGWrapMethod(descriptor))
cgThings = CGList((CGIndenter(t, declareOnly=True) for t in cgThings), "\n") cgThings = CGList((CGIndenter(t, declareOnly=True) for t in cgThings), "\n")

View file

@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::utils::{Reflector, Reflectable}; use dom::bindings::utils::{Reflector, Reflectable};
use dom::window; use dom::window::Window;
use js::jsapi::{JSContext, JSObject}; use js::jsapi::{JSContext, JSObject};
use layout_interface::TrustedNodeAddress; use layout_interface::TrustedNodeAddress;
@ -31,12 +31,11 @@ impl <T> Clone for JS<T> {
impl<T: Reflectable> JS<T> { impl<T: Reflectable> JS<T> {
pub fn new(mut obj: ~T, pub fn new(mut obj: ~T,
window: &window::Window, window: &JS<Window>,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) -> JS<T> { wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~T) -> *JSObject) -> JS<T> {
let cx = window.get_cx(); let cx = window.get().get_cx();
let scope = window.reflector().get_jsobject();
let raw: *mut T = &mut *obj; 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"); fail!("Could not eagerly wrap object");
} }
JS { JS {

View file

@ -491,8 +491,8 @@ pub trait Reflectable {
pub fn reflect_dom_object<T: Reflectable> pub fn reflect_dom_object<T: Reflectable>
(obj: ~T, (obj: ~T,
window: &window::Window, window: &JS<window::Window>,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~T) -> *JSObject) wrap_fn: extern "Rust" fn(*JSContext, &JS<window::Window>, ~T) -> *JSObject)
-> JS<T> { -> JS<T> {
JS::new(obj, window, wrap_fn) JS::new(obj, window, wrap_fn)
} }

View file

@ -25,7 +25,7 @@ impl Blob {
pub fn new(window: &JS<Window>) -> JS<Blob> { pub fn new(window: &JS<Window>) -> JS<Blob> {
reflect_dom_object(~Blob::new_inherited(window.clone()), reflect_dom_object(~Blob::new_inherited(window.clone()),
window.get(), window,
BlobBinding::Wrap) BlobBinding::Wrap)
} }
} }

View file

@ -36,7 +36,7 @@ impl ClientRect {
top: Au, bottom: Au, top: Au, bottom: Au,
left: Au, right: Au) -> JS<ClientRect> { left: Au, right: Au) -> JS<ClientRect> {
let rect = ClientRect::new_inherited(window.clone(), top, bottom, left, right); 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)
} }

View file

@ -28,7 +28,7 @@ impl ClientRectList {
pub fn new(window: &JS<Window>, pub fn new(window: &JS<Window>,
rects: ~[JS<ClientRect>]) -> JS<ClientRectList> { rects: ~[JS<ClientRect>]) -> JS<ClientRectList> {
reflect_dom_object(~ClientRectList::new_inherited(window.clone(), rects), reflect_dom_object(~ClientRectList::new_inherited(window.clone(), rects),
window.get(), ClientRectListBinding::Wrap) window, ClientRectListBinding::Wrap)
} }
pub fn Length(&self) -> u32 { pub fn Length(&self) -> u32 {

View file

@ -20,7 +20,7 @@ impl Console {
} }
} }
pub fn new(window: &Window) -> JS<Console> { pub fn new(window: &JS<Window>) -> JS<Console> {
reflect_dom_object(~Console::new_inherited(), window, ConsoleBinding::Wrap) reflect_dom_object(~Console::new_inherited(), window, ConsoleBinding::Wrap)
} }

View file

@ -87,10 +87,10 @@ impl Document {
pub fn reflect_document<D: Reflectable+DocumentBase> pub fn reflect_document<D: Reflectable+DocumentBase>
(document: ~D, (document: ~D,
window: &JS<Window>, window: &JS<Window>,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~D) -> *JSObject) wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~D) -> *JSObject)
-> JS<D> { -> JS<D> {
assert!(document.reflector().get_jsobject().is_null()); 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()); assert!(raw_doc.reflector().get_jsobject().is_not_null());
let document = DocumentCast::from(&raw_doc); let document = DocumentCast::from(&raw_doc);

View file

@ -48,7 +48,7 @@ impl DOMException {
} }
} }
pub fn new(window: &Window, code: DOMErrorName) -> JS<DOMException> { pub fn new(window: &JS<Window>, code: DOMErrorName) -> JS<DOMException> {
reflect_dom_object(~DOMException::new_inherited(code), window, DOMExceptionBinding::Wrap) reflect_dom_object(~DOMException::new_inherited(code), window, DOMExceptionBinding::Wrap)
} }
} }

View file

@ -34,7 +34,7 @@ impl DOMImplementation {
} }
pub fn new(owner: &JS<Window>) -> JS<DOMImplementation> { pub fn new(owner: &JS<Window>) -> JS<DOMImplementation> {
reflect_dom_object(~DOMImplementation::new_inherited(owner.clone()), owner.get(), reflect_dom_object(~DOMImplementation::new_inherited(owner.clone()), owner,
DOMImplementationBinding::Wrap) DOMImplementationBinding::Wrap)
} }
} }

View file

@ -26,7 +26,7 @@ impl DOMParser {
} }
pub fn new(owner: &JS<Window>) -> JS<DOMParser> { pub fn new(owner: &JS<Window>) -> JS<DOMParser> {
reflect_dom_object(~DOMParser::new_inherited(owner.clone()), owner.get(), reflect_dom_object(~DOMParser::new_inherited(owner.clone()), owner,
DOMParserBinding::Wrap) DOMParserBinding::Wrap)
} }

View file

@ -220,7 +220,7 @@ impl Element {
None => { None => {
let doc = self.node.owner_doc(); let doc = self.node.owner_doc();
let doc = doc.get(); 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(), name.clone(), namespace.clone(),
prefix); prefix);
self.attrs.push(new_attr); self.attrs.push(new_attr);

View file

@ -77,7 +77,7 @@ impl Event {
pub fn new(window: &JS<Window>) -> JS<Event> { pub fn new(window: &JS<Window>) -> JS<Event> {
reflect_dom_object(~Event::new_inherited(HTMLEventTypeId), reflect_dom_object(~Event::new_inherited(HTMLEventTypeId),
window.get(), window,
EventBinding::Wrap) EventBinding::Wrap)
} }

View file

@ -38,7 +38,7 @@ impl FormData {
} }
pub fn new(form: Option<JS<HTMLFormElement>>, window: &JS<Window>) -> JS<FormData> { pub fn new(form: Option<JS<HTMLFormElement>>, window: &JS<Window>) -> JS<FormData> {
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<Window>, form: Option<JS<HTMLFormElement>>) pub fn Constructor(window: &JS<Window>, form: Option<JS<HTMLFormElement>>)

View file

@ -32,7 +32,7 @@ impl HTMLCollection {
pub fn new(window: &JS<Window>, elements: ~[JS<Element>]) -> JS<HTMLCollection> { pub fn new(window: &JS<Window>, elements: ~[JS<Element>]) -> JS<HTMLCollection> {
reflect_dom_object(~HTMLCollection::new_inherited(window.clone(), elements), reflect_dom_object(~HTMLCollection::new_inherited(window.clone(), elements),
window.get(), HTMLCollectionBinding::Wrap) window, HTMLCollectionBinding::Wrap)
} }
pub fn Length(&self) -> u32 { pub fn Length(&self) -> u32 {

View file

@ -41,7 +41,7 @@ impl Location {
} }
} }
pub fn new(window: &Window, page: Rc<Page>) -> JS<Location> { pub fn new(window: &JS<Window>, page: Rc<Page>) -> JS<Location> {
reflect_dom_object(~Location::new_inherited(page), reflect_dom_object(~Location::new_inherited(page),
window, window,
LocationBinding::Wrap) LocationBinding::Wrap)

View file

@ -54,7 +54,7 @@ impl MouseEvent {
pub fn new(window: &JS<Window>) -> JS<MouseEvent> { pub fn new(window: &JS<Window>) -> JS<MouseEvent> {
reflect_dom_object(~MouseEvent::new_inherited(), reflect_dom_object(~MouseEvent::new_inherited(),
window.get(), window,
MouseEventBinding::Wrap) MouseEventBinding::Wrap)
} }

View file

@ -21,7 +21,7 @@ impl Navigator {
} }
} }
pub fn new(window: &Window) -> JS<Navigator> { pub fn new(window: &JS<Window>) -> JS<Navigator> {
reflect_dom_object(~Navigator::new_inherited(), reflect_dom_object(~Navigator::new_inherited(),
window, window,
NavigatorBinding::Wrap) NavigatorBinding::Wrap)

View file

@ -754,10 +754,10 @@ impl Node {
pub fn reflect_node<N: Reflectable+NodeBase> pub fn reflect_node<N: Reflectable+NodeBase>
(node: ~N, (node: ~N,
document: &JS<Document>, document: &JS<Document>,
wrap_fn: extern "Rust" fn(*JSContext, *JSObject, ~N) -> *JSObject) wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~N) -> *JSObject)
-> JS<N> { -> JS<N> {
assert!(node.reflector().get_jsobject().is_null()); 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()); assert!(node.reflector().get_jsobject().is_not_null());
node node
} }

View file

@ -31,18 +31,18 @@ impl NodeList {
} }
} }
pub fn new(window: JS<Window>, pub fn new(window: &JS<Window>,
list_type: NodeListType) -> JS<NodeList> { list_type: NodeListType) -> JS<NodeList> {
reflect_dom_object(~NodeList::new_inherited(window.clone(), list_type), reflect_dom_object(~NodeList::new_inherited(window.clone(), list_type),
window.get(), NodeListBinding::Wrap) window, NodeListBinding::Wrap)
} }
pub fn new_simple_list(window: &JS<Window>, elements: ~[JS<Node>]) -> JS<NodeList> { pub fn new_simple_list(window: &JS<Window>, elements: ~[JS<Node>]) -> JS<NodeList> {
NodeList::new(window.clone(), Simple(elements)) NodeList::new(window, Simple(elements))
} }
pub fn new_child_list(window: &JS<Window>, node: &JS<Node>) -> JS<NodeList> { pub fn new_child_list(window: &JS<Window>, node: &JS<Node>) -> JS<NodeList> {
NodeList::new(window.clone(), Children(node.clone())) NodeList::new(window, Children(node.clone()))
} }
pub fn Length(&self) -> u32 { pub fn Length(&self) -> u32 {

View file

@ -37,7 +37,7 @@ impl UIEvent {
pub fn new(window: &JS<Window>) -> JS<UIEvent> { pub fn new(window: &JS<Window>) -> JS<UIEvent> {
reflect_dom_object(~UIEvent::new_inherited(UIEventTypeId), reflect_dom_object(~UIEvent::new_inherited(UIEventTypeId),
window.get(), window,
UIEventBinding::Wrap) UIEventBinding::Wrap)
} }

View file

@ -25,7 +25,7 @@ impl ValidityState {
pub fn new(window: &JS<Window>) -> JS<ValidityState> { pub fn new(window: &JS<Window>) -> JS<ValidityState> {
reflect_dom_object(~ValidityState::new_inherited(window.clone()), reflect_dom_object(~ValidityState::new_inherited(window.clone()),
window.get(), window,
ValidityStateBinding::Wrap) ValidityStateBinding::Wrap)
} }
} }

View file

@ -29,7 +29,6 @@ use std::comm::Select;
use std::hashmap::HashSet; use std::hashmap::HashSet;
use std::io::timer::Timer; use std::io::timer::Timer;
use std::num; use std::num;
use std::ptr;
use std::rc::Rc; use std::rc::Rc;
use std::to_bytes::Cb; use std::to_bytes::Cb;
@ -176,23 +175,23 @@ impl Window {
None None
} }
pub fn Location(&mut self) -> JS<Location> { pub fn Location(&mut self, abstract_self: &JS<Window>) -> JS<Location> {
if self.location.is_none() { 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() self.location.get_ref().clone()
} }
pub fn Console(&mut self) -> JS<Console> { pub fn Console(&mut self, abstract_self: &JS<Window>) -> JS<Console> {
if self.console.is_none() { if self.console.is_none() {
self.console = Some(Console::new(self)); self.console = Some(Console::new(abstract_self));
} }
self.console.get_ref().clone() self.console.get_ref().clone()
} }
pub fn Navigator(&mut self) -> JS<Navigator> { pub fn Navigator(&mut self, abstract_self: &JS<Window>) -> JS<Navigator> {
if self.navigator.is_none() { if self.navigator.is_none() {
self.navigator = Some(Navigator::new(self)); self.navigator = Some(Navigator::new(abstract_self));
} }
self.navigator.get_ref().clone() self.navigator.get_ref().clone()
} }
@ -311,7 +310,7 @@ impl Window {
}; };
let raw: *mut Window = &mut *win; 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()); assert!(global.is_not_null());
unsafe { unsafe {
let fn_names = ["window","self"]; let fn_names = ["window","self"];

View file

@ -13,11 +13,11 @@ pub struct WindowProxy {
} }
impl WindowProxy { impl WindowProxy {
pub fn new(owner: JS<Window>) -> JS<WindowProxy> { pub fn new(owner: &JS<Window>) -> JS<WindowProxy> {
let proxy = ~WindowProxy { let proxy = ~WindowProxy {
reflector_: Reflector::new() reflector_: Reflector::new()
}; };
reflect_dom_object(proxy, owner.get(), WindowProxyBinding::Wrap) reflect_dom_object(proxy, owner, WindowProxyBinding::Wrap)
} }
} }

View file

@ -984,7 +984,7 @@ impl ScriptTask {
Some(ref frame) => { Some(ref frame) => {
// http://dev.w3.org/csswg/cssom-view/#resizing-viewports // 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 // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-type-resize
let window_proxy: JS<WindowProxy> = WindowProxy::new(frame.window.clone()); let window_proxy: JS<WindowProxy> = WindowProxy::new(&frame.window);
let mut uievent = UIEvent::new(&frame.window); let mut uievent = UIEvent::new(&frame.window);
uievent.get_mut().InitUIEvent(~"resize", false, false, Some(window_proxy), 0i32); uievent.get_mut().InitUIEvent(~"resize", false, false, Some(window_proxy), 0i32);
let event: &mut JS<Event> = &mut EventCast::from(&uievent); let event: &mut JS<Event> = &mut EventCast::from(&uievent);