From 494493ceb74592406be7ef2ec513794ddaec6577 Mon Sep 17 00:00:00 2001 From: Euclid Ye Date: Fri, 15 Aug 2025 17:54:54 +0800 Subject: [PATCH] Rename `InputEvent::MouseLeave` to `InputEvent::MouseLeftViewport` (#38695) 1. `InputEvent::MouseLeave` indicates that mouse has left the viewport (fired by embedder) or iframe (synthesized in Constellation https://github.com/servo/servo/blob/f24f225db8b234c0545c57e80356af84e42bcb4b/components/constellation/constellation_webview.rs#L119-L122). Its handler in script is named as `handle_mouse_leave_event`, which is very misleading as we have DOM event [mouseleave](https://w3c.github.io/uievents/#event-type-mouseleave). I rename it to `MouseLeftViewport` to be consistent with `WindowEvent::CursorLeft`: https://github.com/servo/servo/blob/f24f225db8b234c0545c57e80356af84e42bcb4b/ports/servoshell/desktop/headed_window.rs#L632-L638 2. Add doc and rename function, such as `handle_mouse_move_event` to `handle_native_mouse_move_event` to be closer to [spec](https://w3c.github.io/uievents/#handle-native-mouse-move). Testing: Just renaming + skipping unnecessary hit-test in simple case. Fixes: Nothing but preparing for #38670 and #38435. --------- Signed-off-by: Euclid Ye --- components/compositing/webview_renderer.rs | 2 +- .../constellation/constellation_webview.rs | 13 ++++++----- components/constellation/tracing.rs | 2 +- .../script/dom/document_event_handler.rs | 23 ++++++++++--------- components/shared/embedder/input_events.rs | 10 ++++---- ports/servoshell/desktop/headed_window.rs | 10 +++++--- 6 files changed, 33 insertions(+), 27 deletions(-) diff --git a/components/compositing/webview_renderer.rs b/components/compositing/webview_renderer.rs index c415b8cafee..b4380aa2cb7 100644 --- a/components/compositing/webview_renderer.rs +++ b/components/compositing/webview_renderer.rs @@ -355,7 +355,7 @@ impl WebViewRenderer { InputEvent::MouseMove(_) => { self.global.borrow_mut().last_mouse_move_position = event_point; }, - InputEvent::MouseLeave(_) => { + InputEvent::MouseLeftViewport(_) => { self.global.borrow_mut().last_mouse_move_position = None; }, InputEvent::MouseButton(_) | InputEvent::Wheel(_) => {}, diff --git a/components/constellation/constellation_webview.rs b/components/constellation/constellation_webview.rs index 14e7cf774dd..67f9bf276ff 100644 --- a/components/constellation/constellation_webview.rs +++ b/components/constellation/constellation_webview.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; use base::id::{BrowsingContextId, PipelineId}; -use embedder_traits::{InputEvent, MouseLeaveEvent, Theme}; +use embedder_traits::{InputEvent, MouseLeftViewportEvent, Theme}; use euclid::Point2D; use log::warn; use script_traits::{ConstellationInputEvent, ScriptThreadMessage}; @@ -72,7 +72,7 @@ impl ConstellationWebView { // If there's no hit test, send the event to either the hovered or focused browsing context, // depending on the event type. - let browsing_context_id = if matches!(event.event, InputEvent::MouseLeave(_)) { + let browsing_context_id = if matches!(event.event, InputEvent::MouseLeftViewport(_)) { self.hovered_browsing_context_id .unwrap_or(self.focused_browsing_context_id) } else { @@ -117,9 +117,10 @@ impl ConstellationWebView { }; let mut synthetic_mouse_leave_event = event.clone(); - synthetic_mouse_leave_event.event = InputEvent::MouseLeave(MouseLeaveEvent { - focus_moving_to_another_iframe: true, - }); + synthetic_mouse_leave_event.event = + InputEvent::MouseLeftViewport(MouseLeftViewportEvent { + focus_moving_to_another_iframe: true, + }); let _ = pipeline .event_loop @@ -129,7 +130,7 @@ impl ConstellationWebView { )); }; - if let InputEvent::MouseLeave(_) = &event.event { + if let InputEvent::MouseLeftViewport(_) = &event.event { update_hovered_browsing_context(None); return; } diff --git a/components/constellation/tracing.rs b/components/constellation/tracing.rs index 15c856f00a2..4464472e118 100644 --- a/components/constellation/tracing.rs +++ b/components/constellation/tracing.rs @@ -96,7 +96,7 @@ mod from_compositor { InputEvent::Keyboard(..) => target_variant!("Keyboard"), InputEvent::MouseButton(..) => target_variant!("MouseButton"), InputEvent::MouseMove(..) => target_variant!("MouseMove"), - InputEvent::MouseLeave(..) => target_variant!("MouseLeave"), + InputEvent::MouseLeftViewport(..) => target_variant!("MouseLeftViewport"), InputEvent::Touch(..) => target_variant!("Touch"), InputEvent::Wheel(..) => target_variant!("Wheel"), InputEvent::Scroll(..) => target_variant!("Scroll"), diff --git a/components/script/dom/document_event_handler.rs b/components/script/dom/document_event_handler.rs index eba4e6f7e9b..f1015d07829 100644 --- a/components/script/dom/document_event_handler.rs +++ b/components/script/dom/document_event_handler.rs @@ -14,7 +14,7 @@ use embedder_traits::{ Cursor, EditingActionEvent, EmbedderMsg, GamepadEvent as EmbedderGamepadEvent, GamepadSupportedHapticEffects, GamepadUpdateType, ImeEvent, InputEvent, KeyboardEvent as EmbedderKeyboardEvent, MouseButton, MouseButtonAction, MouseButtonEvent, - MouseLeaveEvent, ScrollEvent, TouchEvent as EmbedderTouchEvent, TouchEventType, TouchId, + MouseLeftViewportEvent, ScrollEvent, TouchEvent as EmbedderTouchEvent, TouchEventType, TouchId, UntrustedNodeAddress, WheelEvent as EmbedderWheelEvent, }; use euclid::Point2D; @@ -160,13 +160,13 @@ impl DocumentEventHandler { match event.event.clone() { InputEvent::MouseButton(mouse_button_event) => { - self.handle_mouse_button_event(mouse_button_event, &event, can_gc); + self.handle_native_mouse_button_event(mouse_button_event, &event, can_gc); }, InputEvent::MouseMove(_) => { - self.handle_mouse_move_event(&event, can_gc); + self.handle_native_mouse_move_event(&event, can_gc); }, - InputEvent::MouseLeave(mouse_leave_event) => { - self.handle_mouse_leave_event(&event, &mouse_leave_event, can_gc); + InputEvent::MouseLeftViewport(mouse_leave_event) => { + self.handle_mouse_left_viewport_event(&event, &mouse_leave_event, can_gc); }, InputEvent::Touch(touch_event) => { self.handle_touch_event(touch_event, &event, can_gc); @@ -221,10 +221,10 @@ impl DocumentEventHandler { .send_to_embedder(EmbedderMsg::SetCursor(self.window.webview_id(), cursor)); } - fn handle_mouse_leave_event( + fn handle_mouse_left_viewport_event( &self, input_event: &ConstellationInputEvent, - mouse_leave_event: &MouseLeaveEvent, + mouse_leave_event: &MouseLeftViewportEvent, can_gc: CanGc, ) { if let Some(current_hover_target) = self.current_hover_target.get() { @@ -328,7 +328,8 @@ impl DocumentEventHandler { } } - fn handle_mouse_move_event(&self, input_event: &ConstellationInputEvent, can_gc: CanGc) { + /// + fn handle_native_mouse_move_event(&self, input_event: &ConstellationInputEvent, can_gc: CanGc) { // Ignore all incoming events without a hit test. let Some(hit_test_result) = self.window.hit_test_from_input_event(input_event) else { return; @@ -349,8 +350,7 @@ impl DocumentEventHandler { let target_has_changed = self .current_hover_target .get() - .as_ref() - .is_none_or(|old_target| old_target != &new_target); + .is_none_or(|old_target| old_target != new_target); // Here we know the target has changed, so we must update the state, // dispatch mouseout to the previous one, mouseover to the new one. @@ -503,7 +503,8 @@ impl DocumentEventHandler { } /// - fn handle_mouse_button_event( + /// Handles native mouse down, mouse up, mouse click. + fn handle_native_mouse_button_event( &self, event: MouseButtonEvent, input_event: &ConstellationInputEvent, diff --git a/components/shared/embedder/input_events.rs b/components/shared/embedder/input_events.rs index cdb6a2e7892..d773c56e2c0 100644 --- a/components/shared/embedder/input_events.rs +++ b/components/shared/embedder/input_events.rs @@ -20,7 +20,7 @@ pub enum InputEvent { Keyboard(KeyboardEvent), MouseButton(MouseButtonEvent), MouseMove(MouseMoveEvent), - MouseLeave(MouseLeaveEvent), + MouseLeftViewport(MouseLeftViewportEvent), Touch(TouchEvent), Wheel(WheelEvent), Scroll(ScrollEvent), @@ -43,7 +43,7 @@ impl InputEvent { InputEvent::Keyboard(..) => None, InputEvent::MouseButton(event) => Some(event.point), InputEvent::MouseMove(event) => Some(event.point), - InputEvent::MouseLeave(_) => None, + InputEvent::MouseLeftViewport(_) => None, InputEvent::Touch(event) => Some(event.point), InputEvent::Wheel(event) => Some(event.point), InputEvent::Scroll(..) => None, @@ -58,7 +58,7 @@ impl InputEvent { InputEvent::Keyboard(event) => event.webdriver_id, InputEvent::MouseButton(event) => event.webdriver_id, InputEvent::MouseMove(event) => event.webdriver_id, - InputEvent::MouseLeave(..) => None, + InputEvent::MouseLeftViewport(..) => None, InputEvent::Touch(..) => None, InputEvent::Wheel(event) => event.webdriver_id, InputEvent::Scroll(..) => None, @@ -79,7 +79,7 @@ impl InputEvent { InputEvent::MouseMove(ref mut event) => { event.webdriver_id = webdriver_id; }, - InputEvent::MouseLeave(..) => {}, + InputEvent::MouseLeftViewport(..) => {}, InputEvent::Touch(..) => {}, InputEvent::Wheel(ref mut event) => { event.webdriver_id = webdriver_id; @@ -219,7 +219,7 @@ impl MouseMoveEvent { } #[derive(Clone, Copy, Debug, Default, Deserialize, Serialize)] -pub struct MouseLeaveEvent { +pub struct MouseLeftViewportEvent { pub focus_moving_to_another_iframe: bool, } diff --git a/ports/servoshell/desktop/headed_window.rs b/ports/servoshell/desktop/headed_window.rs index 8e9cc88ec42..dab3782b372 100644 --- a/ports/servoshell/desktop/headed_window.rs +++ b/ports/servoshell/desktop/headed_window.rs @@ -25,7 +25,7 @@ use servo::webrender_api::ScrollLocation; use servo::webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePixel}; use servo::{ Cursor, ImeEvent, InputEvent, Key, KeyState, KeyboardEvent, Modifiers, - MouseButton as ServoMouseButton, MouseButtonAction, MouseButtonEvent, MouseLeaveEvent, + MouseButton as ServoMouseButton, MouseButtonAction, MouseButtonEvent, MouseLeftViewportEvent, MouseMoveEvent, NamedKey, OffscreenRenderingContext, RenderingContext, ScreenGeometry, Theme, TouchEvent, TouchEventType, TouchId, WebRenderDebugOption, WebView, WheelDelta, WheelEvent, WheelMode, WindowRenderingContext, @@ -628,7 +628,9 @@ impl WindowPortsMethods for Window { if webview.rect().contains(point) { webview.notify_input_event(InputEvent::MouseMove(MouseMoveEvent::new(point))); } else if webview.rect().contains(previous_point) { - webview.notify_input_event(InputEvent::MouseLeave(MouseLeaveEvent::default())); + webview.notify_input_event(InputEvent::MouseLeftViewport( + MouseLeftViewportEvent::default(), + )); } self.webview_relative_mouse_point.set(point); @@ -638,7 +640,9 @@ impl WindowPortsMethods for Window { .rect() .contains(self.webview_relative_mouse_point.get()) { - webview.notify_input_event(InputEvent::MouseLeave(MouseLeaveEvent::default())); + webview.notify_input_event(InputEvent::MouseLeftViewport( + MouseLeftViewportEvent::default(), + )); } }, WindowEvent::MouseWheel { delta, .. } => {