diff options
author | Glenn Watson <gw@intuitionlibrary.com> | 2015-02-19 09:38:29 +1000 |
---|---|---|
committer | Glenn Watson <gw@intuitionlibrary.com> | 2015-02-19 09:39:11 +1000 |
commit | 451512aa297e6de8dd6c3b272df4a70a4862e9f1 (patch) | |
tree | 2e88113f33b775cdae84f71a8edd62b560201ab8 /components/script/page.rs | |
parent | 5622366bc5d40e387114ad51fdfb3a321772351d (diff) | |
download | servo-451512aa297e6de8dd6c3b272df4a70a4862e9f1.tar.gz servo-451512aa297e6de8dd6c3b272df4a70a4862e9f1.zip |
Fixes a number of issues with setting hover state, and simplifies the code.
Specifically:
- Use inclusive_ancestors instead of ancestors, to detect hover on elements like divs.
- Send the mousemove event after all the hover states have been set correctly.
- Correctly handle removing hover state from elements when mouse is not over any elements.
- Correctly detect when a reflow is required (previous code failed in several edge cases).
Diffstat (limited to 'components/script/page.rs')
-rw-r--r-- | components/script/page.rs | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/components/script/page.rs b/components/script/page.rs index b369a5e3337..c7ea2e44bec 100644 --- a/components/script/page.rs +++ b/components/script/page.rs @@ -436,23 +436,23 @@ impl Page { address } - pub fn get_nodes_under_mouse(&self, point: &Point2D<f32>) -> Option<Vec<UntrustedNodeAddress>> { + pub fn get_nodes_under_mouse(&self, point: &Point2D<f32>) -> Vec<UntrustedNodeAddress> { + let mut results = vec!(); let frame = self.frame(); let document = frame.as_ref().unwrap().document.root(); - let root = match document.r().GetDocumentElement().root() { - None => return None, - Some(root) => root, - }; - let root: JSRef<Node> = NodeCast::from_ref(root.r()); - let address = match self.layout().mouse_over(root.to_trusted_node_address(), *point) { - Ok(MouseOverResponse(node_address)) => { - Some(node_address) + match document.r().GetDocumentElement().root() { + Some(root) => { + let root: JSRef<Node> = NodeCast::from_ref(root.r()); + match self.layout().mouse_over(root.to_trusted_node_address(), *point) { + Ok(MouseOverResponse(node_addresses)) => { + results = node_addresses; + } + Err(()) => {} + }; } - Err(()) => { - None - } - }; - address + None => {} + } + results } } |