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
|
@ -98,45 +98,46 @@ impl ConstellationWebView {
|
|||
return;
|
||||
};
|
||||
|
||||
let mut update_hovered_browsing_context = |newly_hovered_browsing_context_id| {
|
||||
let old_hovered_context_id = std::mem::replace(
|
||||
&mut self.hovered_browsing_context_id,
|
||||
newly_hovered_browsing_context_id,
|
||||
);
|
||||
if old_hovered_context_id == newly_hovered_browsing_context_id {
|
||||
return;
|
||||
}
|
||||
let Some(old_hovered_context_id) = old_hovered_context_id else {
|
||||
return;
|
||||
};
|
||||
let Some(pipeline) = browsing_contexts
|
||||
.get(&old_hovered_context_id)
|
||||
.and_then(|browsing_context| pipelines.get(&browsing_context.pipeline_id))
|
||||
else {
|
||||
return;
|
||||
};
|
||||
let mut update_hovered_browsing_context =
|
||||
|newly_hovered_browsing_context_id, focus_moving_to_another_iframe: bool| {
|
||||
let old_hovered_context_id = std::mem::replace(
|
||||
&mut self.hovered_browsing_context_id,
|
||||
newly_hovered_browsing_context_id,
|
||||
);
|
||||
if old_hovered_context_id == newly_hovered_browsing_context_id {
|
||||
return;
|
||||
}
|
||||
let Some(old_hovered_context_id) = old_hovered_context_id else {
|
||||
return;
|
||||
};
|
||||
let Some(pipeline) = browsing_contexts
|
||||
.get(&old_hovered_context_id)
|
||||
.and_then(|browsing_context| pipelines.get(&browsing_context.pipeline_id))
|
||||
else {
|
||||
return;
|
||||
};
|
||||
|
||||
let mut synthetic_mouse_leave_event = event.clone();
|
||||
synthetic_mouse_leave_event.event =
|
||||
InputEvent::MouseLeftViewport(MouseLeftViewportEvent {
|
||||
focus_moving_to_another_iframe: true,
|
||||
});
|
||||
let mut synthetic_mouse_leave_event = event.clone();
|
||||
synthetic_mouse_leave_event.event =
|
||||
InputEvent::MouseLeftViewport(MouseLeftViewportEvent {
|
||||
focus_moving_to_another_iframe,
|
||||
});
|
||||
|
||||
let _ = pipeline
|
||||
.event_loop
|
||||
.send(ScriptThreadMessage::SendInputEvent(
|
||||
pipeline.id,
|
||||
synthetic_mouse_leave_event,
|
||||
));
|
||||
};
|
||||
let _ = pipeline
|
||||
.event_loop
|
||||
.send(ScriptThreadMessage::SendInputEvent(
|
||||
pipeline.id,
|
||||
synthetic_mouse_leave_event,
|
||||
));
|
||||
};
|
||||
|
||||
if let InputEvent::MouseLeftViewport(_) = &event.event {
|
||||
update_hovered_browsing_context(None);
|
||||
update_hovered_browsing_context(None, false);
|
||||
return;
|
||||
}
|
||||
|
||||
if let InputEvent::MouseMove(_) = &event.event {
|
||||
update_hovered_browsing_context(Some(pipeline.browsing_context_id));
|
||||
update_hovered_browsing_context(Some(pipeline.browsing_context_id), true);
|
||||
self.last_mouse_move_point = event
|
||||
.hit_test_result
|
||||
.as_ref()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue