aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorYoav Alon <yoava333@gmail.com>2015-06-19 10:48:33 +0300
committerYoav Alon <yoaval@checkpoint.com>2015-06-30 14:42:38 +0300
commit3a44e143bc8d326c1e12571e7b523de49431efc4 (patch)
treef134a8b25eceed378cdd6eb5a258057435f7e2dd /components/script/dom
parent836463b9e03f441aaf213ff48c99d50d8c1be5a5 (diff)
downloadservo-3a44e143bc8d326c1e12571e7b523de49431efc4.tar.gz
servo-3a44e143bc8d326c1e12571e7b523de49431efc4.zip
add support for mouseover and mouseout events
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/document.rs59
1 files changed, 41 insertions, 18 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index d63dcd017ff..0a1c5a428c5 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -259,6 +259,9 @@ pub trait DocumentHelpers<'a> {
fn get_body_attribute(self, local_name: &Atom) -> DOMString;
fn set_body_attribute(self, local_name: &Atom, value: DOMString);
+ fn fire_mouse_event(self, point: Point2D<f32>,
+ target: &EventTarget,
+ event_name: String);
fn handle_mouse_event(self, js_runtime: *mut JSRuntime,
button: MouseButton, point: Point2D<f32>,
mouse_event_type: MouseEventType);
@@ -670,6 +673,29 @@ impl<'a> DocumentHelpers<'a> for &'a Document {
window.r().reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::MouseEvent);
}
+ fn fire_mouse_event(self,
+ point: Point2D<f32>,
+ target: &EventTarget,
+ event_name: String) {
+ let x = point.x.to_i32().unwrap_or(0);
+ let y = point.y.to_i32().unwrap_or(0);
+
+ let window = self.window.root();
+
+ let mouse_event = MouseEvent::new(window.r(),
+ event_name,
+ EventBubbles::Bubbles,
+ EventCancelable::Cancelable,
+ Some(window.r()),
+ 0i32,
+ x, y, x, y,
+ false, false, false, false,
+ 0i16,
+ None);
+ let event = EventCast::from_ref(mouse_event.r());
+ event.fire(target);
+ }
+
fn handle_mouse_move_event(self,
js_runtime: *mut JSRuntime,
point: Point2D<f32>,
@@ -688,7 +714,15 @@ impl<'a> DocumentHelpers<'a> for &'a Document {
// under the mouse.
for target in prev_mouse_over_targets.iter() {
if !mouse_over_targets.contains(target) {
- target.root().r().set_hover_state(false);
+ let target = target.root();
+ let target_ref = target.r();
+ if target_ref.get_hover_state() {
+ target_ref.set_hover_state(false);
+
+ let target = EventTargetCast::from_ref(target_ref);
+
+ self.fire_mouse_event(point, &target, "mouseout".to_owned());
+ }
}
}
@@ -700,6 +734,11 @@ impl<'a> DocumentHelpers<'a> for &'a Document {
let target_ref = target.r();
if !target_ref.get_hover_state() {
target_ref.set_hover_state(true);
+
+ let target = EventTargetCast::from_ref(target_ref);
+
+ self.fire_mouse_event(point, &target, "mouseover".to_owned());
+
}
}
@@ -708,24 +747,8 @@ impl<'a> DocumentHelpers<'a> for &'a Document {
let top_most_node =
node::from_untrusted_node_address(js_runtime, mouse_over_addresses[0]);
- let x = point.x.to_i32().unwrap_or(0);
- let y = point.y.to_i32().unwrap_or(0);
-
- let window = self.window.root();
- let mouse_event = MouseEvent::new(window.r(),
- "mousemove".to_owned(),
- EventBubbles::Bubbles,
- EventCancelable::Cancelable,
- Some(window.r()),
- 0i32,
- x, y, x, y,
- false, false, false, false,
- 0i16,
- None);
-
- let event = EventCast::from_ref(mouse_event.r());
let target = EventTargetCast::from_ref(top_most_node.r());
- event.fire(target);
+ self.fire_mouse_event(point, target, "mousemove".to_owned());
}
// Store the current mouse over targets for next frame