Blocks all background webview interactions when a dialog is open (#35671)

Signed-off-by: L Ashwin B <lashwinib@gmail.com>
This commit is contained in:
chickenleaf 2025-02-26 16:48:51 +05:30 committed by GitHub
parent b4e2037dbe
commit 56fbfc9d27
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 8 deletions

View file

@ -364,7 +364,7 @@ impl ApplicationHandler<WakerEvent> for App {
},
ref event => {
let response =
minibrowser.on_window_event(window.winit_window().unwrap(), event);
minibrowser.on_window_event(window.winit_window().unwrap(), state, event);
// Update minibrowser if there's resize event to sync up with window.
if let WindowEvent::Resized(_) = event {
minibrowser.update(

View file

@ -292,15 +292,22 @@ impl RunningAppState {
inner_mut.need_update = true;
}
fn has_active_dialog(&self) -> bool {
let Some(webview) = self.focused_webview() else {
pub(crate) fn has_active_dialog(&self) -> bool {
let last_created_webview_id = self.inner().creation_order.last().cloned();
let Some(webview_id) = self
.focused_webview()
.as_ref()
.map(WebView::id)
.or(last_created_webview_id)
else {
return false;
};
let inner = self.inner();
let Some(dialogs) = inner.dialogs.get(&webview.id()) else {
return false;
};
!dialogs.is_empty()
inner
.dialogs
.get(&webview_id)
.is_some_and(|dialogs| !dialogs.is_empty())
}
pub(crate) fn get_focused_webview_index(&self) -> Option<usize> {

View file

@ -117,8 +117,19 @@ impl Minibrowser {
/// Preprocess the given [winit::event::WindowEvent], returning unconsumed for mouse events in
/// the Servo browser rect. This is needed because the CentralPanel we create for our webview
/// would otherwise make egui report events in that area as consumed.
pub fn on_window_event(&mut self, window: &Window, event: &WindowEvent) -> EventResponse {
pub fn on_window_event(
&mut self,
window: &Window,
app_state: &RunningAppState,
event: &WindowEvent,
) -> EventResponse {
let mut result = self.context.on_window_event(window, event);
if app_state.has_active_dialog() {
result.consumed = true;
return result;
}
result.consumed &= match event {
WindowEvent::CursorMoved { position, .. } => {
let scale = Scale::<_, DeviceIndependentPixel, _>::new(