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 { ...@@ -1597,22 +1597,24 @@ bool PaintLayer::RequiresScrollableArea() const {
} }
void PaintLayer::UpdateScrollableArea() { void PaintLayer::UpdateScrollableArea() {
if (RequiresScrollableArea() && !scrollable_area_) { if (RequiresScrollableArea() == !!scrollable_area_)
return;
if (!scrollable_area_) {
scrollable_area_ = MakeGarbageCollected<PaintLayerScrollableArea>(*this); scrollable_area_ = MakeGarbageCollected<PaintLayerScrollableArea>(*this);
if (Compositor()) { } else {
Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree);
}
GetLayoutObject().SetNeedsPaintPropertyUpdate();
} else if (!RequiresScrollableArea() && scrollable_area_) {
scrollable_area_->Dispose(); scrollable_area_->Dispose();
scrollable_area_.Clear(); scrollable_area_.Clear();
if (Compositor()) {
Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree);
}
GetLayoutObject().SetBackgroundPaintLocation( GetLayoutObject().SetBackgroundPaintLocation(
kBackgroundPaintInGraphicsLayer); 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 { bool PaintLayer::HasOverflowControls() const {
......
...@@ -61,7 +61,7 @@ namespace blink { ...@@ -61,7 +61,7 @@ namespace blink {
// in order to determine if we isStacked() we have to ask the paint // in order to determine if we isStacked() we have to ask the paint
// layer about some of its state. // layer about some of its state.
PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer& layer) PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer& layer)
: layer_(layer), z_order_lists_dirty_(true) { : layer_(layer) {
DCHECK(layer.GetLayoutObject().IsStackingContext()); DCHECK(layer.GetLayoutObject().IsStackingContext());
} }
......
...@@ -201,7 +201,7 @@ class CORE_EXPORT PaintLayerStackingNode { ...@@ -201,7 +201,7 @@ class CORE_EXPORT PaintLayerStackingNode {
PaintLayers overlay_overflow_controls_reordered_list_; PaintLayers overlay_overflow_controls_reordered_list_;
// Indicates whether the z-order lists above are dirty. // Indicates whether the z-order lists above are dirty.
bool z_order_lists_dirty_ : 1; bool z_order_lists_dirty_ = true;
}; };
} // namespace blink } // namespace blink
......
...@@ -465,11 +465,17 @@ class ReorderOverlayOverflowControlsTest ...@@ -465,11 +465,17 @@ class ReorderOverlayOverflowControlsTest
void InitOverflowStyle(const char* id) { void InitOverflowStyle(const char* id) {
GetDocument().getElementById(id)->setAttribute( GetDocument().getElementById(id)->setAttribute(
html_names::kStyleAttr, GetOverlayType() == kOverlayScrollbars html_names::kStyleAttr, GetOverlayType() == kOverlayScrollbars
? "overflow : auto" ? "overflow: auto"
: "overflow: hidden; resize: both"); : "overflow: hidden; resize: both");
UpdateAllLifecyclePhasesForTest(); UpdateAllLifecyclePhasesForTest();
} }
void RemoveOverflowStyle(const char* id) {
GetDocument().getElementById(id)->setAttribute(html_names::kStyleAttr,
"overflow: visible");
UpdateAllLifecyclePhasesForTest();
}
void SetUp() override { void SetUp() override {
EnableCompositing(); EnableCompositing();
RenderingTest::SetUp(); RenderingTest::SetUp();
...@@ -542,14 +548,14 @@ TEST_P(ReorderOverlayOverflowControlsTest, StackedWithInFlowDescendant) { ...@@ -542,14 +548,14 @@ TEST_P(ReorderOverlayOverflowControlsTest, StackedWithInFlowDescendant) {
TEST_P(ReorderOverlayOverflowControlsTest, StackedWithOutOfFlowDescendant) { TEST_P(ReorderOverlayOverflowControlsTest, StackedWithOutOfFlowDescendant) {
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
<style> <style>
#child {
width: 200px;
height: 200px;
}
#parent { #parent {
position: relative; position: relative;
height: 100px; height: 100px;
} }
#child {
width: 200px;
height: 200px;
}
</style> </style>
<div id='parent'> <div id='parent'>
<div id='child' style='position: absolute'></div> <div id='child' style='position: absolute'></div>
...@@ -1008,6 +1014,42 @@ TEST_P(ReorderOverlayOverflowControlsTest, ...@@ -1008,6 +1014,42 @@ TEST_P(ReorderOverlayOverflowControlsTest,
EXPECT_TRUE(LayersPaintingOverlayOverflowControlsAfter(child)); 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) { TEST_P(PaintLayerTest, SubsequenceCachingStackedLayers) {
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
<div id='parent' style='position:relative'> <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