diff options
author | Tetsuharu OHZEKI <saneyuki.snyk@gmail.com> | 2014-04-23 03:18:05 +0900 |
---|---|---|
committer | Tetsuharu OHZEKI <saneyuki.snyk@gmail.com> | 2014-04-24 14:37:04 +0900 |
commit | fff94a35b3b603e50d70555712e57644a0b61d14 (patch) | |
tree | 9d74b889f1788c51c34d9cdcd7f95e8fa494db9c /src/components/script/script_task.rs | |
parent | 7d511f4bafdfbf765e1895ceaf265bb005ab98fe (diff) | |
download | servo-fff94a35b3b603e50d70555712e57644a0b61d14.tar.gz servo-fff94a35b3b603e50d70555712e57644a0b61d14.zip |
Add Page::hit_test().
Diffstat (limited to 'src/components/script/script_task.rs')
-rw-r--r-- | src/components/script/script_task.rs | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index f608a648518..7e8c8eca384 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -26,6 +26,7 @@ use layout_interface::{DocumentDamageLevel, HitTestQuery, HitTestResponse, Layou use layout_interface::{LayoutChan, MatchSelectorsDocumentDamage, QueryMsg}; use layout_interface::{Reflow, ReflowDocumentDamage, ReflowForDisplay, ReflowGoal, ReflowMsg}; use layout_interface::ContentChangedDocumentDamage; +use layout_interface::UntrustedNodeAddress; use layout_interface; use geom::point::Point2D; @@ -435,6 +436,27 @@ impl Page { js_context: Untraceable::new(js_context), }); } + + pub fn hit_test(&self, point: &Point2D<f32>) -> Option<UntrustedNodeAddress> { + let frame = self.frame(); + let document = frame.get_ref().document.clone(); + let root = document.get().GetDocumentElement(); + if root.is_none() { + return None; + } + let root: JS<Node> = NodeCast::from(&root.unwrap()); + let (chan, port) = channel(); + let address = match self.query_layout(HitTestQuery(root.to_trusted_node_address(), *point, chan), port) { + Ok(HitTestResponse(node_address)) => { + Some(node_address) + } + Err(()) => { + debug!("layout query error"); + None + } + }; + address + } } /// Information for one frame in the browsing context. @@ -1031,17 +1053,8 @@ impl ScriptTask { ClickEvent(_button, point) => { debug!("ClickEvent: clicked at {:?}", point); - - let frame = page.frame(); - let document = frame.get_ref().document.clone(); - let root = document.get().GetDocumentElement(); - if root.is_none() { - return; - } - let (chan, port) = channel(); - let root: JS<Node> = NodeCast::from(&root.unwrap()); - match page.query_layout(HitTestQuery(root.to_trusted_node_address(), point, chan), port) { - Ok(HitTestResponse(node_address)) => { + match page.hit_test(&point) { + Some(node_address) => { debug!("node address is {:?}", node_address); let mut node: JS<Node> = NodeHelpers::from_untrusted_node_address(self.js_runtime.deref().ptr, @@ -1063,8 +1076,8 @@ impl ScriptTask { self.load_url_from_element(page, &element) } } - }, - Err(()) => debug!("layout query error"), + } + None => {} } } MouseDownEvent(..) => {} |