aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-02-22 09:36:46 -0700
committerbors-servo <metajack+bors@gmail.com>2015-02-22 09:36:46 -0700
commite68d6d2924bf2f6f762e2dc50b75fc32c0eafe16 (patch)
tree1e1051324daa636ff6ac46573b3f9efc99b47fc5
parent92620c0a5f3bf01ddfb2f52fb89cdc467ff4a761 (diff)
parent957c89b101a5a0c58ad90e091caf9bba436ac184 (diff)
downloadservo-e68d6d2924bf2f6f762e2dc50b75fc32c0eafe16.tar.gz
servo-e68d6d2924bf2f6f762e2dc50b75fc32c0eafe16.zip
auto merge of #5004 : Ms2ger/servo/handle_click_event, r=jdm
-rw-r--r--components/script/dom/document.rs83
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 => {}
}
}