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,
NGConstraintSpace NGFlexLayoutAlgorithm::BuildSpaceForIntrinsicBlockSize(
const NGBlockNode& flex_item,
const NGPhysicalBoxStrut& physical_margins,
const MinMaxSizes& cross_axis_min_max) const {
const NGPhysicalBoxStrut& physical_margins = NGPhysicalBoxStrut(),
const MinMaxSizes& cross_axis_min_max = MinMaxSizes{
kIndefiniteSize, kIndefiniteSize}) const {
const ComputedStyle& child_style = flex_item.Style();
NGConstraintSpaceBuilder space_builder(ConstraintSpace(),
child_style.GetWritingMode(),
......@@ -346,7 +347,8 @@ NGConstraintSpace NGFlexLayoutAlgorithm::BuildSpaceForIntrinsicBlockSize(
LogicalSize child_available_size = content_box_size_;
if (ShouldItemShrinkToFit(flex_item)) {
space_builder.SetIsShrinkToFit(true);
} else if (WillChildCrossSizeBeContainerCrossSize(flex_item)) {
} else if (cross_axis_min_max.min_size != kIndefiniteSize &&
WillChildCrossSizeBeContainerCrossSize(flex_item)) {
if (is_column_) {
space_builder.SetIsFixedInlineSize(true);
child_available_size.inline_size =
......@@ -429,16 +431,18 @@ void NGFlexLayoutAlgorithm::ConstructAndAppendFlexItems() {
base::Optional<MinMaxSizes> min_max_size;
auto MinMaxSizesFunc = [&]() -> MinMaxSizes {
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
// 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'll only ever use it if the child's inline axis is our main axis.
// We want the child's intrinsic inline sizes in its writing mode, so
// pass child's writing mode as the first parameter, which is nominally
// |container_writing_mode|.
min_max_size = child.ComputeMinMaxSizes(
child_style.GetWritingMode(),
MinMaxSizesInput(content_box_size_.block_size), &flex_basis_space);
MinMaxSizesInput(content_box_size_.block_size), &child_space);
}
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