mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
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:
parent
b4e2037dbe
commit
56fbfc9d27
3 changed files with 26 additions and 8 deletions
|
@ -364,7 +364,7 @@ impl ApplicationHandler<WakerEvent> for App {
|
||||||
},
|
},
|
||||||
ref event => {
|
ref event => {
|
||||||
let response =
|
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.
|
// Update minibrowser if there's resize event to sync up with window.
|
||||||
if let WindowEvent::Resized(_) = event {
|
if let WindowEvent::Resized(_) = event {
|
||||||
minibrowser.update(
|
minibrowser.update(
|
||||||
|
|
|
@ -292,15 +292,22 @@ impl RunningAppState {
|
||||||
inner_mut.need_update = true;
|
inner_mut.need_update = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_active_dialog(&self) -> bool {
|
pub(crate) fn has_active_dialog(&self) -> bool {
|
||||||
let Some(webview) = self.focused_webview() else {
|
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;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
let inner = self.inner();
|
let inner = self.inner();
|
||||||
let Some(dialogs) = inner.dialogs.get(&webview.id()) else {
|
inner
|
||||||
return false;
|
.dialogs
|
||||||
};
|
.get(&webview_id)
|
||||||
!dialogs.is_empty()
|
.is_some_and(|dialogs| !dialogs.is_empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn get_focused_webview_index(&self) -> Option<usize> {
|
pub(crate) fn get_focused_webview_index(&self) -> Option<usize> {
|
||||||
|
|
|
@ -117,8 +117,19 @@ impl Minibrowser {
|
||||||
/// Preprocess the given [winit::event::WindowEvent], returning unconsumed for mouse events in
|
/// 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
|
/// 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.
|
/// 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);
|
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 {
|
result.consumed &= match event {
|
||||||
WindowEvent::CursorMoved { position, .. } => {
|
WindowEvent::CursorMoved { position, .. } => {
|
||||||
let scale = Scale::<_, DeviceIndependentPixel, _>::new(
|
let scale = Scale::<_, DeviceIndependentPixel, _>::new(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue