diff --git a/components/layout_2020/sizing.rs b/components/layout_2020/sizing.rs
index 48018236cc7..42d998e1fa1 100644
--- a/components/layout_2020/sizing.rs
+++ b/components/layout_2020/sizing.rs
@@ -4,6 +4,7 @@
//!
+use std::cell::LazyCell;
use std::ops::{Add, AddAssign};
use app_units::Au;
@@ -11,7 +12,8 @@ use serde::Serialize;
use style::properties::ComputedValues;
use style::Zero;
-use crate::style_ext::{Clamp, ComputedValuesExt, ContentBoxSizesAndPBMDeprecated};
+use crate::geom::Size;
+use crate::style_ext::{Clamp, ComputedValuesExt, ContentBoxSizesAndPBM};
use crate::{AuOrAuto, IndefiniteContainingBlock, LogicalVec2};
#[derive(PartialEq)]
@@ -120,52 +122,100 @@ pub(crate) fn outer_inline(
auto_block_size_stretches_to_containing_block: bool,
get_content_size: impl FnOnce(&IndefiniteContainingBlock) -> InlineContentSizesResult,
) -> InlineContentSizesResult {
- let ContentBoxSizesAndPBMDeprecated {
+ let ContentBoxSizesAndPBM {
content_box_size,
content_min_box_size,
content_max_box_size,
pbm,
mut depends_on_block_constraints,
- } = style
- .content_box_sizes_and_padding_border_margin(containing_block)
- .into();
- let content_box_min_size = LogicalVec2 {
- inline: content_min_box_size.inline.auto_is(|| auto_minimum.inline),
- block: content_min_box_size.block.auto_is(|| auto_minimum.block),
- };
+ } = style.content_box_sizes_and_padding_border_margin(containing_block);
let margin = pbm.margin.map(|v| v.auto_is(Au::zero));
- let pbm_inline_sum = pbm.padding_border_sums.inline + margin.inline_sum();
- let adjust = |v: Au| {
- v.clamp_between_extremums(content_box_min_size.inline, content_max_box_size.inline) +
- pbm_inline_sum
+ let pbm_sums = LogicalVec2 {
+ block: pbm.padding_border_sums.block + margin.block_sum(),
+ inline: pbm.padding_border_sums.inline + margin.inline_sum(),
};
- match content_box_size.inline {
- AuOrAuto::LengthPercentage(inline_size) => InlineContentSizesResult {
- sizes: adjust(inline_size).into(),
- depends_on_block_constraints: false,
- },
- AuOrAuto::Auto => {
- let block_size = if content_box_size.block.is_auto() &&
- auto_block_size_stretches_to_containing_block
- {
- depends_on_block_constraints = true;
- let outer_block_size = containing_block.size.block;
- outer_block_size.map(|v| v - pbm.padding_border_sums.block - margin.block_sum())
- } else {
- content_box_size.block
- }
- .map(|v| {
- v.clamp_between_extremums(content_box_min_size.block, content_max_box_size.block)
- });
- let containing_block_for_children =
- IndefiniteContainingBlock::new_for_style_and_block_size(style, block_size);
- let content_result = get_content_size(&containing_block_for_children);
- InlineContentSizesResult {
- sizes: content_result.sizes.map(adjust),
- depends_on_block_constraints: content_result.depends_on_block_constraints &&
+ let content_size = LazyCell::new(|| {
+ let available_block_size = containing_block
+ .size
+ .block
+ .non_auto()
+ .map(|v| Au::zero().max(v - pbm_sums.block));
+ let block_size = if content_box_size.block.is_initial() &&
+ auto_block_size_stretches_to_containing_block
+ {
+ depends_on_block_constraints = true;
+ available_block_size
+ } else {
+ content_box_size
+ .block
+ .maybe_resolve_extrinsic(available_block_size)
+ }
+ .map(|block_size| {
+ let min_block_size = content_min_box_size
+ .block
+ .maybe_resolve_extrinsic(available_block_size)
+ .unwrap_or(auto_minimum.block);
+ let max_block_size = content_max_box_size
+ .block
+ .maybe_resolve_extrinsic(available_block_size);
+ block_size.clamp_between_extremums(min_block_size, max_block_size)
+ })
+ .map_or(AuOrAuto::Auto, AuOrAuto::LengthPercentage);
+ let containing_block_for_children =
+ IndefiniteContainingBlock::new_for_style_and_block_size(style, block_size);
+ get_content_size(&containing_block_for_children)
+ });
+ let resolve_non_initial = |inline_size| {
+ Some(match inline_size {
+ Size::Initial => return None,
+ Size::Numeric(numeric) => (numeric, numeric, false),
+ Size::MinContent => (
+ content_size.sizes.min_content,
+ content_size.sizes.min_content,
+ content_size.depends_on_block_constraints,
+ ),
+ Size::MaxContent => (
+ content_size.sizes.max_content,
+ content_size.sizes.max_content,
+ content_size.depends_on_block_constraints,
+ ),
+ Size::Stretch | Size::FitContent => (
+ content_size.sizes.min_content,
+ content_size.sizes.max_content,
+ content_size.depends_on_block_constraints,
+ ),
+ })
+ };
+ let (preferred_min_content, preferred_max_content, preferred_depends_on_block_constraints) =
+ resolve_non_initial(content_box_size.inline)
+ .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_min_box_size.inline,
+ )
+ .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_max_box_size.inline)
+ .map(|(min_content, max_content, depends_on_block_constraints)| {
+ (
+ Some(min_content),
+ Some(max_content),
depends_on_block_constraints,
- }
+ )
+ })
+ .unwrap_or_default();
+ InlineContentSizesResult {
+ sizes: ContentSizes {
+ min_content: preferred_min_content
+ .clamp_between_extremums(min_min_content, max_min_content) +
+ pbm_sums.inline,
+ max_content: preferred_max_content
+ .clamp_between_extremums(min_max_content, max_max_content) +
+ pbm_sums.inline,
},
+ depends_on_block_constraints: depends_on_block_constraints &&
+ (preferred_depends_on_block_constraints ||
+ min_depends_on_block_constraints ||
+ max_depends_on_block_constraints),
}
}
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 131e04dd43b..11514ec37b4 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -569314,6 +569314,13 @@
{}
]
],
+ "keyword-sizes-for-intrinsic-contributions.tentative.html": [
+ "5f135d8181b023134eb24e5ec34957e3a25e6765",
+ [
+ null,
+ {}
+ ]
+ ],
"keyword-sizes-on-floated-element.html": [
"42ea7ba26d7e1ffd26f8f12bad37e3b18abba0f6",
[
diff --git a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-dynamic-011.html.ini b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-dynamic-011.html.ini
deleted file mode 100644
index 732a1e9cfc7..00000000000
--- a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-dynamic-011.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[intrinsic-percent-replaced-dynamic-011.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-dynamic-012.html.ini b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-dynamic-012.html.ini
deleted file mode 100644
index 67865199efb..00000000000
--- a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-dynamic-012.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[intrinsic-percent-replaced-dynamic-012.html]
- expected: FAIL
diff --git a/tests/wpt/tests/css/css-sizing/keyword-sizes-for-intrinsic-contributions.tentative.html b/tests/wpt/tests/css/css-sizing/keyword-sizes-for-intrinsic-contributions.tentative.html
new file mode 100644
index 00000000000..5f135d8181b
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/keyword-sizes-for-intrinsic-contributions.tentative.html
@@ -0,0 +1,114 @@
+
+
Keyword sizes for intrinsic contributions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+