Commit f1bad64e authored by Xianzhu Wang's avatar Xianzhu Wang Committed by Commit Bot

Refresh z-list when existence of scrollable area of a PaintLayer changes

This is to refresh data for reordering overlay overflow controls.

Bug: 1149793
Change-Id: I94fc45373ba3e5aad684283c6fda6ae5e31581f4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2547435Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#829077}
parent ac1f297a
......@@ -1597,22 +1597,24 @@ bool PaintLayer::RequiresScrollableArea() const {
}
void PaintLayer::UpdateScrollableArea() {
if (RequiresScrollableArea() && !scrollable_area_) {
if (RequiresScrollableArea() == !!scrollable_area_)
return;
if (!scrollable_area_) {
scrollable_area_ = MakeGarbageCollected<PaintLayerScrollableArea>(*this);
if (Compositor()) {
Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree);
}
GetLayoutObject().SetNeedsPaintPropertyUpdate();
} else if (!RequiresScrollableArea() && scrollable_area_) {
} else {
scrollable_area_->Dispose();
scrollable_area_.Clear();
if (Compositor()) {
Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree);
}
GetLayoutObject().SetBackgroundPaintLocation(
kBackgroundPaintInGraphicsLayer);
GetLayoutObject().SetNeedsPaintPropertyUpdate();
}
GetLayoutObject().SetNeedsPaintPropertyUpdate();
// Need to update z-ordering of overlay overflow controls.
if (!scrollable_area_ || NeedsReorderOverlayOverflowControls())
DirtyStackingContextZOrderLists();
if (auto* compositor = Compositor())
compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree);
}
bool PaintLayer::HasOverflowControls() const {
......
......@@ -61,7 +61,7 @@ namespace blink {
// in order to determine if we isStacked() we have to ask the paint
// layer about some of its state.
PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer& layer)
: layer_(layer), z_order_lists_dirty_(true) {
: layer_(layer) {
DCHECK(layer.GetLayoutObject().IsStackingContext());
}
......
......@@ -201,7 +201,7 @@ class CORE_EXPORT PaintLayerStackingNode {
PaintLayers overlay_overflow_controls_reordered_list_;
// Indicates whether the z-order lists above are dirty.
bool z_order_lists_dirty_ : 1;
bool z_order_lists_dirty_ = true;
};
} // namespace blink
......
......@@ -465,11 +465,17 @@ class ReorderOverlayOverflowControlsTest
void InitOverflowStyle(const char* id) {
GetDocument().getElementById(id)->setAttribute(
html_names::kStyleAttr, GetOverlayType() == kOverlayScrollbars
? "overflow : auto"
? "overflow: auto"
: "overflow: hidden; resize: both");
UpdateAllLifecyclePhasesForTest();
}
void RemoveOverflowStyle(const char* id) {
GetDocument().getElementById(id)->setAttribute(html_names::kStyleAttr,
"overflow: visible");
UpdateAllLifecyclePhasesForTest();
}
void SetUp() override {
EnableCompositing();
RenderingTest::SetUp();
......@@ -542,14 +548,14 @@ TEST_P(ReorderOverlayOverflowControlsTest, StackedWithInFlowDescendant) {
TEST_P(ReorderOverlayOverflowControlsTest, StackedWithOutOfFlowDescendant) {
SetBodyInnerHTML(R"HTML(
<style>
#child {
width: 200px;
height: 200px;
}
#parent {
position: relative;
height: 100px;
}
#child {
width: 200px;
height: 200px;
}
</style>
<div id='parent'>
<div id='child' style='position: absolute'></div>
......@@ -1008,6 +1014,42 @@ TEST_P(ReorderOverlayOverflowControlsTest,
EXPECT_TRUE(LayersPaintingOverlayOverflowControlsAfter(child));
}
TEST_P(ReorderOverlayOverflowControlsTest, AddRemoveScrollableArea) {
SetBodyInnerHTML(R"HTML(
<style>
#parent {
position: relative;
height: 100px;
}
#child {
position: absolute;
width: 200px;
height: 200px;
}
</style>
<div id='parent'>
<div id='child'></div>
</div>
)HTML");
auto* parent = GetPaintLayerByElementId("parent");
auto* child = GetPaintLayerByElementId("child");
EXPECT_FALSE(parent->GetScrollableArea());
EXPECT_FALSE(parent->NeedsReorderOverlayOverflowControls());
EXPECT_FALSE(LayersPaintingOverlayOverflowControlsAfter(child));
InitOverflowStyle("parent");
EXPECT_TRUE(parent->GetScrollableArea());
EXPECT_TRUE(parent->NeedsReorderOverlayOverflowControls());
EXPECT_THAT(LayersPaintingOverlayOverflowControlsAfter(child),
Pointee(ElementsAre(parent)));
RemoveOverflowStyle("parent");
EXPECT_FALSE(parent->GetScrollableArea());
EXPECT_FALSE(parent->NeedsReorderOverlayOverflowControls());
EXPECT_FALSE(LayersPaintingOverlayOverflowControlsAfter(child));
}
TEST_P(PaintLayerTest, SubsequenceCachingStackedLayers) {
SetBodyInnerHTML(R"HTML(
<div id='parent' style='position:relative'>
......
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