diff options
author | Oriol Brufau <obrufau@igalia.com> | 2025-04-17 08:36:05 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-17 15:36:05 +0000 |
commit | 939355645ed0403195a9a56669416a4ab0b8defa (patch) | |
tree | 6de2d34079067c1e2266e0371aae7eb803de02ef /components/layout_2020 | |
parent | 594c04dc7c75a0a1d0d860ea1234cad97c322620 (diff) | |
download | servo-939355645ed0403195a9a56669416a4ab0b8defa.tar.gz servo-939355645ed0403195a9a56669416a4ab0b8defa.zip |
layout: Always floor the max-content size by the min-content size (#36571)
This is a follow-up to #36518, which only addressed inline formatting
contexts. However, flex formatting contexts had the same problem, so it
seems safer to address it in general.
Testing: this makes a WPT test pass
Fixes: #36570
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components/layout_2020')
-rw-r--r-- | components/layout_2020/flow/inline/mod.rs | 8 | ||||
-rw-r--r-- | components/layout_2020/layout_box_base.rs | 3 | ||||
-rw-r--r-- | components/layout_2020/sizing.rs | 14 |
3 files changed, 17 insertions, 8 deletions
diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs index 1f686120c32..d864807aa45 100644 --- a/components/layout_2020/flow/inline/mod.rs +++ b/components/layout_2020/flow/inline/mod.rs @@ -2287,14 +2287,8 @@ impl<'layout_data> ContentSizesComputation<'layout_data> { } self.forced_line_break(); - // We might get a max-content size which is smaller than the min-content size, - // due to negative margins. So we need to adjust to avoid problems down the line. - // This is being discussed in <https://github.com/w3c/csswg-drafts/issues/12076>. - let mut sizes = self.paragraph; - sizes.max_content.max_assign(sizes.min_content); - InlineContentSizesResult { - sizes, + sizes: self.paragraph, depends_on_block_constraints: self.depends_on_block_constraints, } } diff --git a/components/layout_2020/layout_box_base.rs b/components/layout_2020/layout_box_base.rs index 4d8ea2ade5f..8a88a5855dc 100644 --- a/components/layout_2020/layout_box_base.rs +++ b/components/layout_2020/layout_box_base.rs @@ -60,7 +60,8 @@ impl LayoutBoxBase { // TODO: Should we keep multiple caches for various block sizes? } - let result = layout_box.compute_inline_content_sizes(layout_context, constraint_space); + let result = + layout_box.compute_inline_content_sizes_with_fixup(layout_context, constraint_space); *cache = Some(Box::new((constraint_space.block_size, result))); result } diff --git a/components/layout_2020/sizing.rs b/components/layout_2020/sizing.rs index 45595bc0871..cde1a2b246a 100644 --- a/components/layout_2020/sizing.rs +++ b/components/layout_2020/sizing.rs @@ -279,4 +279,18 @@ pub(crate) trait ComputeInlineContentSizes { layout_context: &LayoutContext, constraint_space: &ConstraintSpace, ) -> InlineContentSizesResult; + + /// Returns the same result as [`Self::compute_inline_content_sizes()`], but adjusted + /// to floor the max-content size by the min-content size. + /// This is being discussed in <https://github.com/w3c/csswg-drafts/issues/12076>. + fn compute_inline_content_sizes_with_fixup( + &self, + layout_context: &LayoutContext, + constraint_space: &ConstraintSpace, + ) -> InlineContentSizesResult { + let mut result = self.compute_inline_content_sizes(layout_context, constraint_space); + let sizes = &mut result.sizes; + sizes.max_content.max_assign(sizes.min_content); + result + } } |