From 0ac8f80f649f12a2cd6cef5085e60fe9f6b3bd37 Mon Sep 17 00:00:00 2001 From: aiongg Date: Fri, 23 Oct 2026 17:55:03 +0000 Subject: [PATCH] docking: a loaded layout's monitor and monitor size are validated --- crates/ui/src/docking/model.rs | 14 ++++++++++---- crates/ui/src/docking/model_tests.rs | 6 ++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/ui/src/docking/model.rs b/crates/ui/src/docking/model.rs index 145bc888..a5c5c97f 100644 --- a/crates/ui/src/docking/model.rs +++ b/crates/ui/src/docking/model.rs @@ -540,6 +540,11 @@ pub(super) fn valid_rect(rect: [f32; 4]) -> bool { rect.iter().all(|v| v.is_finite() && v.abs() <= MAX_EXTENT) && rect.get(2).is_some_and(|v| *v > 0.0) && rect.get(3).is_some_and(|v| *v > 0.0) } +/// A floating window's saved monitor and monitor size, each where given. +fn valid_monitor(monitor: Option<&Monitor>, monitor_size: Option<[f32; 2]>) -> bool { + monitor.is_none_or(|m| valid_rect(m.rect) && m.scale.is_finite() && m.scale > 0.0) && monitor_size.is_none_or(|[w, h]| valid_rect([0.0, 0.0, w, h])) +} + pub(super) fn valid_width(width: f32) -> bool { width.is_finite() && width > 0.0 && width <= MAX_EXTENT } @@ -615,7 +620,10 @@ impl Layout

{ } } for floating in &self.floating { - if !valid_rect(floating.rect) || floating.native.is_some_and(|r| !valid_rect(r)) { + if !valid_rect(floating.rect) + || floating.native.is_some_and(|r| !valid_rect(r)) + || !valid_monitor(floating.monitor.as_ref(), floating.monitor_size) + { return Err(DockError::InvalidGeometry); } let mut visit = vec![(&floating.root, 1usize)]; @@ -1180,9 +1188,7 @@ impl Layout

{ Ok(()) } Action::SetMonitor { panel, monitor, monitor_size } => { - let valid = monitor.as_ref().is_none_or(|m| valid_rect(m.rect) && m.scale.is_finite() && m.scale > 0.0) - && monitor_size.is_none_or(|[w, h]| valid_rect([0.0, 0.0, w, h])); - if !valid { + if !valid_monitor(monitor.as_ref(), monitor_size) { return Err(DockError::InvalidGeometry); } let window = self.floating.iter_mut().find(|g| g.contains(&panel)).ok_or(DockError::InvalidPlacement)?; diff --git a/crates/ui/src/docking/model_tests.rs b/crates/ui/src/docking/model_tests.rs index 11f3fcde..792d64da 100644 --- a/crates/ui/src/docking/model_tests.rs +++ b/crates/ui/src/docking/model_tests.rs @@ -275,6 +275,12 @@ fn dock_validation_rejects_two_docks_per_side_nested_docks_empty_columns_and_bad let mut native = docked(); native.floating[0].native = Some([0.0, 0.0, -1.0, 10.0]); assert_eq!(native.validate(), Err(DockError::InvalidGeometry)); + let mut monitor = docked(); + monitor.floating[0].monitor = Some(super::Monitor { name: None, rect: [0.0, 0.0, 1920.0, 1080.0], scale: f32::NAN }); + assert_eq!(monitor.validate(), Err(DockError::InvalidGeometry)); + let mut monitor_size = docked(); + monitor_size.floating[0].monitor_size = Some([f32::NAN, 1080.0]); + assert_eq!(monitor_size.validate(), Err(DockError::InvalidGeometry)); let mut layout = docked(); assert_eq!(layout.apply(Action::ResizeColumn { panel: 2, width: f32::NAN }), Err(DockError::InvalidGeometry)); assert_eq!(layout.apply(Action::ResizeColumn { panel: 11, width: 50.0 }), Err(DockError::InvalidPlacement));