Commit 6e736f26 authored by Vladimir Levin's avatar Vladimir Levin Committed by Commit Bot

NG/ContentSize: Save unconstrained intrinsic block size in NG for overflow calc.

This patch saves the unconstrained intrinsic box size during the
block layout algorithm in order to use it for overflow calculation
in the node. Since we can override the intrinsic size with css-content-size,
we may cause scrollbars to appear. By using unconstrained size, we retain
correct behavior in which scrollbars only depend on the child content,
and not on content-size override.

R=chrishtr@chromium.org, ikilpatrick@chromium.org

Bug: 991096
Change-Id: I0d9cb270ee710b759f93202497f69bf72544f81a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1833074Reviewed-by: default avatarMorten Stenshorne <mstensho@chromium.org>
Commit-Queue: vmpstr <vmpstr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#706135}
parent 465fb494
......@@ -745,6 +745,9 @@ scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::FinishLayout(
intrinsic_block_size_ = std::max(intrinsic_block_size_,
CalculateMinimumBlockSize(end_margin_strut));
// Save the unconstrained intrinsic size on the builder before clamping it.
container_builder_.SetUnconstrainedIntrinsicBlockSize(intrinsic_block_size_);
// TODO(layout-dev): Is CalculateMinimumBlockSize common to other algorithms,
// and should move into ClampIntrinsicBlockSize?
intrinsic_block_size_ = ClampIntrinsicBlockSize(
......
......@@ -411,6 +411,7 @@ class CORE_EXPORT NGBlockLayoutAlgorithm
LogicalSize child_percentage_size_;
LogicalSize replaced_child_percentage_size_;
// Intrinsic block size based on child layout and containment.
LayoutUnit intrinsic_block_size_;
// The line box index at which we ran out of space. This where we'll actually
......
......@@ -839,7 +839,8 @@ void NGBlockNode::CopyFragmentDataToLayoutBox(
LayoutBlock* block = DynamicTo<LayoutBlock>(box_);
if (LIKELY(block && is_last_fragment)) {
LayoutUnit intrinsic_block_size = layout_result.IntrinsicBlockSize();
LayoutUnit intrinsic_block_size =
layout_result.UnconstrainedIntrinsicBlockSize();
if (UNLIKELY(previous_break_token))
intrinsic_block_size += previous_break_token->ConsumedBlockSize();
......
......@@ -68,6 +68,10 @@ class CORE_EXPORT NGBoxFragmentBuilder final
return *initial_fragment_geometry_;
}
void SetUnconstrainedIntrinsicBlockSize(
LayoutUnit unconstrained_intrinsic_block_size) {
unconstrained_intrinsic_block_size_ = unconstrained_intrinsic_block_size;
}
void SetIntrinsicBlockSize(LayoutUnit intrinsic_block_size) {
intrinsic_block_size_ = intrinsic_block_size;
}
......@@ -293,6 +297,7 @@ class CORE_EXPORT NGBoxFragmentBuilder final
scoped_refptr<const NGLayoutResult> ToBoxFragment(WritingMode);
const NGFragmentGeometry* initial_fragment_geometry_ = nullptr;
LayoutUnit unconstrained_intrinsic_block_size_ = kIndefiniteSize;
LayoutUnit intrinsic_block_size_;
NGFragmentItemsBuilder* items_builder_ = nullptr;
......
......@@ -62,6 +62,11 @@ NGLayoutResult::NGLayoutResult(
rare_data->has_tallest_unbreakable_block_size = true;
#endif
}
if (builder->unconstrained_intrinsic_block_size_ != kIndefiniteSize &&
builder->unconstrained_intrinsic_block_size_ != intrinsic_block_size_) {
EnsureRareData()->unconstrained_intrinsic_block_size_ =
builder->unconstrained_intrinsic_block_size_;
}
if (builder->custom_layout_data_) {
EnsureRareData()->custom_layout_data =
std::move(builder->custom_layout_data_);
......
......@@ -140,6 +140,13 @@ class CORE_EXPORT NGLayoutResult : public RefCounted<NGLayoutResult> {
return intrinsic_block_size_;
}
LayoutUnit UnconstrainedIntrinsicBlockSize() const {
return HasRareData() && rare_data_->unconstrained_intrinsic_block_size_ !=
kIndefiniteSize
? rare_data_->unconstrained_intrinsic_block_size_
: intrinsic_block_size_;
}
LayoutUnit MinimalSpaceShortage() const {
if (!HasRareData())
return LayoutUnit::Max();
......@@ -340,6 +347,7 @@ class CORE_EXPORT NGLayoutResult : public RefCounted<NGLayoutResult> {
};
NGExclusionSpace exclusion_space;
scoped_refptr<SerializedScriptValue> custom_layout_data;
LayoutUnit unconstrained_intrinsic_block_size_ = kIndefiniteSize;
#if DCHECK_IS_ON()
bool has_tallest_unbreakable_block_size = false;
#endif
......
......@@ -367,7 +367,6 @@ Bug(none) virtual/prefer_compositing_to_lcd_text/compositing/overflow/rotate-the
Bug(none) virtual/prefer_compositing_to_lcd_text/compositing/overflow/rotate-then-clip.html [ Failure ]
# display-locking
crbug.com/1007506 wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto.html [ Failure ]
crbug.com/1007506 wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow.html [ Failure ]
# 10/02/2019 Mark tests as failing. Mostly shapes, slight image differences
......
......@@ -260,7 +260,6 @@ crbug.com/1004547 external/wpt/intersection-observer/cross-origin-iframe.sub.htm
crbug.com/1004650 http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Pass Failure ]
# Display locking failures
crbug.com/955533 wpt_internal/display-lock/sizing/overflow-auto-with-overflow.html [ Failure ]
# MSAN failure
crbug.com/996625 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Skip ]
......
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Containment Test: Size containment scrollbars</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
<link rel="match" href="reference/contain-size-scrollbars-004-ref.html">
<meta name=assert content="This test checks that contain:size element's content and padding are considered for scrollbars.">
<style>
#scroller {
contain: size;
background: lightgreen;
overflow: scroll;
padding-bottom: 50px;
width: 100px;
height: 100px;
}
#content {
background: lightblue;
width: 50px;
height: 130px;
}
</style>
<div id=scroller>
<div id=content>
</div>
</div>
<p>This test passes if it has the same output as the reference.</p>
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Containment Test: Reference file</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
<style>
#scroller {
background: lightgreen;
overflow: scroll;
padding-bottom: 50px;
width: 100px;
height: 100px;
}
#content {
background: lightblue;
width: 50px;
height: 130px;
}
</style>
<div id=scroller>
<div id=content>
</div>
</div>
<p>This test passes if it has the same output as the reference.</p>
......@@ -12,12 +12,6 @@
overflow: auto;
background: lightblue;
}
#container > div {
margin: 0;
padding: 0;
width: 1px;
height: 200px;
}
</style>
<div id=container><div></div></div>
<div id=container></div>
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