diff options
Diffstat (limited to 'src/components/script/dom/mouseevent.rs')
-rw-r--r-- | src/components/script/dom/mouseevent.rs | 125 |
1 files changed, 81 insertions, 44 deletions
diff --git a/src/components/script/dom/mouseevent.rs b/src/components/script/dom/mouseevent.rs index 9db7963c2c9..fbd0abfc4d4 100644 --- a/src/components/script/dom/mouseevent.rs +++ b/src/components/script/dom/mouseevent.rs @@ -3,13 +3,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::BindingDeclarations::MouseEventBinding; -use dom::bindings::codegen::InheritTypes::MouseEventDerived; -use dom::bindings::js::JS; +use dom::bindings::codegen::InheritTypes::{UIEventCast, MouseEventDerived}; +use dom::bindings::js::{JS, JSRef, RootedReference, Temporary, OptionalSettable}; use dom::bindings::error::Fallible; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::event::{Event, MouseEventTypeId}; use dom::eventtarget::EventTarget; -use dom::uievent::UIEvent; +use dom::uievent::{UIEvent, UIEventMethods}; use dom::window::Window; use servo_util::str::DOMString; @@ -51,91 +51,127 @@ impl MouseEvent { } } - pub fn new(window: &JS<Window>) -> JS<MouseEvent> { + pub fn new(window: &JSRef<Window>) -> Temporary<MouseEvent> { reflect_dom_object(~MouseEvent::new_inherited(), window, MouseEventBinding::Wrap) } - pub fn Constructor(owner: &JS<Window>, + pub fn Constructor(owner: &JSRef<Window>, type_: DOMString, - init: &MouseEventBinding::MouseEventInit) -> Fallible<JS<MouseEvent>> { - let mut ev = MouseEvent::new(owner); - ev.get_mut().InitMouseEvent(type_, init.bubbles, init.cancelable, init.view.clone(), - init.detail, init.screenX, init.screenY, - init.clientX, init.clientY, init.ctrlKey, - init.altKey, init.shiftKey, init.metaKey, - init.button, init.relatedTarget.clone()); - Ok(ev) + init: &MouseEventBinding::MouseEventInit) -> Fallible<Temporary<MouseEvent>> { + let mut ev = MouseEvent::new(owner).root(); + ev.InitMouseEvent(type_, init.bubbles, init.cancelable, init.view.root_ref(), + init.detail, init.screenX, init.screenY, + init.clientX, init.clientY, init.ctrlKey, + init.altKey, init.shiftKey, init.metaKey, + init.button, init.relatedTarget.root_ref()); + Ok(Temporary::from_rooted(&*ev)) } +} + +pub trait MouseEventMethods { + fn ScreenX(&self) -> i32; + fn ScreenY(&self) -> i32; + fn ClientX(&self) -> i32; + fn ClientY(&self) -> i32; + fn CtrlKey(&self) -> bool; + fn ShiftKey(&self) -> bool; + fn AltKey(&self) -> bool; + fn MetaKey(&self) -> bool; + fn Button(&self) -> u16; + fn Buttons(&self)-> u16; + fn GetRelatedTarget(&self) -> Option<Temporary<EventTarget>>; + fn GetModifierState(&self, _keyArg: DOMString) -> bool; + fn InitMouseEvent(&mut self, + typeArg: DOMString, + canBubbleArg: bool, + cancelableArg: bool, + viewArg: Option<JSRef<Window>>, + detailArg: i32, + screenXArg: i32, + screenYArg: i32, + clientXArg: i32, + clientYArg: i32, + ctrlKeyArg: bool, + altKeyArg: bool, + shiftKeyArg: bool, + metaKeyArg: bool, + buttonArg: u16, + relatedTargetArg: Option<JSRef<EventTarget>>); +} - pub fn ScreenX(&self) -> i32 { +impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> { + fn ScreenX(&self) -> i32 { self.screen_x } - pub fn ScreenY(&self) -> i32 { + fn ScreenY(&self) -> i32 { self.screen_y } - pub fn ClientX(&self) -> i32 { + fn ClientX(&self) -> i32 { self.client_x } - pub fn ClientY(&self) -> i32 { + fn ClientY(&self) -> i32 { self.client_y } - pub fn CtrlKey(&self) -> bool { + fn CtrlKey(&self) -> bool { self.ctrl_key } - pub fn ShiftKey(&self) -> bool { + fn ShiftKey(&self) -> bool { self.shift_key } - pub fn AltKey(&self) -> bool { + fn AltKey(&self) -> bool { self.alt_key } - pub fn MetaKey(&self) -> bool { + fn MetaKey(&self) -> bool { self.meta_key } - pub fn Button(&self) -> u16 { + fn Button(&self) -> u16 { self.button } - pub fn Buttons(&self)-> u16 { + fn Buttons(&self)-> u16 { //TODO 0 } - pub fn GetRelatedTarget(&self) -> Option<JS<EventTarget>> { - self.related_target.clone() + fn GetRelatedTarget(&self) -> Option<Temporary<EventTarget>> { + self.related_target.clone().map(|target| Temporary::new(target)) } - pub fn GetModifierState(&self, _keyArg: DOMString) -> bool { + fn GetModifierState(&self, _keyArg: DOMString) -> bool { //TODO false } - pub fn InitMouseEvent(&mut self, - typeArg: DOMString, - canBubbleArg: bool, - cancelableArg: bool, - viewArg: Option<JS<Window>>, - detailArg: i32, - screenXArg: i32, - screenYArg: i32, - clientXArg: i32, - clientYArg: i32, - ctrlKeyArg: bool, - altKeyArg: bool, - shiftKeyArg: bool, - metaKeyArg: bool, - buttonArg: u16, - relatedTargetArg: Option<JS<EventTarget>>) { - self.mouseevent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg); + fn InitMouseEvent(&mut self, + typeArg: DOMString, + canBubbleArg: bool, + cancelableArg: bool, + viewArg: Option<JSRef<Window>>, + detailArg: i32, + screenXArg: i32, + screenYArg: i32, + clientXArg: i32, + clientYArg: i32, + ctrlKeyArg: bool, + altKeyArg: bool, + shiftKeyArg: bool, + metaKeyArg: bool, + buttonArg: u16, + relatedTargetArg: Option<JSRef<EventTarget>>) { + { + let uievent: &mut JSRef<UIEvent> = UIEventCast::from_mut_ref(self); + uievent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg); + } self.screen_x = screenXArg; self.screen_y = screenYArg; self.client_x = clientXArg; @@ -145,10 +181,11 @@ impl MouseEvent { self.shift_key = shiftKeyArg; self.meta_key = metaKeyArg; self.button = buttonArg; - self.related_target = relatedTargetArg; + self.related_target.assign(relatedTargetArg); } } + impl Reflectable for MouseEvent { fn reflector<'a>(&'a self) -> &'a Reflector { self.mouseevent.reflector() |