diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-02-22 09:36:46 -0700 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-02-22 09:36:46 -0700 |
commit | e68d6d2924bf2f6f762e2dc50b75fc32c0eafe16 (patch) | |
tree | 1e1051324daa636ff6ac46573b3f9efc99b47fc5 | |
parent | 92620c0a5f3bf01ddfb2f52fb89cdc467ff4a761 (diff) | |
parent | 957c89b101a5a0c58ad90e091caf9bba436ac184 (diff) | |
download | servo-e68d6d2924bf2f6f762e2dc50b75fc32c0eafe16.tar.gz servo-e68d6d2924bf2f6f762e2dc50b75fc32c0eafe16.zip |
auto merge of #5004 : Ms2ger/servo/handle_click_event, r=jdm
-rw-r--r-- | components/script/dom/document.rs | 83 |
1 files changed, 42 insertions, 41 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index d13d5b6c259..6673d14fe9a 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -400,52 +400,53 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { let window = self.window.root(); let window = window.r(); let page = window.page(); - match page.hit_test(&point) { + let node = match page.hit_test(&point) { Some(node_address) => { debug!("node address is {:?}", node_address.0); + node::from_untrusted_node_address(js_runtime, node_address) + }, + None => return, + }.root(); + + let el = match ElementCast::to_ref(node.r()) { + Some(el) => el, + None => { + let ancestor = node.r() + .ancestors() + .filter_map(ElementCast::to_ref) + .next(); + match ancestor { + Some(ancestor) => ancestor, + None => return, + } + }, + }; - let temp_node = - node::from_untrusted_node_address( - js_runtime, node_address).root(); - - let maybe_elem: Option<JSRef<Element>> = ElementCast::to_ref(temp_node.r()); - let maybe_node = match maybe_elem { - Some(element) => Some(element), - None => temp_node.r().ancestors().filter_map(ElementCast::to_ref).next(), - }; + let node: JSRef<Node> = NodeCast::from_ref(el); + debug!("clicked on {:?}", node.debug_str()); + // Prevent click event if form control element is disabled. + if node.click_event_filter_by_disabled_state() { + return; + } - match maybe_node { - Some(el) => { - let node: JSRef<Node> = NodeCast::from_ref(el); - debug!("clicked on {:?}", node.debug_str()); - // Prevent click event if form control element is disabled. - if node.click_event_filter_by_disabled_state() { return; } - match *page.frame() { - Some(ref frame) => { - let window = frame.window.root(); - let doc = window.r().Document().root(); - doc.r().begin_focus_transaction(); - - let event = - Event::new(GlobalRef::Window(window.r()), - "click".to_owned(), - EventBubbles::Bubbles, - EventCancelable::Cancelable).root(); - // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#trusted-events - event.r().set_trusted(true); - // https://html.spec.whatwg.org/multipage/interaction.html#run-authentic-click-activation-steps - el.authentic_click_activation(event.r()); - - doc.r().commit_focus_transaction(); - window.r().flush_layout(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery); - } - None => {} - } - } - None => {} - } + match *page.frame() { + Some(ref frame) => { + let window = frame.window.root(); + let doc = window.r().Document().root(); + doc.r().begin_focus_transaction(); + + let event = Event::new(GlobalRef::Window(window.r()), + "click".to_owned(), + EventBubbles::Bubbles, + EventCancelable::Cancelable).root(); + // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#trusted-events + event.r().set_trusted(true); + // https://html.spec.whatwg.org/multipage/interaction.html#run-authentic-click-activation-steps + el.authentic_click_activation(event.r()); + + doc.r().commit_focus_transaction(); + window.r().flush_layout(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery); } - None => {} } } |