diff options
Diffstat (limited to 'src/components/script/dom/eventdispatcher.rs')
-rw-r--r-- | src/components/script/dom/eventdispatcher.rs | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/src/components/script/dom/eventdispatcher.rs b/src/components/script/dom/eventdispatcher.rs index 5a1c09ce9f6..c22ef7716c1 100644 --- a/src/components/script/dom/eventdispatcher.rs +++ b/src/components/script/dom/eventdispatcher.rs @@ -3,50 +3,57 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::callback::eReportExceptions; -use dom::eventtarget::{AbstractEventTarget, Capturing, Bubbling}; -use dom::event::{AbstractEvent, Phase_At_Target, Phase_None, Phase_Bubbling, Phase_Capturing}; -use dom::node::AbstractNode; +use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, NodeDerived}; +use dom::bindings::js::JS; +use dom::eventtarget::{Capturing, Bubbling, EventTarget}; +use dom::event::{Event, Phase_At_Target, Phase_None, Phase_Bubbling, Phase_Capturing}; +use dom::node::{Node, NodeHelpers}; // See http://dom.spec.whatwg.org/#concept-event-dispatch for the full dispatch algorithm -pub fn dispatch_event(target: AbstractEventTarget, - pseudo_target: Option<AbstractEventTarget>, - event: AbstractEvent) -> bool { - assert!(!event.event().dispatching); +pub fn dispatch_event(target: &JS<EventTarget>, + pseudo_target: Option<JS<EventTarget>>, + event: &mut JS<Event>) -> bool { + assert!(!event.get().dispatching); { - let event = event.mut_event(); - event.target = Some(pseudo_target.unwrap_or(target)); + let event = event.get_mut(); + event.target = match pseudo_target { + Some(pseudo_target) => Some(pseudo_target), + None => Some(target.clone()) + }; event.dispatching = true; } - let type_ = event.event().type_.clone(); + let type_ = event.get().type_.clone(); let mut chain = ~[]; //TODO: no chain if not participating in a tree - if target.is_node() { - for ancestor in AbstractNode::from_eventtarget(target).ancestors() { - chain.push(AbstractEventTarget::from_node(ancestor)); + if target.get().is_node() { + let target_node: JS<Node> = NodeCast::to(target); + for ancestor in target_node.ancestors() { + let ancestor_target: JS<EventTarget> = EventTargetCast::from(&ancestor); + chain.push(ancestor_target); } } - event.mut_event().phase = Phase_Capturing; + event.get_mut().phase = Phase_Capturing; //FIXME: The "callback this value" should be currentTarget /* capturing */ - for &cur_target in chain.rev_iter() { - let stopped = match cur_target.eventtarget().get_listeners_for(type_, Capturing) { + for cur_target in chain.rev_iter() { + let stopped = match cur_target.get().get_listeners_for(type_, Capturing) { Some(listeners) => { - event.mut_event().current_target = Some(cur_target); + event.get_mut().current_target = Some(cur_target.clone()); for listener in listeners.iter() { listener.HandleEvent__(event, eReportExceptions); - if event.event().stop_immediate { + if event.get().stop_immediate { break; } } - event.propagation_stopped() + event.get().stop_propagation } None => false }; @@ -57,18 +64,18 @@ pub fn dispatch_event(target: AbstractEventTarget, } /* at target */ - if !event.propagation_stopped() { + if !event.get().stop_propagation { { - let event = event.mut_event(); + let event = event.get_mut(); event.phase = Phase_At_Target; - event.current_target = Some(target); + event.current_target = Some(target.clone()); } - let opt_listeners = target.eventtarget().get_listeners(type_); + let opt_listeners = target.get().get_listeners(type_); for listeners in opt_listeners.iter() { for listener in listeners.iter() { listener.HandleEvent__(event, eReportExceptions); - if event.event().stop_immediate { + if event.get().stop_immediate { break; } } @@ -76,22 +83,22 @@ pub fn dispatch_event(target: AbstractEventTarget, } /* bubbling */ - if event.bubbles() && !event.propagation_stopped() { - event.mut_event().phase = Phase_Bubbling; + if event.get().bubbles && !event.get().stop_propagation { + event.get_mut().phase = Phase_Bubbling; - for &cur_target in chain.iter() { - let stopped = match cur_target.eventtarget().get_listeners_for(type_, Bubbling) { + for cur_target in chain.iter() { + let stopped = match cur_target.get().get_listeners_for(type_, Bubbling) { Some(listeners) => { - event.mut_event().current_target = Some(cur_target); + event.get_mut().current_target = Some(cur_target.clone()); for listener in listeners.iter() { listener.HandleEvent__(event, eReportExceptions); - if event.event().stop_immediate { + if event.get().stop_immediate { break; } } - event.propagation_stopped() + event.get().stop_propagation } None => false }; @@ -101,7 +108,7 @@ pub fn dispatch_event(target: AbstractEventTarget, } } - let event = event.mut_event(); + let event = event.get_mut(); event.dispatching = false; event.phase = Phase_None; event.current_target = None; |