Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Unified Diff: third_party/WebKit/Source/core/paint/ObjectPaintInvalidatorTest.cpp

Issue 2639283003: Fix traverseNonCompositingDescendantsInPaintOrder for float-under-inline cases (Closed)
Patch Set: - Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/paint/ObjectPaintInvalidatorTest.cpp
diff --git a/third_party/WebKit/Source/core/paint/ObjectPaintInvalidatorTest.cpp b/third_party/WebKit/Source/core/paint/ObjectPaintInvalidatorTest.cpp
index 08c615c314e75e7323c2130c1dcf20e67e5d9cc4..fb712a5c5016ca85c3903538dd3b7fb3d4660b58 100644
--- a/third_party/WebKit/Source/core/paint/ObjectPaintInvalidatorTest.cpp
+++ b/third_party/WebKit/Source/core/paint/ObjectPaintInvalidatorTest.cpp
@@ -6,6 +6,7 @@
#include "core/layout/LayoutObject.h"
#include "core/layout/LayoutTestHelper.h"
+#include "core/paint/PaintLayer.h"
#include "platform/json/JSONValues.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -64,4 +65,195 @@ TEST_F(ObjectPaintInvalidatorTest,
s);
}
+TEST_F(ObjectPaintInvalidatorTest, TraverseFloatUnderCompositedInline) {
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+ return;
+
+ enableCompositing();
+ setBodyInnerHTML(
+ "<div id='compositedContainer' style='position: relative;"
+ " will-change: transform'>"
+ " <div id='containingBlock' style='position: relative'>"
+ " <span id='span' style='position: relative; will-change: transform'>"
+ " <div id='target' style='float: right'></div>"
+ " </span>"
+ " </div>"
+ "</div>");
+
+ auto* target = getLayoutObjectByElementId("target");
+ auto* containingBlock = getLayoutObjectByElementId("containingBlock");
+ auto* containingBlockLayer = toLayoutBoxModelObject(containingBlock)->layer();
+ auto* compositedContainer = getLayoutObjectByElementId("compositedContainer");
+ auto* compositedContainerLayer =
+ toLayoutBoxModelObject(compositedContainer)->layer();
+ auto* span = getLayoutObjectByElementId("span");
+ auto* spanLayer = toLayoutBoxModelObject(span)->layer();
+
+ // Thought |target| is under |span| which is a composited stacking context,
+ // |span| is not the paint invalidation container of |target|.
+ EXPECT_TRUE(span->isPaintInvalidationContainer());
+ EXPECT_TRUE(span->styleRef().isStackingContext());
+ EXPECT_EQ(compositedContainer, &target->containerForPaintInvalidation());
+ EXPECT_EQ(containingBlockLayer, target->paintingLayer());
+
+ // Traversing from target should mark needsRepaint on correct layers.
+ EXPECT_FALSE(containingBlockLayer->needsRepaint());
+ EXPECT_FALSE(compositedContainerLayer->needsRepaint());
+ ObjectPaintInvalidator(*target)
+ .invalidateDisplayItemClientsIncludingNonCompositingDescendants(
+ PaintInvalidationSubtree);
+ EXPECT_TRUE(containingBlockLayer->needsRepaint());
+ EXPECT_TRUE(compositedContainerLayer->needsRepaint());
+ EXPECT_FALSE(spanLayer->needsRepaint());
+
+ document().view()->updateAllLifecyclePhases();
+
+ // Traversing from span should mark needsRepaint on correct layers for target.
+ EXPECT_FALSE(containingBlockLayer->needsRepaint());
+ EXPECT_FALSE(compositedContainerLayer->needsRepaint());
+ ObjectPaintInvalidator(*span)
+ .invalidateDisplayItemClientsIncludingNonCompositingDescendants(
+ PaintInvalidationSubtree);
+ EXPECT_TRUE(containingBlockLayer->needsRepaint());
+ EXPECT_TRUE(compositedContainerLayer->needsRepaint());
+ EXPECT_TRUE(spanLayer->needsRepaint());
+
+ document().view()->updateAllLifecyclePhases();
+
+ // Traversing from compositedContainer should reach target.
+ document().view()->setTracksPaintInvalidations(true);
+ EXPECT_FALSE(containingBlockLayer->needsRepaint());
+ EXPECT_FALSE(compositedContainerLayer->needsRepaint());
+ ObjectPaintInvalidator(*compositedContainer)
+ .invalidateDisplayItemClientsIncludingNonCompositingDescendants(
+ PaintInvalidationSubtree);
+ EXPECT_TRUE(containingBlockLayer->needsRepaint());
+ EXPECT_TRUE(compositedContainerLayer->needsRepaint());
+ EXPECT_FALSE(spanLayer->needsRepaint());
+
+ std::unique_ptr<JSONArray> invalidations =
+ document().view()->trackedObjectPaintInvalidationsAsJSON();
+ document().view()->setTracksPaintInvalidations(false);
+
+ ASSERT_EQ(4u, invalidations->size());
+ String s;
+ JSONObject::cast(invalidations->at(0))->get("object")->asString(&s);
+ EXPECT_EQ(compositedContainer->debugName(), s);
+ JSONObject::cast(invalidations->at(1))->get("object")->asString(&s);
+ EXPECT_EQ(containingBlock->debugName(), s);
+ JSONObject::cast(invalidations->at(2))->get("object")->asString(&s);
+ EXPECT_EQ(target->debugName(), s);
+ // This is the text node after the span.
+ JSONObject::cast(invalidations->at(3))->get("object")->asString(&s);
+ EXPECT_EQ("LayoutText #text", s);
+}
+
+TEST_F(ObjectPaintInvalidatorTest,
+ TraverseFloatUnderMultiLevelCompositedInlines) {
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+ return;
+
+ enableCompositing();
+ setBodyInnerHTML(
+ "<div id='compositedContainer' style='position: relative;"
+ " will-change: transform'>"
+ " <div id='containingBlock' style='position: relative; z-index: 0'>"
+ " <span id='span' style='position: relative; will-change: transform'>"
+ " <span id='innerSpan'"
+ " style='position: relative; will-change: transform'>"
+ " <div id='target' style='float: right'></div>"
+ " </span>"
+ " </span>"
+ " </div>"
+ "</div>");
+
+ auto* target = getLayoutObjectByElementId("target");
+ auto* containingBlock = getLayoutObjectByElementId("containingBlock");
+ auto* containingBlockLayer = toLayoutBoxModelObject(containingBlock)->layer();
+ auto* compositedContainer = getLayoutObjectByElementId("compositedContainer");
+ auto* compositedContainerLayer =
+ toLayoutBoxModelObject(compositedContainer)->layer();
+ auto* span = getLayoutObjectByElementId("span");
+ auto* spanLayer = toLayoutBoxModelObject(span)->layer();
+ auto* innerSpan = getLayoutObjectByElementId("innerSpan");
+ auto* innerSpanLayer = toLayoutBoxModelObject(innerSpan)->layer();
+
+ EXPECT_TRUE(span->isPaintInvalidationContainer());
+ EXPECT_TRUE(span->styleRef().isStackingContext());
+ EXPECT_TRUE(innerSpan->isPaintInvalidationContainer());
+ EXPECT_TRUE(innerSpan->styleRef().isStackingContext());
+ EXPECT_EQ(compositedContainer, &target->containerForPaintInvalidation());
+ EXPECT_EQ(containingBlockLayer, target->paintingLayer());
+
+ // Traversing from compositedContainer should reach target.
+ document().view()->setTracksPaintInvalidations(true);
+ EXPECT_FALSE(containingBlockLayer->needsRepaint());
+ EXPECT_FALSE(compositedContainerLayer->needsRepaint());
+ ObjectPaintInvalidator(*compositedContainer)
+ .invalidateDisplayItemClientsIncludingNonCompositingDescendants(
+ PaintInvalidationSubtree);
+ EXPECT_TRUE(containingBlockLayer->needsRepaint());
+ EXPECT_TRUE(compositedContainerLayer->needsRepaint());
+ EXPECT_FALSE(spanLayer->needsRepaint());
+ EXPECT_FALSE(innerSpanLayer->needsRepaint());
+
+ std::unique_ptr<JSONArray> invalidations =
+ document().view()->trackedObjectPaintInvalidationsAsJSON();
+ document().view()->setTracksPaintInvalidations(false);
+
+ ASSERT_EQ(4u, invalidations->size());
+ String s;
+ JSONObject::cast(invalidations->at(0))->get("object")->asString(&s);
+ EXPECT_EQ(compositedContainer->debugName(), s);
+ JSONObject::cast(invalidations->at(1))->get("object")->asString(&s);
+ EXPECT_EQ(containingBlock->debugName(), s);
+ JSONObject::cast(invalidations->at(2))->get("object")->asString(&s);
+ EXPECT_EQ(target->debugName(), s);
+ // This is the text node after the span.
+ JSONObject::cast(invalidations->at(3))->get("object")->asString(&s);
+ EXPECT_EQ("LayoutText #text", s);
+}
+
+TEST_F(ObjectPaintInvalidatorTest, TraverseStackedFloatUnderCompositedInline) {
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+ return;
+
+ enableCompositing();
+ setBodyInnerHTML(
+ "<span id='span' style='position: relative; will-change: transform'>"
+ " <div id='target' style='position: relative; float: right'></div>"
+ "</span>");
+
+ auto* target = getLayoutObjectByElementId("target");
+ auto* targetLayer = toLayoutBoxModelObject(target)->layer();
+ auto* span = getLayoutObjectByElementId("span");
+ auto* spanLayer = toLayoutBoxModelObject(span)->layer();
+
+ EXPECT_TRUE(span->isPaintInvalidationContainer());
+ EXPECT_TRUE(span->styleRef().isStackingContext());
+ EXPECT_EQ(span, &target->containerForPaintInvalidation());
+ EXPECT_EQ(targetLayer, target->paintingLayer());
+
+ // Traversing from span should reach target.
+ document().view()->setTracksPaintInvalidations(true);
+ EXPECT_FALSE(spanLayer->needsRepaint());
+ ObjectPaintInvalidator(*span)
+ .invalidateDisplayItemClientsIncludingNonCompositingDescendants(
+ PaintInvalidationSubtree);
+ EXPECT_TRUE(spanLayer->needsRepaint());
+
+ std::unique_ptr<JSONArray> invalidations =
+ document().view()->trackedObjectPaintInvalidationsAsJSON();
+ document().view()->setTracksPaintInvalidations(false);
+
+ ASSERT_EQ(3u, invalidations->size());
+ String s;
+ JSONObject::cast(invalidations->at(0))->get("object")->asString(&s);
+ EXPECT_EQ(span->debugName(), s);
+ JSONObject::cast(invalidations->at(1))->get("object")->asString(&s);
+ EXPECT_EQ("LayoutText #text", s);
+ JSONObject::cast(invalidations->at(2))->get("object")->asString(&s);
+ EXPECT_EQ(target->debugName(), s);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698