layout: Fix intrinsic contributions of tables (#34696)

If a table element had e.g. `width: 0px`, we were assuming that this was
its intrinsic min-content and max-content contributions.

However, tables are always at least as big as its min-content size, so
this patch floors the intrinsic contributions by that amount.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
Oriol Brufau 2024-12-20 06:04:56 -08:00 committed by GitHub
parent 915901bdec
commit 65c65c9a6a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 24 additions and 12 deletions

View file

@ -114,6 +114,7 @@ pub(crate) fn outer_inline(
containing_block: &IndefiniteContainingBlock,
auto_minimum: &LogicalVec2<Au>,
auto_block_size_stretches_to_containing_block: bool,
is_table: bool,
get_preferred_aspect_ratio: impl FnOnce(&LogicalVec2<Au>) -> Option<AspectRatio>,
get_content_size: impl FnOnce(&ConstraintSpace) -> InlineContentSizesResult,
) -> InlineContentSizesResult {
@ -175,10 +176,12 @@ pub(crate) fn outer_inline(
let (preferred_min_content, preferred_max_content, preferred_depends_on_block_constraints) =
resolve_non_initial(content_box_sizes.inline.preferred)
.unwrap_or_else(|| resolve_non_initial(Size::FitContent).unwrap());
let (min_min_content, min_max_content, min_depends_on_block_constraints) = resolve_non_initial(
content_box_sizes.inline.min,
)
.unwrap_or((auto_minimum.inline, auto_minimum.inline, false));
let (mut min_min_content, mut min_max_content, mut min_depends_on_block_constraints) =
resolve_non_initial(content_box_sizes.inline.min).unwrap_or((
auto_minimum.inline,
auto_minimum.inline,
false,
));
let (max_min_content, max_max_content, max_depends_on_block_constraints) =
resolve_non_initial(content_box_sizes.inline.max)
.map(|(min_content, max_content, depends_on_block_constraints)| {
@ -189,6 +192,15 @@ pub(crate) fn outer_inline(
)
})
.unwrap_or_default();
// Regardless of their sizing properties, tables are always forced to be at least
// as big as their min-content size, so floor the minimums.
if is_table {
min_min_content.max_assign(content_size.sizes.min_content);
min_max_content.max_assign(content_size.sizes.min_content);
min_depends_on_block_constraints |= content_size.depends_on_block_constraints;
}
InlineContentSizesResult {
sizes: ContentSizes {
min_content: preferred_min_content