mirror of
https://github.com/servo/servo.git
synced 2025-09-29 16:19:14 +01:00
script: Ensure that leaving the WebView
sets the cursor back to the default cursor (#38759)
This changes makes a variety of changes to ensure that the cursor is set back to the default cursor when it leaves the `WebView`: 1. Display list updates can come after a mouse leaves the `WebView`, so when refreshing the cursor after the update, base the updated cursor on the last hovered location in the `DocumentEventHandler`, rather than the compositor. This allows us to catch when the last hovered position is `None` (ie the cursor has left the `WebView`). 2. When handling `MouseLeftViewport` events for the cursor leaving the entire WebView, properly set the MouseLeftViewport::focus_moving_to_another_iframe` on the input event passed to the script thread. 3. When moving out of the `WebView` entirely, explicitly ask the embedder to set the cursor back to the default. Testing: This change adds a unit test verifying this behavior. Fixes: #38710. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
66adf2bf9f
commit
4784ff0375
11 changed files with 164 additions and 90 deletions
|
@ -136,8 +136,8 @@ use embedder_traits::{
|
|||
MouseButton, MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverCommandMsg,
|
||||
WebDriverCommandResponse, WebDriverLoadStatus, WebDriverScriptCommand,
|
||||
};
|
||||
use euclid::Size2D;
|
||||
use euclid::default::Size2D as UntypedSize2D;
|
||||
use euclid::{Point2D, Size2D};
|
||||
use fonts::SystemFontServiceProxy;
|
||||
use ipc_channel::Error as IpcError;
|
||||
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
|
||||
|
@ -164,7 +164,6 @@ use servo_config::prefs::{self, PrefValue};
|
|||
use servo_config::{opts, pref};
|
||||
use servo_rand::{Rng, ServoRng, SliceRandom, random};
|
||||
use servo_url::{Host, ImmutableOrigin, ServoUrl};
|
||||
use style_traits::CSSPixel;
|
||||
#[cfg(feature = "webgpu")]
|
||||
use webgpu::swapchain::WGPUImageMap;
|
||||
#[cfg(feature = "webgpu")]
|
||||
|
@ -1465,8 +1464,8 @@ where
|
|||
EmbedderToConstellationMessage::ForwardInputEvent(webview_id, event, hit_test) => {
|
||||
self.forward_input_event(webview_id, event, hit_test);
|
||||
},
|
||||
EmbedderToConstellationMessage::RefreshCursor(pipeline_id, point) => {
|
||||
self.handle_refresh_cursor(pipeline_id, point)
|
||||
EmbedderToConstellationMessage::RefreshCursor(pipeline_id) => {
|
||||
self.handle_refresh_cursor(pipeline_id)
|
||||
},
|
||||
EmbedderToConstellationMessage::ToggleProfiler(rate, max_duration) => {
|
||||
for background_monitor_control_sender in &self.background_monitor_control_senders {
|
||||
|
@ -3440,14 +3439,14 @@ where
|
|||
}
|
||||
|
||||
#[servo_tracing::instrument(skip_all)]
|
||||
fn handle_refresh_cursor(&self, pipeline_id: PipelineId, point: Point2D<f32, CSSPixel>) {
|
||||
fn handle_refresh_cursor(&self, pipeline_id: PipelineId) {
|
||||
let Some(pipeline) = self.pipelines.get(&pipeline_id) else {
|
||||
return;
|
||||
};
|
||||
|
||||
if let Err(error) = pipeline
|
||||
.event_loop
|
||||
.send(ScriptThreadMessage::RefreshCursor(pipeline_id, point))
|
||||
.send(ScriptThreadMessage::RefreshCursor(pipeline_id))
|
||||
{
|
||||
warn!("Could not send RefreshCursor message to pipeline: {error:?}");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue