diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 6cb7cacea92..a97db130bb2 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -5,6 +5,7 @@ use dom::bindings::codegen::PrototypeList; use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH; use dom::bindings::node; +use dom::window; use dom::node::{AbstractNode, ScriptView}; use std::libc::c_uint; @@ -544,6 +545,20 @@ pub trait Reflectable { fn GetParentObject(&self, cx: *JSContext) -> Option<@mut Reflectable>; } +pub fn reflect_dom_object + (obj: @mut T, + window: &window::Window, + wrap_fn: extern "Rust" fn(*JSContext, *JSObject, @mut T) -> *JSObject) + -> @mut T { + let cx = window.get_cx(); + let scope = window.reflector().get_jsobject(); + if wrap_fn(cx, scope, obj).is_null() { + fail!("Could not eagerly wrap object"); + } + assert!(obj.reflector().get_jsobject().is_not_null()); + obj +} + pub struct Reflector { object: *JSObject } diff --git a/src/components/script/dom/blob.rs b/src/components/script/dom/blob.rs index 9e265e4114b..8d1ef93338a 100644 --- a/src/components/script/dom/blob.rs +++ b/src/components/script/dom/blob.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::utils::Fallible; use dom::bindings::codegen::BlobBinding; use dom::window::Window; @@ -23,14 +23,7 @@ impl Blob { } pub fn new(window: @mut Window) -> @mut Blob { - let blob = @mut Blob::new_inherited(window); - let cx = window.get_cx(); - let scope = window.reflector().get_jsobject(); - if BlobBinding::Wrap(cx, scope, blob).is_null() { - fail!("BlobBinding::Wrap failed"); - } - assert!(blob.reflector().get_jsobject().is_not_null()); - blob + reflect_dom_object(@mut Blob::new_inherited(window), window, BlobBinding::Wrap) } } diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index 00bf6868e43..b7509941abf 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -5,7 +5,7 @@ use dom::eventtarget::EventTarget; use dom::window::Window; use dom::bindings::codegen::EventBinding; -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::utils::{DOMString, ErrorResult, Fallible}; use geom::point::Point2D; @@ -31,7 +31,7 @@ pub struct Event { } impl Event { - pub fn new(type_: &DOMString) -> Event { + pub fn new_inherited(type_: &DOMString) -> Event { Event { reflector_: Reflector::new(), type_: (*type_).clone(), @@ -42,6 +42,10 @@ impl Event { } } + pub fn new(window: @mut Window, type_: &DOMString) -> @mut Event { + reflect_dom_object(@mut Event::new_inherited(type_), window, EventBinding::Wrap) + } + pub fn init_wrapper(@mut self, cx: *JSContext, scope: *JSObject) { self.wrap_object_shared(cx, scope); } @@ -102,10 +106,10 @@ impl Event { self.trusted } - pub fn Constructor(_global: @mut Window, + pub fn Constructor(global: @mut Window, type_: &DOMString, _init: &EventBinding::EventInit) -> Fallible<@mut Event> { - Ok(@mut Event::new(type_)) + Ok(Event::new(global, type_)) } } @@ -118,8 +122,8 @@ impl Reflectable for Event { &mut self.reflector_ } - fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { - EventBinding::Wrap(cx, scope, self) + fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject { + unreachable!() } fn GetParentObject(&self, cx: *JSContext) -> Option<@mut Reflectable> { diff --git a/src/components/script/dom/formdata.rs b/src/components/script/dom/formdata.rs index cc3f1d6b6ab..0bff8ce41d7 100644 --- a/src/components/script/dom/formdata.rs +++ b/src/components/script/dom/formdata.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::utils::{DOMString, null_str_as_empty}; use dom::bindings::codegen::FormDataBinding; use dom::blob::Blob; @@ -33,14 +33,7 @@ impl FormData { } pub fn new(window: @mut Window) -> @mut FormData { - let formdata = @mut FormData::new_inherited(window); - let cx = window.get_cx(); - let scope = window.reflector().get_jsobject(); - if FormDataBinding::Wrap(cx, scope, formdata).is_null() { - fail!("FormDataBinding::Wrap failed"); - } - assert!(formdata.reflector().get_jsobject().is_not_null()); - formdata + reflect_dom_object(@mut FormData::new_inherited(window), window, FormDataBinding::Wrap) } pub fn Append(&mut self, name: &DOMString, value: @mut Blob, filename: Option) { diff --git a/src/components/script/dom/mouseevent.rs b/src/components/script/dom/mouseevent.rs index ffe871b6485..a24a11102cf 100644 --- a/src/components/script/dom/mouseevent.rs +++ b/src/components/script/dom/mouseevent.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::MouseEventBinding; use dom::bindings::utils::{ErrorResult, Fallible, DOMString}; -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::eventtarget::EventTarget; use dom::uievent::UIEvent; use dom::window::Window; @@ -27,13 +27,13 @@ pub struct MouseEvent { } impl MouseEvent { - pub fn new(type_: &DOMString, can_bubble: bool, cancelable: bool, + pub fn new(window: @mut Window, type_: &DOMString, can_bubble: bool, cancelable: bool, view: Option<@mut WindowProxy>, detail: i32, screen_x: i32, screen_y: i32, client_x: i32, client_y: i32, ctrl_key: bool, shift_key: bool, alt_key: bool, meta_key: bool, button: u16, - _buttons: u16, related_target: Option<@mut EventTarget>) -> MouseEvent { - MouseEvent { - parent: UIEvent::new(type_, can_bubble, cancelable, view, detail), + _buttons: u16, related_target: Option<@mut EventTarget>) -> @mut MouseEvent { + let ev = @mut MouseEvent { + parent: UIEvent::new_inherited(type_, can_bubble, cancelable, view, detail), screen_x: screen_x, screen_y: screen_y, client_x: client_x, @@ -44,20 +44,21 @@ impl MouseEvent { meta_key: meta_key, button: button, related_target: related_target - } + }; + reflect_dom_object(ev, window, MouseEventBinding::Wrap) } pub fn init_wrapper(@mut self, cx: *JSContext, scope: *JSObject) { self.wrap_object_shared(cx, scope); } - pub fn Constructor(_owner: @mut Window, + pub fn Constructor(owner: @mut Window, type_: &DOMString, init: &MouseEventBinding::MouseEventInit) -> Fallible<@mut MouseEvent> { - Ok(@mut MouseEvent::new(type_, init.bubbles, init.cancelable, init.view, init.detail, - init.screenX, init.screenY, init.clientX, init.clientY, - init.ctrlKey, init.shiftKey, init.altKey, init.metaKey, - init.button, init.buttons, init.relatedTarget)) + Ok(MouseEvent::new(owner, type_, init.bubbles, init.cancelable, init.view, init.detail, + init.screenX, init.screenY, init.clientX, init.clientY, + init.ctrlKey, init.shiftKey, init.altKey, init.metaKey, + init.button, init.buttons, init.relatedTarget)) } pub fn ScreenX(&self) -> i32 { @@ -150,8 +151,8 @@ impl Reflectable for MouseEvent { self.parent.mut_reflector() } - fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { - MouseEventBinding::Wrap(cx, scope, self) + fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject { + unreachable!() } fn GetParentObject(&self, cx: *JSContext) -> Option<@mut Reflectable> { diff --git a/src/components/script/dom/navigator.rs b/src/components/script/dom/navigator.rs index fc60c8486b3..88ea1b7974c 100644 --- a/src/components/script/dom/navigator.rs +++ b/src/components/script/dom/navigator.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::utils::{DOMString, Fallible}; use dom::bindings::codegen::NavigatorBinding; use dom::window::Window; @@ -22,14 +22,7 @@ impl Navigator { } pub fn new(window: &Window) -> @mut Navigator { - let nav = @mut Navigator::new_inherited(); - let cx = window.get_cx(); - let scope = window.reflector().get_jsobject(); - if NavigatorBinding::Wrap(cx, scope, nav).is_null() { - fail!("NavigatorBinding::Wrap failed"); - } - assert!(nav.reflector().get_jsobject().is_not_null()); - nav + reflect_dom_object(@mut Navigator::new_inherited(), window, NavigatorBinding::Wrap) } pub fn DoNotTrack(&self) -> DOMString { diff --git a/src/components/script/dom/uievent.rs b/src/components/script/dom/uievent.rs index d049be1f55e..17fe2dea3e8 100644 --- a/src/components/script/dom/uievent.rs +++ b/src/components/script/dom/uievent.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::UIEventBinding; use dom::bindings::utils::{DOMString, Fallible}; -use dom::bindings::utils::{Reflectable, Reflector}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::node::{AbstractNode, ScriptView}; use dom::event::Event; use dom::window::Window; @@ -21,10 +21,10 @@ pub struct UIEvent { } impl UIEvent { - pub fn new(type_: &DOMString, can_bubble: bool, cancelable: bool, - view: Option<@mut WindowProxy>, detail: i32) -> UIEvent { + pub fn new_inherited(type_: &DOMString, can_bubble: bool, cancelable: bool, + view: Option<@mut WindowProxy>, detail: i32) -> UIEvent { UIEvent { - parent: Event::new(type_), + parent: Event::new_inherited(type_), can_bubble: can_bubble, cancelable: cancelable, view: view, @@ -32,15 +32,22 @@ impl UIEvent { } } + pub fn new(window: @mut Window, type_: &DOMString, can_bubble: bool, cancelable: bool, + view: Option<@mut WindowProxy>, detail: i32) -> @mut UIEvent { + reflect_dom_object(@mut UIEvent::new_inherited(type_, can_bubble, cancelable, view, detail), + window, + UIEventBinding::Wrap) + } + pub fn init_wrapper(@mut self, cx: *JSContext, scope: *JSObject) { self.wrap_object_shared(cx, scope); } - pub fn Constructor(_owner: @mut Window, + pub fn Constructor(owner: @mut Window, type_: &DOMString, init: &UIEventBinding::UIEventInit) -> Fallible<@mut UIEvent> { - Ok(@mut UIEvent::new(type_, init.parent.bubbles, init.parent.cancelable, - init.view, init.detail)) + Ok(UIEvent::new(owner, type_, init.parent.bubbles, init.parent.cancelable, + init.view, init.detail)) } pub fn GetView(&self) -> Option<@mut WindowProxy> { @@ -123,8 +130,8 @@ impl Reflectable for UIEvent { self.parent.mut_reflector() } - fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { - UIEventBinding::Wrap(cx, scope, self) + fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject { + unreachable!() } fn GetParentObject(&self, cx: *JSContext) -> Option<@mut Reflectable> { diff --git a/src/test/html/content/test_Event.html b/src/test/html/content/test_Event.html index 6b24d46daab..7523c843206 100644 --- a/src/test/html/content/test_Event.html +++ b/src/test/html/content/test_Event.html @@ -4,16 +4,13 @@ diff --git a/src/test/html/content/test_MouseEvent.html b/src/test/html/content/test_MouseEvent.html index 2fb8d413e88..de826380c3b 100644 --- a/src/test/html/content/test_MouseEvent.html +++ b/src/test/html/content/test_MouseEvent.html @@ -4,17 +4,14 @@