Index: Source/core/paint/LayoutObjectDrawingRecorderTest.cpp |
diff --git a/Source/core/paint/LayoutObjectDrawingRecorderTest.cpp b/Source/core/paint/LayoutObjectDrawingRecorderTest.cpp |
index 021bb763d4a9e19859f6b0428fd86da0548c8521..4539c20e77996a19cff8c43bd8fbac4ecde5f310 100644 |
--- a/Source/core/paint/LayoutObjectDrawingRecorderTest.cpp |
+++ b/Source/core/paint/LayoutObjectDrawingRecorderTest.cpp |
@@ -48,21 +48,57 @@ private: |
bool m_originalSlimmingPaintEnabled; |
}; |
+class LayoutObjectDrawingRecorderTestForSlimmingPaintV2 : public RenderingTest { |
+public: |
+ LayoutObjectDrawingRecorderTestForSlimmingPaintV2() |
+ : m_layoutView(nullptr) |
+ , m_originalSlimmingPaintEnabled(RuntimeEnabledFeatures::slimmingPaintEnabled()) |
+ , m_originalSlimmingPaintV2Enabled(RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { } |
+ |
+protected: |
+ LayoutView& layoutView() { return *m_layoutView; } |
+ DisplayItemList& rootDisplayItemList() { return *layoutView().layer()->graphicsLayerBacking()->displayItemList(); } |
+ const DisplayItems& newDisplayItemsBeforeUpdate() { return rootDisplayItemList().m_newDisplayItems; } |
+ |
+private: |
+ void SetUp() override |
+ { |
+ RuntimeEnabledFeatures::setSlimmingPaintEnabled(true); |
+ RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true); |
+ |
+ RenderingTest::SetUp(); |
+ enableCompositing(); |
+ |
+ m_layoutView = document().view()->layoutView(); |
+ ASSERT_TRUE(m_layoutView); |
+ } |
+ |
+ void TearDown() override |
+ { |
+ RuntimeEnabledFeatures::setSlimmingPaintEnabled(m_originalSlimmingPaintV2Enabled); |
+ RuntimeEnabledFeatures::setSlimmingPaintEnabled(m_originalSlimmingPaintEnabled); |
+ } |
+ |
+ LayoutView* m_layoutView; |
+ bool m_originalSlimmingPaintEnabled; |
+ bool m_originalSlimmingPaintV2Enabled; |
+}; |
+ |
namespace { |
void drawNothing(GraphicsContext& context, const LayoutView& layoutView, PaintPhase phase, const LayoutRect& bound) |
{ |
- if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView, phase)) |
+ if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView, phase, LayoutPoint())) |
return; |
- LayoutObjectDrawingRecorder drawingRecorder(context, layoutView, phase, bound); |
+ LayoutObjectDrawingRecorder drawingRecorder(context, layoutView, phase, bound, LayoutPoint()); |
} |
void drawRect(GraphicsContext& context, LayoutView& layoutView, PaintPhase phase, const LayoutRect& bound) |
{ |
- if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView, phase)) |
+ if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView, phase, LayoutPoint())) |
return; |
- LayoutObjectDrawingRecorder drawingRecorder(context, layoutView, phase, bound); |
+ LayoutObjectDrawingRecorder drawingRecorder(context, layoutView, phase, bound, LayoutPoint()); |
IntRect rect(0, 0, 10, 10); |
context.drawRect(rect); |
} |
@@ -131,7 +167,7 @@ FloatRect drawAndGetCullRect(DisplayItemList& list, const LayoutObject& layoutOb |
// Draw some things which will produce a non-null picture. |
GraphicsContext context(&list); |
LayoutObjectDrawingRecorder recorder( |
- context, layoutObject, DisplayItem::BoxDecorationBackground, bounds); |
+ context, layoutObject, DisplayItem::BoxDecorationBackground, bounds, LayoutPoint()); |
context.drawRect(enclosedIntRect(FloatRect(bounds))); |
} |
list.commitNewDisplayItems(); |
@@ -154,5 +190,48 @@ TEST_F(LayoutObjectDrawingRecorderTest, CullRectMatchesProvidedClip) |
EXPECT_EQ(rect, drawAndGetCullRect(rootDisplayItemList(), layoutView(), LayoutRect(rect))); |
} |
+TEST_F(LayoutObjectDrawingRecorderTestForSlimmingPaintV2, PaintOffsetCache) |
+{ |
+ GraphicsContext context(&rootDisplayItemList()); |
+ LayoutRect bounds = layoutView().viewRect(); |
+ LayoutPoint paintOffset(1, 2); |
+ |
+ rootDisplayItemList().invalidateAll(); |
+ EXPECT_FALSE(LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView(), PaintPhaseForeground, paintOffset)); |
+ { |
+ LayoutObjectDrawingRecorder drawingRecorder(context, layoutView(), PaintPhaseForeground, bounds, paintOffset); |
+ IntRect rect(0, 0, 10, 10); |
+ context.drawRect(rect); |
+ } |
+ |
+ rootDisplayItemList().commitNewDisplayItems(); |
+ EXPECT_EQ((size_t)1, rootDisplayItemList().displayItems().size()); |
+ EXPECT_TRUE(isDrawing(rootDisplayItemList().displayItems()[0])); |
+ |
+ // Ensure we cannot use the cache with a new paint offset. |
+ LayoutPoint newPaintOffset(2, 3); |
+ EXPECT_FALSE(LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView(), PaintPhaseForeground, newPaintOffset)); |
+ |
+ // Test that a new paint offset is recorded. |
+ { |
+ LayoutObjectDrawingRecorder drawingRecorder(context, layoutView(), PaintPhaseForeground, bounds, newPaintOffset); |
+ IntRect rect(0, 0, 10, 10); |
+ context.drawRect(rect); |
+ } |
+ |
+ rootDisplayItemList().commitNewDisplayItems(); |
+ EXPECT_EQ((size_t)1, rootDisplayItemList().displayItems().size()); |
+ EXPECT_TRUE(isDrawing(rootDisplayItemList().displayItems()[0])); |
+ |
+ // Ensure the old paint offset cannot be used. |
+ EXPECT_FALSE(LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView(), PaintPhaseForeground, paintOffset)); |
+ |
+ // Ensure the new paint offset can be used. |
+ EXPECT_TRUE(LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutView(), PaintPhaseForeground, newPaintOffset)); |
+ rootDisplayItemList().commitNewDisplayItems(); |
+ EXPECT_EQ((size_t)1, rootDisplayItemList().displayItems().size()); |
+ EXPECT_TRUE(isDrawing(rootDisplayItemList().displayItems()[0])); |
+} |
+ |
} // namespace |
} // namespace blink |