Commit 0382541b authored by David Grogan's avatar David Grogan Committed by Commit Bot

[FlexNG] Fix perf regression for stretched overflow:auto items

Old code wasn't taking advantage of both cache slots.

This was not just a regression relative to a previous FlexNG
version, but was also significantly worse than legacy flex.

Bug: 845235, 1064411
Change-Id: I03955e4dffd4fae6829f60b8d5e105b1a058da7d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2121738Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Commit-Queue: David Grogan <dgrogan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#756070}
parent 945562c6
...@@ -331,8 +331,9 @@ LayoutUnit CalculateFixedCrossSize(LayoutUnit available_size, ...@@ -331,8 +331,9 @@ LayoutUnit CalculateFixedCrossSize(LayoutUnit available_size,
NGConstraintSpace NGFlexLayoutAlgorithm::BuildSpaceForIntrinsicBlockSize( NGConstraintSpace NGFlexLayoutAlgorithm::BuildSpaceForIntrinsicBlockSize(
const NGBlockNode& flex_item, const NGBlockNode& flex_item,
const NGPhysicalBoxStrut& physical_margins, const NGPhysicalBoxStrut& physical_margins = NGPhysicalBoxStrut(),
const MinMaxSizes& cross_axis_min_max) const { const MinMaxSizes& cross_axis_min_max = MinMaxSizes{
kIndefiniteSize, kIndefiniteSize}) const {
const ComputedStyle& child_style = flex_item.Style(); const ComputedStyle& child_style = flex_item.Style();
NGConstraintSpaceBuilder space_builder(ConstraintSpace(), NGConstraintSpaceBuilder space_builder(ConstraintSpace(),
child_style.GetWritingMode(), child_style.GetWritingMode(),
...@@ -346,7 +347,8 @@ NGConstraintSpace NGFlexLayoutAlgorithm::BuildSpaceForIntrinsicBlockSize( ...@@ -346,7 +347,8 @@ NGConstraintSpace NGFlexLayoutAlgorithm::BuildSpaceForIntrinsicBlockSize(
LogicalSize child_available_size = content_box_size_; LogicalSize child_available_size = content_box_size_;
if (ShouldItemShrinkToFit(flex_item)) { if (ShouldItemShrinkToFit(flex_item)) {
space_builder.SetIsShrinkToFit(true); space_builder.SetIsShrinkToFit(true);
} else if (WillChildCrossSizeBeContainerCrossSize(flex_item)) { } else if (cross_axis_min_max.min_size != kIndefiniteSize &&
WillChildCrossSizeBeContainerCrossSize(flex_item)) {
if (is_column_) { if (is_column_) {
space_builder.SetIsFixedInlineSize(true); space_builder.SetIsFixedInlineSize(true);
child_available_size.inline_size = child_available_size.inline_size =
...@@ -429,16 +431,18 @@ void NGFlexLayoutAlgorithm::ConstructAndAppendFlexItems() { ...@@ -429,16 +431,18 @@ void NGFlexLayoutAlgorithm::ConstructAndAppendFlexItems() {
base::Optional<MinMaxSizes> min_max_size; base::Optional<MinMaxSizes> min_max_size;
auto MinMaxSizesFunc = [&]() -> MinMaxSizes { auto MinMaxSizesFunc = [&]() -> MinMaxSizes {
if (!min_max_size) { if (!min_max_size) {
if (child.Style().OverflowBlockDirection() == EOverflow::kAuto) { NGConstraintSpace child_space = BuildSpaceForIntrinsicBlockSize(child);
if (child_style.OverflowBlockDirection() == EOverflow::kAuto) {
// Ensure this child has been laid out so its auto scrollbars are // Ensure this child has been laid out so its auto scrollbars are
// included in its intrinsic sizes. // included in its intrinsic sizes.
child.Layout(flex_basis_space); child.Layout(child_space);
} }
// We want the child's min/max size in its writing mode, not ours. // We want the child's intrinsic inline sizes in its writing mode, so
// We'll only ever use it if the child's inline axis is our main axis. // pass child's writing mode as the first parameter, which is nominally
// |container_writing_mode|.
min_max_size = child.ComputeMinMaxSizes( min_max_size = child.ComputeMinMaxSizes(
child_style.GetWritingMode(), child_style.GetWritingMode(),
MinMaxSizesInput(content_box_size_.block_size), &flex_basis_space); MinMaxSizesInput(content_box_size_.block_size), &child_space);
} }
return *min_max_size; return *min_max_size;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment