LibWeb: Ignore preferred width when calculating intrinsic width of block

When calculating the intrinsic width of a block-level box, we now ignore
the preferred width entirely, and not just when the preferred width
should be treated as auto.

The condition for this was both confused and wrong, as it looked at the
available width around the box, but didn't check for a width constraint
on the box itself.

Just because the available width has an intrinsic sizing constraint
doesn't mean that the box is undergoing intrinsic sizing. It could also
be the box's containing block!
This commit is contained in:
Andreas Kling 2023-04-06 14:37:54 +02:00
parent 68459d43e0
commit b97229c9b5
Notes: sideshowbarker 2024-07-19 01:59:31 +09:00
3 changed files with 31 additions and 1 deletions

View File

@ -0,0 +1,9 @@
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
BlockContainer <html> at (1,1) content-size 798x39.46875 children: not-inline
Box <body.outer> at (10,10) content-size 764x21.46875 flex-container(row) children: not-inline
BlockContainer <div.middle> at (11,11) content-size 202x19.46875 flex-item children: not-inline
BlockContainer <div.inner> at (12,12) content-size 200x17.46875 children: inline
line 0 width: 45.15625, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 4, rect: [12,12 45.15625x17.46875]
"OPEN"
TextNode <#text>

View File

@ -0,0 +1,18 @@
<!DOCTYPE html><html><style>
* {
border: 1px solid black;
font-family: 'SerenitySans';
}
html { background: white; }
.outer {
display: flex;
background: pink;
}
.inner {
min-width: 200px;
background: orange;
}
</style><body class="outer"><div class="middle"><div class="inner">OPEN

View File

@ -136,7 +136,10 @@ void BlockFormattingContext::compute_width(Box const& box, AvailableSpace const&
box_state.padding_left = padding_left.to_px(box);
box_state.padding_right = padding_right.to_px(box);
if (should_treat_width_as_auto(box, available_space) && available_space.width.is_intrinsic_sizing_constraint())
// NOTE: If we are calculating the min-content or max-content width of this box,
// and the width should be treated as auto, then we can simply return here,
// as the preferred width and min/max constraints are irrelevant for intrinsic sizing.
if (box_state.width_constraint != SizeConstraint::None)
return;
auto try_compute_width = [&](auto const& a_width) {