Commit 3e11eeb9 authored by Chris Harrelson's avatar Chris Harrelson Committed by Commit Bot

Allow any self-painting layer to be considered for being a relayout root.

As of this commit [1], it was previously limited to positioned elements.

[1] https://chromium.googlesource.com/chromium/src/+/0a7940331530fc647dbd37e6bcce20540271234a

Bug: 1087177

Change-Id: Ief3013338d63b59a88a788fced0e185e293de850
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2219312Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Commit-Queue: Chris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#772560}
parent 10bb5429
......@@ -923,7 +923,10 @@ static inline bool ObjectIsRelayoutBoundary(const LayoutObject* object) {
// Positioned objects always have self-painting layers and are safe to use as
// relayout boundaries.
bool is_svg_root = object->IsSVGRoot();
if (!object->IsPositioned() && !is_svg_root)
bool has_self_painting_layer =
object->HasLayer() &&
ToLayoutBoxModelObject(object)->HasSelfPaintingLayer();
if (!has_self_painting_layer && !is_svg_root)
return false;
// LayoutInline can't be relayout roots since LayoutBlockFlow is responsible
......
......@@ -1117,4 +1117,21 @@ TEST_F(LayoutObjectTest, NeedsLayoutOverflowRecalc) {
EXPECT_FALSE(other->NeedsLayoutOverflowRecalc());
}
TEST_F(LayoutObjectTest, ContainValueIsRelayoutBoundary) {
SetBodyInnerHTML(R"HTML(
<div id='target1' style='contain:layout'></div>
<div id='target2' style='contain:layout size'></div>
<div id='target3' style='contain:paint'></div>
<div id='target4' style='contain:size'></div>
<div id='target5' style='contain:content'></div>
<div id='target6' style='contain:strict'></div>
)HTML");
EXPECT_FALSE(GetLayoutObjectByElementId("target1")->IsRelayoutBoundary());
EXPECT_TRUE(GetLayoutObjectByElementId("target2")->IsRelayoutBoundary());
EXPECT_FALSE(GetLayoutObjectByElementId("target3")->IsRelayoutBoundary());
EXPECT_FALSE(GetLayoutObjectByElementId("target4")->IsRelayoutBoundary());
EXPECT_FALSE(GetLayoutObjectByElementId("target5")->IsRelayoutBoundary());
EXPECT_TRUE(GetLayoutObjectByElementId("target6")->IsRelayoutBoundary());
}
} // namespace blink
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