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).
This commit is contained in:
Glenn Watson 2015-02-19 09:38:29 +10:00
parent 5622366bc5
commit 451512aa29
2 changed files with 78 additions and 93 deletions

View file

@ -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
}
}