aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020
diff options
context:
space:
mode:
authorOriol Brufau <obrufau@igalia.com>2025-04-17 08:36:05 -0700
committerGitHub <noreply@github.com>2025-04-17 15:36:05 +0000
commit939355645ed0403195a9a56669416a4ab0b8defa (patch)
tree6de2d34079067c1e2266e0371aae7eb803de02ef /components/layout_2020
parent594c04dc7c75a0a1d0d860ea1234cad97c322620 (diff)
downloadservo-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.rs8
-rw-r--r--components/layout_2020/layout_box_base.rs3
-rw-r--r--components/layout_2020/sizing.rs14
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
+ }
}