layout: Fix intrinsic contributions of indefinite stretch keyword (#36030)

In #35630 I treated an indefinite `stretch` as 0px on min sizing
properties, and as `none` on max sizing properties. However, this was
only for final layout sizes, I forgot about intrinsic contributions.

Blink already modified the relevant test, I'm just reordering it a bit
since we are no longer treating `stretch` as `fit-content`, so it seems
better to test it at the end.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
Oriol Brufau 2025-03-18 20:19:53 +01:00 committed by GitHub
parent 99d4baa533
commit 09fe51f55a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 21 additions and 38 deletions

View file

@ -172,7 +172,7 @@ pub(crate) fn outer_inline(
};
get_content_size(&constraint_space)
});
let resolve_non_initial = |inline_size| {
let resolve_non_initial = |inline_size, stretch_values| {
Some(match inline_size {
Size::Initial => return None,
Size::Numeric(numeric) => (numeric, numeric, false),
@ -186,24 +186,25 @@ pub(crate) fn outer_inline(
content_size.sizes.max_content,
content_size.depends_on_block_constraints,
),
Size::Stretch | Size::FitContent => (
Size::FitContent => (
content_size.sizes.min_content,
content_size.sizes.max_content,
content_size.depends_on_block_constraints,
),
Size::Stretch => return stretch_values,
})
};
let (mut 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());
resolve_non_initial(content_box_sizes.inline.preferred, None)
.unwrap_or_else(|| resolve_non_initial(Size::FitContent, None).unwrap());
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,
));
resolve_non_initial(
content_box_sizes.inline.min,
Some((Au::zero(), Au::zero(), false)),
)
.unwrap_or((auto_minimum.inline, auto_minimum.inline, false));
let (mut 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, None)
.map(|(min_content, max_content, depends_on_block_constraints)| {
(
Some(min_content),

View file

@ -596233,7 +596233,7 @@
]
],
"keyword-sizes-for-intrinsic-contributions.html": [
"5a2a9ab615368d1cc3181cf84d9ebdefaf79368a",
"dc287b195907e2b114a4d035470dde94f4039b84",
[
null,
{}

View file

@ -1,18 +0,0 @@
[keyword-sizes-for-intrinsic-contributions.html]
[.test 15]
expected: FAIL
[.test 19]
expected: FAIL
[.test 23]
expected: FAIL
[.test 27]
expected: FAIL
[.test 31]
expected: FAIL
[.test 35]
expected: FAIL

View file

@ -47,20 +47,20 @@
<div class="wrapper" style="width: 0px">
<div class="test width" data-expected-width="70"><div style="width: min-content">XXX XXX</div></div>
<div class="test width" data-expected-width="70"><div style="width: fit-content">XXX XXX</div></div>
<div class="test width" data-expected-width="70"><div class="stretch">XXX XXX</div></div>
<div class="test width" data-expected-width="150"><div style="width: max-content">XXX XXX</div></div>
<div class="test width" data-expected-width="70"><div class="stretch">XXX XXX</div></div>
</div>
<div class="wrapper" style="width: 100px">
<div class="test width" data-expected-width="70"><div style="width: min-content">XXX XXX</div></div>
<div class="test width" data-expected-width="90"><div style="width: fit-content">XXX XXX</div></div>
<div class="test width" data-expected-width="90"><div class="stretch">XXX XXX</div></div>
<div class="test width" data-expected-width="150"><div style="width: max-content">XXX XXX</div></div>
<div class="test width" data-expected-width="90"><div class="stretch">XXX XXX</div></div>
</div>
<div class="wrapper" style="width: 200px">
<div class="test width" data-expected-width="70"><div style="width: min-content">XXX XXX</div></div>
<div class="test width" data-expected-width="150"><div style="width: fit-content">XXX XXX</div></div>
<div class="test width" data-expected-width="150"><div class="stretch">XXX XXX</div></div>
<div class="test width" data-expected-width="150"><div style="width: max-content">XXX XXX</div></div>
<div class="test width" data-expected-width="150"><div class="stretch">XXX XXX</div></div>
</div>
<hr>
@ -69,20 +69,20 @@
<div class="wrapper" style="width: 0px">
<div class="test min-width" data-expected-width="70"><div style="min-width: min-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="70"><div style="min-width: fit-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="10"><div class="stretch">XXX XXX</div></div>
<div class="test min-width" data-expected-width="150"><div style="min-width: max-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="10"><div class="stretch">XXX XXX</div></div>
</div>
<div class="wrapper" style="width: 100px">
<div class="test min-width" data-expected-width="70"><div style="min-width: min-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="90"><div style="min-width: fit-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="10"><div class="stretch">XXX XXX</div></div>
<div class="test min-width" data-expected-width="150"><div style="min-width: max-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="10"><div class="stretch">XXX XXX</div></div>
</div>
<div class="wrapper" style="width: 200px">
<div class="test min-width" data-expected-width="70"><div style="min-width: min-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="150"><div style="min-width: fit-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="10"><div class="stretch">XXX XXX</div></div>
<div class="test min-width" data-expected-width="150"><div style="min-width: max-content">XXX XXX</div></div>
<div class="test min-width" data-expected-width="10"><div class="stretch">XXX XXX</div></div>
</div>
<hr>
@ -91,20 +91,20 @@
<div class="wrapper" style="width: 0px">
<div class="test max-width" data-expected-width="70"><div style="max-width: min-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="70"><div style="max-width: fit-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="210"><div class="stretch">XXX XXX</div></div>
<div class="test max-width" data-expected-width="150"><div style="max-width: max-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="210"><div class="stretch">XXX XXX</div></div>
</div>
<div class="wrapper" style="width: 100px">
<div class="test max-width" data-expected-width="70"><div style="max-width: min-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="90"><div style="max-width: fit-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="210"><div class="stretch">XXX XXX</div></div>
<div class="test max-width" data-expected-width="150"><div style="max-width: max-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="210"><div class="stretch">XXX XXX</div></div>
</div>
<div class="wrapper" style="width: 200px">
<div class="test max-width" data-expected-width="70"><div style="max-width: min-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="150"><div style="max-width: fit-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="210"><div class="stretch">XXX XXX</div></div>
<div class="test max-width" data-expected-width="150"><div style="max-width: max-content">XXX XXX</div></div>
<div class="test max-width" data-expected-width="210"><div class="stretch">XXX XXX</div></div>
</div>
<script src="/resources/testharness.js"></script>