diff --git a/packages/core/src/compute_position.rs b/packages/core/src/compute_position.rs index 8cf6fc2..30551ce 100644 --- a/packages/core/src/compute_position.rs +++ b/packages/core/src/compute_position.rs @@ -6,6 +6,9 @@ use crate::types::{ MiddlewareReturn, MiddlewareState, Reset, ResetRects, }; +/// Maximum number of resets that can occur before bailing to avoid infinite reset loops. +const MAX_RESET_COUNT: i32 = 50; + /// Computes the `x` and `y` coordinates that will place the floating element next to a given reference element. /// /// This export does not have any `platform` interface logic. You will need to write one for the platform you are using Floating UI with. @@ -87,7 +90,7 @@ pub fn compute_position( } if let Some(reset) = reset - && reset_count <= 50 + && reset_count < MAX_RESET_COUNT { reset_count += 1; diff --git a/packages/core/src/middleware/auto_placement.rs b/packages/core/src/middleware/auto_placement.rs index 27c1a7b..102de9c 100644 --- a/packages/core/src/middleware/auto_placement.rs +++ b/packages/core/src/middleware/auto_placement.rs @@ -5,7 +5,7 @@ use floating_ui_utils::{ use serde::{Deserialize, Serialize}; use crate::{ - detect_overflow::{DetectOverflowOptions, detect_overflow}, + detect_overflow::DetectOverflowOptions, types::{ Derivable, DerivableFn, Middleware, MiddlewareReturn, MiddlewareState, MiddlewareWithOptions, Reset, ResetValue, @@ -236,7 +236,7 @@ impl Middleware Middleware Middleware { - let overflow = detect_overflow( + let overflow = platform.detect_overflow( MiddlewareState { elements: elements.clone(), ..state @@ -168,7 +171,7 @@ impl Middleware { - let overflow = detect_overflow( + let overflow = platform.detect_overflow( MiddlewareState { elements: elements.clone(), ..state diff --git a/packages/core/src/middleware/shift.rs b/packages/core/src/middleware/shift.rs index c9570f0..370a215 100644 --- a/packages/core/src/middleware/shift.rs +++ b/packages/core/src/middleware/shift.rs @@ -5,7 +5,7 @@ use floating_ui_utils::{Axis, Coords, Side, clamp, get_opposite_axis, get_side_a use serde::{Deserialize, Serialize}; use crate::{ - detect_overflow::{DetectOverflowOptions, detect_overflow}, + detect_overflow::DetectOverflowOptions, middleware::{OFFSET_NAME, OffsetData}, types::{ Derivable, DerivableFn, Middleware, MiddlewareReturn, MiddlewareState, @@ -166,7 +166,11 @@ impl let options = self.options.evaluate(state.clone()); let MiddlewareState { - x, y, placement, .. + x, + y, + placement, + platform, + .. } = state; let check_main_axis = options.main_axis.unwrap_or(true); @@ -175,7 +179,7 @@ impl let limiter = options.limiter.unwrap_or(Box::::default()); let coords = Coords { x, y }; - let overflow = detect_overflow( + let overflow = platform.detect_overflow( MiddlewareState { elements: state.elements.clone(), ..state diff --git a/packages/core/src/middleware/size.rs b/packages/core/src/middleware/size.rs index f8dd030..634c362 100644 --- a/packages/core/src/middleware/size.rs +++ b/packages/core/src/middleware/size.rs @@ -3,7 +3,7 @@ use std::ptr; use floating_ui_utils::{Alignment, Axis, Rect, Side, get_side_axis}; use crate::{ - detect_overflow::{DetectOverflowOptions, detect_overflow}, + detect_overflow::DetectOverflowOptions, middleware::shift::{SHIFT_NAME, ShiftData}, types::{ Derivable, DerivableFn, Middleware, MiddlewareReturn, MiddlewareState, @@ -142,7 +142,7 @@ impl Middleware for TestPlatform { height: 10.0, } } + + fn detect_overflow( + &self, + state: MiddlewareState, + options: DetectOverflowOptions, + ) -> SideObject { + detect_overflow(state, options) + } } pub const PLATFORM: TestPlatform = TestPlatform {}; diff --git a/packages/core/src/types.rs b/packages/core/src/types.rs index 911f5c8..229fac8 100644 --- a/packages/core/src/types.rs +++ b/packages/core/src/types.rs @@ -6,9 +6,11 @@ use serde::{Serialize, de::DeserializeOwned}; use floating_ui_utils::{ ClientRectObject, Coords, Dimensions, ElementOrVirtual, ElementOrWindow, ElementRects, Length, - OwnedElementOrWindow, Placement, Rect, Strategy, + OwnedElementOrWindow, Placement, Rect, SideObject, Strategy, }; +use crate::detect_overflow::DetectOverflowOptions; + pub type DerivableFn<'a, Element, Window, T> = &'a dyn Fn(MiddlewareState) -> T; pub enum Derivable<'a, Element: Clone + 'static, Window: Clone, T: Clone> { @@ -133,6 +135,12 @@ pub trait Platform: Debug { fn get_client_length(&self, _element: &Element, _length: Length) -> Option { None } + + fn detect_overflow( + &self, + state: MiddlewareState, + options: DetectOverflowOptions, + ) -> SideObject; } /// Data stored by middleware. diff --git a/packages/dom/src/platform.rs b/packages/dom/src/platform.rs index f6e2025..8bfb4bb 100644 --- a/packages/dom/src/platform.rs +++ b/packages/dom/src/platform.rs @@ -9,12 +9,14 @@ pub mod get_scale; pub mod is_rtl; use floating_ui_core::{ - ConvertOffsetParentRelativeRectToViewportRelativeRectArgs, GetClippingRectArgs, - GetElementRectsArgs, Platform as CorePlatform, + ConvertOffsetParentRelativeRectToViewportRelativeRectArgs, DetectOverflowOptions, + GetClippingRectArgs, GetElementRectsArgs, MiddlewareState, Platform as CorePlatform, + detect_overflow, }; use floating_ui_utils::dom::get_document_element; use floating_ui_utils::{ ClientRectObject, Coords, Dimensions, ElementRects, Length, OwnedElementOrWindow, Rect, + SideObject, }; use web_sys::{Element, Window}; @@ -79,4 +81,12 @@ impl CorePlatform for Platform { fn get_client_length(&self, element: &Element, length: Length) -> Option { Some(get_client_length(element, length)) } + + fn detect_overflow( + &self, + state: MiddlewareState, + options: DetectOverflowOptions, + ) -> SideObject { + detect_overflow(state, options) + } } diff --git a/upstream.toml b/upstream.toml index 612be1b..a40c653 100644 --- a/upstream.toml +++ b/upstream.toml @@ -1,5 +1,5 @@ [releases] -core = "1.7.3" +core = "1.7.5" dom = "1.7.4" utils = "0.2.11" vue = "1.1.9"