mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
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:
parent
915901bdec
commit
65c65c9a6a
7 changed files with 24 additions and 12 deletions
|
@ -411,6 +411,7 @@ fn compute_inline_content_sizes_for_block_level_boxes(
|
||||||
containing_block,
|
containing_block,
|
||||||
&LogicalVec2::zero(),
|
&LogicalVec2::zero(),
|
||||||
false, /* auto_block_size_stretches_to_containing_block */
|
false, /* auto_block_size_stretches_to_containing_block */
|
||||||
|
false, /* is_table */
|
||||||
|_| None, /* TODO: support preferred aspect ratios on non-replaced boxes */
|
|_| None, /* TODO: support preferred aspect ratios on non-replaced boxes */
|
||||||
|constraint_space| {
|
|constraint_space| {
|
||||||
base.inline_content_sizes(layout_context, constraint_space, contents)
|
base.inline_content_sizes(layout_context, constraint_space, contents)
|
||||||
|
|
|
@ -204,11 +204,18 @@ impl IndependentFormattingContext {
|
||||||
auto_minimum: &LogicalVec2<Au>,
|
auto_minimum: &LogicalVec2<Au>,
|
||||||
auto_block_size_stretches_to_containing_block: bool,
|
auto_block_size_stretches_to_containing_block: bool,
|
||||||
) -> InlineContentSizesResult {
|
) -> InlineContentSizesResult {
|
||||||
|
let is_table = matches!(
|
||||||
|
self.contents,
|
||||||
|
IndependentFormattingContextContents::NonReplaced(
|
||||||
|
IndependentNonReplacedContents::Table(_)
|
||||||
|
)
|
||||||
|
);
|
||||||
sizing::outer_inline(
|
sizing::outer_inline(
|
||||||
self.style(),
|
self.style(),
|
||||||
containing_block,
|
containing_block,
|
||||||
auto_minimum,
|
auto_minimum,
|
||||||
auto_block_size_stretches_to_containing_block,
|
auto_block_size_stretches_to_containing_block,
|
||||||
|
is_table,
|
||||||
|padding_border_sums| self.preferred_aspect_ratio(padding_border_sums),
|
|padding_border_sums| self.preferred_aspect_ratio(padding_border_sums),
|
||||||
|constraint_space| self.inline_content_sizes(layout_context, constraint_space),
|
|constraint_space| self.inline_content_sizes(layout_context, constraint_space),
|
||||||
)
|
)
|
||||||
|
|
|
@ -114,6 +114,7 @@ pub(crate) fn outer_inline(
|
||||||
containing_block: &IndefiniteContainingBlock,
|
containing_block: &IndefiniteContainingBlock,
|
||||||
auto_minimum: &LogicalVec2<Au>,
|
auto_minimum: &LogicalVec2<Au>,
|
||||||
auto_block_size_stretches_to_containing_block: bool,
|
auto_block_size_stretches_to_containing_block: bool,
|
||||||
|
is_table: bool,
|
||||||
get_preferred_aspect_ratio: impl FnOnce(&LogicalVec2<Au>) -> Option<AspectRatio>,
|
get_preferred_aspect_ratio: impl FnOnce(&LogicalVec2<Au>) -> Option<AspectRatio>,
|
||||||
get_content_size: impl FnOnce(&ConstraintSpace) -> InlineContentSizesResult,
|
get_content_size: impl FnOnce(&ConstraintSpace) -> InlineContentSizesResult,
|
||||||
) -> InlineContentSizesResult {
|
) -> InlineContentSizesResult {
|
||||||
|
@ -175,10 +176,12 @@ pub(crate) fn outer_inline(
|
||||||
let (preferred_min_content, preferred_max_content, preferred_depends_on_block_constraints) =
|
let (preferred_min_content, preferred_max_content, preferred_depends_on_block_constraints) =
|
||||||
resolve_non_initial(content_box_sizes.inline.preferred)
|
resolve_non_initial(content_box_sizes.inline.preferred)
|
||||||
.unwrap_or_else(|| resolve_non_initial(Size::FitContent).unwrap());
|
.unwrap_or_else(|| resolve_non_initial(Size::FitContent).unwrap());
|
||||||
let (min_min_content, min_max_content, min_depends_on_block_constraints) = resolve_non_initial(
|
let (mut min_min_content, mut min_max_content, mut min_depends_on_block_constraints) =
|
||||||
content_box_sizes.inline.min,
|
resolve_non_initial(content_box_sizes.inline.min).unwrap_or((
|
||||||
)
|
auto_minimum.inline,
|
||||||
.unwrap_or((auto_minimum.inline, auto_minimum.inline, false));
|
auto_minimum.inline,
|
||||||
|
false,
|
||||||
|
));
|
||||||
let (max_min_content, max_max_content, max_depends_on_block_constraints) =
|
let (max_min_content, max_max_content, max_depends_on_block_constraints) =
|
||||||
resolve_non_initial(content_box_sizes.inline.max)
|
resolve_non_initial(content_box_sizes.inline.max)
|
||||||
.map(|(min_content, max_content, depends_on_block_constraints)| {
|
.map(|(min_content, max_content, depends_on_block_constraints)| {
|
||||||
|
@ -189,6 +192,15 @@ pub(crate) fn outer_inline(
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.unwrap_or_default();
|
.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 {
|
InlineContentSizesResult {
|
||||||
sizes: ContentSizes {
|
sizes: ContentSizes {
|
||||||
min_content: preferred_min_content
|
min_content: preferred_min_content
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[table-intrinsic-size-001.html]
|
|
||||||
expected: FAIL
|
|
|
@ -1,2 +0,0 @@
|
||||||
[table-intrinsic-size-002.html]
|
|
||||||
expected: FAIL
|
|
|
@ -1,2 +0,0 @@
|
||||||
[table-intrinsic-size-003.html]
|
|
||||||
expected: FAIL
|
|
|
@ -1,2 +0,0 @@
|
||||||
[table-intrinsic-size-004.html]
|
|
||||||
expected: FAIL
|
|
Loading…
Add table
Add a link
Reference in a new issue