aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/page.rs
diff options
context:
space:
mode:
authorGlenn Watson <gw@intuitionlibrary.com>2015-02-19 09:38:29 +1000
committerGlenn Watson <gw@intuitionlibrary.com>2015-02-19 09:39:11 +1000
commit451512aa297e6de8dd6c3b272df4a70a4862e9f1 (patch)
tree2e88113f33b775cdae84f71a8edd62b560201ab8 /components/script/page.rs
parent5622366bc5d40e387114ad51fdfb3a321772351d (diff)
downloadservo-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.rs28
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
}
}