From ab270f3d52de28f76975e99b3f5bf871a8a9961b Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Wed, 18 Dec 2024 23:21:47 +0100 Subject: [PATCH] layout: Never stretch indefinite intrinsic keywords other than `auto` (#34672) Consider: ```html
``` In order to determine the inline min/max-content sizes, we need a tentative block size as the input, which only takes extrinsic values into account. In this case `height: max-content` is intrinsic, so we were treating it as `height: initial`, which would behave as a definite `height: stretch`. Therefore, the canvas was able to resolve its percentage. However, it seems weird to treat an explicitly intrinsic keyword in an extrinsic way, and Blink doesn't do it. So now we treat the tentative block size as indefinite, therefore the percentage behaves as auto. This adds a new test, we were previously failing 6 subtests, now only 3. Signed-off-by: Oriol Brufau --- components/layout_2020/geom.rs | 2 +- components/layout_2020/positioned.rs | 11 +- tests/wpt/meta/MANIFEST.json | 7 + .../keyword-sizes-on-abspos.html.ini | 9 + .../css-sizing/keyword-sizes-on-abspos.html | 306 ++++++++++++++++++ 5 files changed, 329 insertions(+), 6 deletions(-) create mode 100644 tests/wpt/meta/css/css-sizing/keyword-sizes-on-abspos.html.ini create mode 100644 tests/wpt/tests/css/css-sizing/keyword-sizes-on-abspos.html diff --git a/components/layout_2020/geom.rs b/components/layout_2020/geom.rs index f065baad12a..1684e0304a3 100644 --- a/components/layout_2020/geom.rs +++ b/components/layout_2020/geom.rs @@ -627,7 +627,7 @@ impl ToLogicalWithContainingBlock> for PhysicalRect { /// The possible values accepted by the sizing properties. /// -#[derive(Clone, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub(crate) enum Size { /// Represents an `auto` value for the preferred and minimum size properties, /// or `none` for the maximum size properties. diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs index ecb65af97cc..9841f9b6c86 100644 --- a/components/layout_2020/positioned.rs +++ b/components/layout_2020/positioned.rs @@ -799,7 +799,6 @@ impl<'a> AbsoluteAxisSolver<'a> { // A LazyCell will only invoke it once if needed, and then reuse the result. let content_size = get_content_size.map(LazyCell::new); let solve_size = |initial_behavior, stretch_size: Au| -> SizeConstraint { - let initial_is_stretch = initial_behavior == Size::Stretch; let stretch_size = stretch_size.max(Au::zero()); if let Some(ref content_size) = content_size { let preferred_size = Some(self.computed_size.resolve( @@ -816,10 +815,12 @@ impl<'a> AbsoluteAxisSolver<'a> { .resolve_non_initial(stretch_size, content_size); SizeConstraint::new(preferred_size, min_size, max_size) } else { - let preferred_size = self - .computed_size - .maybe_resolve_extrinsic(Some(stretch_size)) - .or(initial_is_stretch.then_some(stretch_size)); + let preferred_size = if self.computed_size.is_initial() { + initial_behavior + } else { + self.computed_size + } + .maybe_resolve_extrinsic(Some(stretch_size)); let min_size = self .computed_min_size .maybe_resolve_extrinsic(Some(stretch_size)) diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index de747b9c3ef..e8ad2cd0133 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -577577,6 +577577,13 @@ {} ] ], + "keyword-sizes-on-abspos.html": [ + "2bc4c463e0b34084af70f3c8dca97cadb90d36cf", + [ + null, + {} + ] + ], "keyword-sizes-on-floated-element.html": [ "e3da8bee7eb7b613e457d00eb88a677c35698d08", [ diff --git a/tests/wpt/meta/css/css-sizing/keyword-sizes-on-abspos.html.ini b/tests/wpt/meta/css/css-sizing/keyword-sizes-on-abspos.html.ini new file mode 100644 index 00000000000..508b6bddd70 --- /dev/null +++ b/tests/wpt/meta/css/css-sizing/keyword-sizes-on-abspos.html.ini @@ -0,0 +1,9 @@ +[keyword-sizes-on-abspos.html] + [.test 17] + expected: FAIL + + [.test 22] + expected: FAIL + + [.test 27] + expected: FAIL diff --git a/tests/wpt/tests/css/css-sizing/keyword-sizes-on-abspos.html b/tests/wpt/tests/css/css-sizing/keyword-sizes-on-abspos.html new file mode 100644 index 00000000000..2bc4c463e0b --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/keyword-sizes-on-abspos.html @@ -0,0 +1,306 @@ + +Keyword sizes on absolutely positioned box + + + + + + + + + +
+ +
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+ +
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+ +
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+ +
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+ +
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+
+
XX XX
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ + + + +