| Index: third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
|
| index 0d4787ec947134bb20e84452e0e4ef041d6fdfc2..4657460efb1e12e86de58ebfd30375357d1e08f0 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
|
| @@ -14,9 +14,12 @@
|
| #include "platform/graphics/paint/DrawingRecorder.h"
|
| #include "platform/graphics/paint/SubsequenceRecorder.h"
|
| #include "platform/testing/FakeDisplayItemClient.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include <memory>
|
|
|
| +using testing::UnorderedElementsAre;
|
| +
|
| namespace blink {
|
|
|
| class PaintControllerTestBase : public testing::Test {
|
| @@ -98,30 +101,60 @@ void drawClippedRect(GraphicsContext& context, const FakeDisplayItemClient& clie
|
| drawRect(context, client, drawingType, bound);
|
| }
|
|
|
| +enum TestConfigurations {
|
| + SPv1,
|
| + SPv2,
|
| #if DCHECK_IS_ON()
|
| + UnderInvalidationCheckingSPv1,
|
| + UnderInvalidationCheckingSPv2,
|
| +#endif
|
| +};
|
| +
|
| // Tests using this class will be tested with under-invalidation-checking enabled and disabled.
|
| -class PaintControllerTest : public PaintControllerTestBase, public testing::WithParamInterface<bool> {
|
| +class PaintControllerTest : public PaintControllerTestBase, public testing::WithParamInterface<TestConfigurations> {
|
| +public:
|
| + PaintControllerTest()
|
| + : m_rootPaintPropertyClient("root")
|
| + , m_rootPaintChunkId(m_rootPaintPropertyClient, DisplayItem::UninitializedType)
|
| + { }
|
| +
|
| protected:
|
| void SetUp() override
|
| {
|
| - if (GetParam())
|
| + switch (GetParam()) {
|
| + case SPv1:
|
| + break;
|
| + case SPv2:
|
| + RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true);
|
| + break;
|
| +#if DCHECK_IS_ON()
|
| + case UnderInvalidationCheckingSPv1:
|
| + RuntimeEnabledFeatures::setSlimmingPaintUnderInvalidationCheckingEnabled(true);
|
| + break;
|
| + case UnderInvalidationCheckingSPv2:
|
| + RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true);
|
| RuntimeEnabledFeatures::setSlimmingPaintUnderInvalidationCheckingEnabled(true);
|
| + break;
|
| +#endif
|
| + }
|
| }
|
| +
|
| + FakeDisplayItemClient m_rootPaintPropertyClient;
|
| + PaintChunk::Id m_rootPaintChunkId;
|
| };
|
|
|
| -INSTANTIATE_TEST_CASE_P(All, PaintControllerTest, ::testing::Bool());
|
| -#define TEST_F_OR_P TEST_P
|
| +#if DCHECK_IS_ON()
|
| +INSTANTIATE_TEST_CASE_P(All, PaintControllerTest, ::testing::Values(SPv1, SPv2, UnderInvalidationCheckingSPv1, UnderInvalidationCheckingSPv2));
|
| #else
|
| -// Under-invalidation checking is only available when DCHECK_IS_ON().
|
| -using PaintControllerTest = PaintControllerTestBase;
|
| -#define TEST_F_OR_P TEST_F
|
| +INSTANTIATE_TEST_CASE_P(All, PaintControllerTest, ::testing::Values(SPv1, SPv2));
|
| #endif
|
|
|
| -TEST_F_OR_P(PaintControllerTest, NestedRecorders)
|
| +TEST_P(PaintControllerTest, NestedRecorders)
|
| {
|
| GraphicsContext context(getPaintController());
|
| -
|
| - FakeDisplayItemClient client("client");
|
| + FakeDisplayItemClient client("client", LayoutRect(100, 100, 200, 200));
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawClippedRect(context, client, clipType, backgroundDrawingType, FloatRect(100, 100, 200, 200));
|
| getPaintController().commitNewDisplayItems();
|
| @@ -130,13 +163,21 @@ TEST_F_OR_P(PaintControllerTest, NestedRecorders)
|
| TestDisplayItem(client, clipType),
|
| TestDisplayItem(client, backgroundDrawingType),
|
| TestDisplayItem(client, DisplayItem::clipTypeToEndClipType(clipType)));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect())));
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateBasic)
|
| +TEST_P(PaintControllerTest, UpdateBasic)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 300, 300));
|
| + FakeDisplayItemClient second("second", LayoutRect(100, 100, 200, 200));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 300, 300));
|
| drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 200, 200));
|
| @@ -151,6 +192,14 @@ TEST_F_OR_P(PaintControllerTest, UpdateBasic)
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(first, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect())));
|
| +
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| + }
|
| +
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 300, 300));
|
| drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 300, 300));
|
|
|
| @@ -166,14 +215,22 @@ TEST_F_OR_P(PaintControllerTest, UpdateBasic)
|
| EXPECT_DISPLAY_LIST(getPaintController().getDisplayItemList(), 2,
|
| TestDisplayItem(first, backgroundDrawingType),
|
| TestDisplayItem(first, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 200, 200))); // |second| disappeared from the chunk.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateSwapOrder)
|
| +TEST_P(PaintControllerTest, UpdateSwapOrder)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| - FakeDisplayItemClient unaffected("unaffected");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient second("second", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient unaffected("unaffected", LayoutRect(300, 300, 10, 10));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 100, 100));
|
| @@ -182,6 +239,8 @@ TEST_F_OR_P(PaintControllerTest, UpdateSwapOrder)
|
| drawRect(context, unaffected, backgroundDrawingType, FloatRect(300, 300, 10, 10));
|
| drawRect(context, unaffected, foregroundDrawingType, FloatRect(300, 300, 10, 10));
|
| getPaintController().commitNewDisplayItems();
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| EXPECT_DISPLAY_LIST(getPaintController().getDisplayItemList(), 6,
|
| TestDisplayItem(first, backgroundDrawingType),
|
| @@ -214,14 +273,23 @@ TEST_F_OR_P(PaintControllerTest, UpdateSwapOrder)
|
| TestDisplayItem(first, foregroundDrawingType),
|
| TestDisplayItem(unaffected, backgroundDrawingType),
|
| TestDisplayItem(unaffected, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + // TODO(wangxianzhu): In real world we invalidate clients with reordered display items.
|
| + // Need to support raster invalidation for recordered display items without invalidating clients.
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre());
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateSwapOrderWithInvalidation)
|
| +TEST_P(PaintControllerTest, UpdateSwapOrderWithInvalidation)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| - FakeDisplayItemClient unaffected("unaffected");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient second("second", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient unaffected("unaffected", LayoutRect(300, 300, 10, 10));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 100, 100));
|
| @@ -239,6 +307,9 @@ TEST_F_OR_P(PaintControllerTest, UpdateSwapOrderWithInvalidation)
|
| TestDisplayItem(unaffected, backgroundDrawingType),
|
| TestDisplayItem(unaffected, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| first.setDisplayItemsUncached();
|
| drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| drawRect(context, second, foregroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -263,14 +334,23 @@ TEST_F_OR_P(PaintControllerTest, UpdateSwapOrderWithInvalidation)
|
| TestDisplayItem(first, foregroundDrawingType),
|
| TestDisplayItem(unaffected, backgroundDrawingType),
|
| TestDisplayItem(unaffected, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 100, 100), // Old bounds of |first|.
|
| + FloatRect(100, 100, 100, 100))); // New bounds of |first|.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateNewItemInMiddle)
|
| +TEST_P(PaintControllerTest, UpdateNewItemInMiddle)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| - FakeDisplayItemClient third("third");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient second("second", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient third("third", LayoutRect(125, 100, 200, 50));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -280,6 +360,9 @@ TEST_F_OR_P(PaintControllerTest, UpdateNewItemInMiddle)
|
| TestDisplayItem(first, backgroundDrawingType),
|
| TestDisplayItem(second, backgroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, third, backgroundDrawingType, FloatRect(125, 100, 200, 50));
|
| drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -297,14 +380,22 @@ TEST_F_OR_P(PaintControllerTest, UpdateNewItemInMiddle)
|
| TestDisplayItem(first, backgroundDrawingType),
|
| TestDisplayItem(third, backgroundDrawingType),
|
| TestDisplayItem(second, backgroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(125, 100, 200, 50))); // |third| newly appeared in the chunk.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateInvalidationWithPhases)
|
| +TEST_P(PaintControllerTest, UpdateInvalidationWithPhases)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| - FakeDisplayItemClient third("third");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient second("second", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient third("third", LayoutRect(300, 100, 50, 50));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -322,6 +413,9 @@ TEST_F_OR_P(PaintControllerTest, UpdateInvalidationWithPhases)
|
| TestDisplayItem(second, foregroundDrawingType),
|
| TestDisplayItem(third, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| second.setDisplayItemsUncached();
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -346,13 +440,22 @@ TEST_F_OR_P(PaintControllerTest, UpdateInvalidationWithPhases)
|
| TestDisplayItem(first, foregroundDrawingType),
|
| TestDisplayItem(second, foregroundDrawingType),
|
| TestDisplayItem(third, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 50, 200), // Old bounds of |second|.
|
| + FloatRect(100, 100, 50, 200))); // New bounds of |second|.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateAddFirstOverlap)
|
| +TEST_P(PaintControllerTest, UpdateAddFirstOverlap)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 150, 150));
|
| + FakeDisplayItemClient second("second", LayoutRect(200, 200, 50, 50));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, second, backgroundDrawingType, FloatRect(200, 200, 50, 50));
|
| drawRect(context, second, foregroundDrawingType, FloatRect(200, 200, 50, 50));
|
| @@ -362,12 +465,16 @@ TEST_F_OR_P(PaintControllerTest, UpdateAddFirstOverlap)
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(second, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| first.setDisplayItemsUncached();
|
| second.setDisplayItemsUncached();
|
| + second.setVisualRect(LayoutRect(150, 150, 100, 100));
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 150, 150));
|
| - drawRect(context, second, backgroundDrawingType, FloatRect(200, 200, 50, 50));
|
| - drawRect(context, second, foregroundDrawingType, FloatRect(200, 200, 50, 50));
|
| + drawRect(context, second, backgroundDrawingType, FloatRect(150, 150, 100, 100));
|
| + drawRect(context, second, foregroundDrawingType, FloatRect(150, 150, 100, 100));
|
| EXPECT_EQ(0, numCachedNewItems());
|
| getPaintController().commitNewDisplayItems();
|
|
|
| @@ -377,9 +484,18 @@ TEST_F_OR_P(PaintControllerTest, UpdateAddFirstOverlap)
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(second, foregroundDrawingType));
|
|
|
| - first.setDisplayItemsUncached();
|
| - drawRect(context, second, backgroundDrawingType, FloatRect(200, 200, 50, 50));
|
| - drawRect(context, second, foregroundDrawingType, FloatRect(200, 200, 50, 50));
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 150, 150), // |first| newly appeared in the chunk.
|
| + FloatRect(200, 200, 50, 50), // Old bounds of |second|.
|
| + FloatRect(150, 150, 100, 100))); // New bounds of |second|.
|
| +
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| + }
|
| +
|
| + drawRect(context, second, backgroundDrawingType, FloatRect(150, 150, 100, 100));
|
| + drawRect(context, second, foregroundDrawingType, FloatRect(150, 150, 100, 100));
|
|
|
| EXPECT_EQ(2, numCachedNewItems());
|
| #if DCHECK_IS_ON()
|
| @@ -393,13 +509,21 @@ TEST_F_OR_P(PaintControllerTest, UpdateAddFirstOverlap)
|
| EXPECT_DISPLAY_LIST(getPaintController().getDisplayItemList(), 2,
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(second, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 150, 150))); // |first| disappeared from the chunk.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateAddLastOverlap)
|
| +TEST_P(PaintControllerTest, UpdateAddLastOverlap)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 150, 150));
|
| + FakeDisplayItemClient second("second", LayoutRect(200, 200, 50, 50));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 150, 150));
|
| @@ -409,10 +533,14 @@ TEST_F_OR_P(PaintControllerTest, UpdateAddLastOverlap)
|
| TestDisplayItem(first, backgroundDrawingType),
|
| TestDisplayItem(first, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| first.setDisplayItemsUncached();
|
| + first.setVisualRect(LayoutRect(150, 150, 100, 100));
|
| second.setDisplayItemsUncached();
|
| - drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| - drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 150, 150));
|
| + drawRect(context, first, backgroundDrawingType, FloatRect(150, 150, 100, 100));
|
| + drawRect(context, first, foregroundDrawingType, FloatRect(150, 150, 100, 100));
|
| drawRect(context, second, backgroundDrawingType, FloatRect(200, 200, 50, 50));
|
| drawRect(context, second, foregroundDrawingType, FloatRect(200, 200, 50, 50));
|
| EXPECT_EQ(0, numCachedNewItems());
|
| @@ -424,7 +552,18 @@ TEST_F_OR_P(PaintControllerTest, UpdateAddLastOverlap)
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(second, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 150, 150), // Old bounds of |first|.
|
| + FloatRect(150, 150, 100, 100), // New bounds of |first|.
|
| + FloatRect(200, 200, 50, 50))); // |second| newly appeared in the chunk.
|
| +
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| + }
|
| +
|
| first.setDisplayItemsUncached();
|
| + first.setVisualRect(LayoutRect(100, 100, 150, 150));
|
| second.setDisplayItemsUncached();
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| drawRect(context, first, foregroundDrawingType, FloatRect(100, 100, 150, 150));
|
| @@ -434,18 +573,32 @@ TEST_F_OR_P(PaintControllerTest, UpdateAddLastOverlap)
|
| EXPECT_DISPLAY_LIST(getPaintController().getDisplayItemList(), 2,
|
| TestDisplayItem(first, backgroundDrawingType),
|
| TestDisplayItem(first, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(150, 150, 100, 100), // Old bounds of |first|.
|
| + FloatRect(100, 100, 150, 150), // New bounds of |first|.
|
| + FloatRect(200, 200, 50, 50))); // |second| disappeared from the chunk.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, UpdateClip)
|
| +TEST_P(PaintControllerTest, UpdateClip)
|
| {
|
| - FakeDisplayItemClient first("first");
|
| - FakeDisplayItemClient second("second");
|
| + FakeDisplayItemClient first("first", LayoutRect(100, 100, 150, 150));
|
| + FakeDisplayItemClient second("second", LayoutRect(100, 100, 200, 200));
|
| GraphicsContext context(getPaintController());
|
|
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(first, clipType);
|
| + PaintChunkProperties properties;
|
| + properties.clip = ClipPaintPropertyNode::create(nullptr, nullptr, FloatRoundedRect(1, 1, 2, 2));
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, properties);
|
| + }
|
| ClipRecorder clipRecorder(context, first, clipType, IntRect(1, 1, 2, 2));
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| - drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| + drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 200, 200));
|
| }
|
| getPaintController().commitNewDisplayItems();
|
|
|
| @@ -455,9 +608,12 @@ TEST_F_OR_P(PaintControllerTest, UpdateClip)
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(first, DisplayItem::clipTypeToEndClipType(clipType)));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| first.setDisplayItemsUncached();
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| - drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| + drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 200, 200));
|
|
|
| EXPECT_EQ(1, numCachedNewItems());
|
| #if DCHECK_IS_ON()
|
| @@ -472,11 +628,25 @@ TEST_F_OR_P(PaintControllerTest, UpdateClip)
|
| TestDisplayItem(first, backgroundDrawingType),
|
| TestDisplayItem(second, backgroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect()))); // This is a new chunk.
|
| +
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| + }
|
| +
|
| second.setDisplayItemsUncached();
|
| drawRect(context, first, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(second, clipType);
|
| + PaintChunkProperties properties;
|
| + properties.clip = ClipPaintPropertyNode::create(nullptr, nullptr, FloatRoundedRect(1, 1, 2, 2));
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, properties);
|
| + }
|
| ClipRecorder clipRecorder(context, second, clipType, IntRect(1, 1, 2, 2));
|
| - drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 150, 150));
|
| + drawRect(context, second, backgroundDrawingType, FloatRect(100, 100, 200, 200));
|
| }
|
| getPaintController().commitNewDisplayItems();
|
|
|
| @@ -485,9 +655,17 @@ TEST_F_OR_P(PaintControllerTest, UpdateClip)
|
| TestDisplayItem(second, clipType),
|
| TestDisplayItem(second, backgroundDrawingType),
|
| TestDisplayItem(second, DisplayItem::clipTypeToEndClipType(clipType)));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(2u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 200, 200))); // |second| disappeared from the first chunk.
|
| + EXPECT_THAT(getPaintController().paintChunks()[1].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect()))); // This is a new chunk.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, CachedDisplayItems)
|
| +TEST_P(PaintControllerTest, CachedDisplayItems)
|
| {
|
| FakeDisplayItemClient first("first");
|
| FakeDisplayItemClient second("second");
|
| @@ -529,13 +707,15 @@ TEST_F_OR_P(PaintControllerTest, CachedDisplayItems)
|
| EXPECT_FALSE(getPaintController().clientCacheIsValid(second));
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, ComplexUpdateSwapOrder)
|
| +TEST_P(PaintControllerTest, ComplexUpdateSwapOrder)
|
| {
|
| - FakeDisplayItemClient container1("container1");
|
| - FakeDisplayItemClient content1("content1");
|
| - FakeDisplayItemClient container2("container2");
|
| - FakeDisplayItemClient content2("content2");
|
| + FakeDisplayItemClient container1("container1", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient content1("content1", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient container2("container2", LayoutRect(100, 200, 100, 100));
|
| + FakeDisplayItemClient content2("content2", LayoutRect(100, 200, 50, 200));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -557,6 +737,9 @@ TEST_F_OR_P(PaintControllerTest, ComplexUpdateSwapOrder)
|
| TestDisplayItem(content2, foregroundDrawingType),
|
| TestDisplayItem(container2, foregroundDrawingType));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| +
|
| // Simulate the situation when container1 e.g. gets a z-index that is now greater than container2.
|
| container1.setDisplayItemsUncached();
|
| drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100));
|
| @@ -578,17 +761,34 @@ TEST_F_OR_P(PaintControllerTest, ComplexUpdateSwapOrder)
|
| TestDisplayItem(content1, backgroundDrawingType),
|
| TestDisplayItem(content1, foregroundDrawingType),
|
| TestDisplayItem(container1, foregroundDrawingType));
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + // TODO(wangxianzhu): In real world we invalidate clients with reordered display items.
|
| + // Need to support raster invalidation for recordered display items without invalidating clients.
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 100, 100), // Old bounds of |container1|.
|
| + FloatRect(100, 100, 100, 100))); // New bounds of |container1|.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, CachedSubsequenceSwapOrder)
|
| +TEST_P(PaintControllerTest, CachedSubsequenceSwapOrder)
|
| {
|
| - FakeDisplayItemClient container1("container1");
|
| - FakeDisplayItemClient content1("content1");
|
| - FakeDisplayItemClient container2("container2");
|
| - FakeDisplayItemClient content2("content2");
|
| + FakeDisplayItemClient container1("container1", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient content1("content1", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient container2("container2", LayoutRect(100, 200, 100, 100));
|
| + FakeDisplayItemClient content2("content2", LayoutRect(100, 200, 50, 200));
|
| GraphicsContext context(getPaintController());
|
|
|
| + PaintChunkProperties container1Properties;
|
| + PaintChunkProperties container2Properties;
|
| +
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container1, backgroundDrawingType);
|
| + container1Properties.effect = EffectPaintPropertyNode::create(nullptr, 0.5);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container1Properties);
|
| + }
|
| SubsequenceRecorder r(context, container1);
|
| drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -596,6 +796,11 @@ TEST_F_OR_P(PaintControllerTest, CachedSubsequenceSwapOrder)
|
| drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100));
|
| }
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container2, backgroundDrawingType);
|
| + container2Properties.effect = EffectPaintPropertyNode::create(nullptr, 0.5);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container2Properties);
|
| + }
|
| SubsequenceRecorder r(context, container2);
|
| drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100));
|
| drawRect(context, content2, backgroundDrawingType, FloatRect(100, 200, 50, 200));
|
| @@ -619,12 +824,26 @@ TEST_F_OR_P(PaintControllerTest, CachedSubsequenceSwapOrder)
|
| TestDisplayItem(container2, foregroundDrawingType),
|
| TestDisplayItem(container2, DisplayItem::EndSubsequence));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(2u, getPaintController().paintChunks().size());
|
| + EXPECT_EQ(PaintChunk::Id(container1, backgroundDrawingType), getPaintController().paintChunks()[0].id);
|
| + EXPECT_EQ(PaintChunk::Id(container2, backgroundDrawingType), getPaintController().paintChunks()[1].id);
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect())));
|
| + EXPECT_THAT(getPaintController().paintChunks()[1].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect())));
|
| + }
|
| +
|
| // Simulate the situation when container1 e.g. gets a z-index that is now greater than container2.
|
| if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) {
|
| // When under-invalidation-checking is enabled, useCachedSubsequenceIfPossible is forced off,
|
| // and the client is expected to create the same painting as in the previous paint.
|
| EXPECT_FALSE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, container2));
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container2, backgroundDrawingType);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container2Properties);
|
| + }
|
| SubsequenceRecorder r(context, container2);
|
| drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100));
|
| drawRect(context, content2, backgroundDrawingType, FloatRect(100, 200, 50, 200));
|
| @@ -633,6 +852,10 @@ TEST_F_OR_P(PaintControllerTest, CachedSubsequenceSwapOrder)
|
| }
|
| EXPECT_FALSE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, container1));
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container1, backgroundDrawingType);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container1Properties);
|
| + }
|
| SubsequenceRecorder r(context, container1);
|
| drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| @@ -671,9 +894,18 @@ TEST_F_OR_P(PaintControllerTest, CachedSubsequenceSwapOrder)
|
| #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
|
| DisplayItemClient::endShouldKeepAliveAllClients();
|
| #endif
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(2u, getPaintController().paintChunks().size());
|
| + EXPECT_EQ(PaintChunk::Id(container2, backgroundDrawingType), getPaintController().paintChunks()[0].id);
|
| + EXPECT_EQ(PaintChunk::Id(container1, backgroundDrawingType), getPaintController().paintChunks()[1].id);
|
| + // Swapping order of chunks should not invalidate anything.
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre());
|
| + EXPECT_THAT(getPaintController().paintChunks()[1].rasterInvalidationRects, UnorderedElementsAre());
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, OutOfOrderNoCrash)
|
| +TEST_P(PaintControllerTest, OutOfOrderNoCrash)
|
| {
|
| FakeDisplayItemClient client("client");
|
| GraphicsContext context(getPaintController());
|
| @@ -698,28 +930,59 @@ TEST_F_OR_P(PaintControllerTest, OutOfOrderNoCrash)
|
| getPaintController().commitNewDisplayItems();
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, CachedNestedSubsequenceUpdate)
|
| +TEST_P(PaintControllerTest, CachedNestedSubsequenceUpdate)
|
| {
|
| - FakeDisplayItemClient container1("container1");
|
| - FakeDisplayItemClient content1("content1");
|
| - FakeDisplayItemClient container2("container2");
|
| - FakeDisplayItemClient content2("content2");
|
| + FakeDisplayItemClient container1("container1", LayoutRect(100, 100, 100, 100));
|
| + FakeDisplayItemClient content1("content1", LayoutRect(100, 100, 50, 200));
|
| + FakeDisplayItemClient container2("container2", LayoutRect(100, 200, 100, 100));
|
| + FakeDisplayItemClient content2("content2", LayoutRect(100, 200, 50, 200));
|
| GraphicsContext context(getPaintController());
|
|
|
| + PaintChunkProperties container1BackgroundProperties;
|
| + PaintChunkProperties content1Properties;
|
| + PaintChunkProperties container1ForegroundProperties;
|
| + PaintChunkProperties container2BackgroundProperties;
|
| + PaintChunkProperties content2Properties;
|
| +
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container1, backgroundDrawingType);
|
| + container1BackgroundProperties.effect = EffectPaintPropertyNode::create(nullptr, 0.5);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container1BackgroundProperties);
|
| + }
|
| SubsequenceRecorder r(context, container1);
|
| drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(content1, backgroundDrawingType);
|
| + content1Properties.effect = EffectPaintPropertyNode::create(nullptr, 0.6);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, content1Properties);
|
| + }
|
| SubsequenceRecorder r(context, content1);
|
| drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| drawRect(context, content1, foregroundDrawingType, FloatRect(100, 100, 50, 200));
|
| }
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container1, foregroundDrawingType);
|
| + container1ForegroundProperties.effect = EffectPaintPropertyNode::create(nullptr, 0.5);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container1ForegroundProperties);
|
| + }
|
| drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100));
|
| }
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container2, backgroundDrawingType);
|
| + container2BackgroundProperties.effect = EffectPaintPropertyNode::create(nullptr, 0.7);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container2BackgroundProperties);
|
| + }
|
| SubsequenceRecorder r(context, container2);
|
| drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100));
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(content2, backgroundDrawingType);
|
| + content2Properties.effect = EffectPaintPropertyNode::create(nullptr, 0.8);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, content2Properties);
|
| + }
|
| SubsequenceRecorder r(context, content2);
|
| drawRect(context, content2, backgroundDrawingType, FloatRect(100, 200, 50, 200));
|
| }
|
| @@ -743,6 +1006,20 @@ TEST_F_OR_P(PaintControllerTest, CachedNestedSubsequenceUpdate)
|
| TestDisplayItem(content2, DisplayItem::EndSubsequence),
|
| TestDisplayItem(container2, DisplayItem::EndSubsequence));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(5u, getPaintController().paintChunks().size());
|
| + EXPECT_EQ(PaintChunk::Id(container1, backgroundDrawingType), getPaintController().paintChunks()[0].id);
|
| + EXPECT_EQ(PaintChunk::Id(content1, backgroundDrawingType), getPaintController().paintChunks()[1].id);
|
| + EXPECT_EQ(PaintChunk::Id(container1, foregroundDrawingType), getPaintController().paintChunks()[2].id);
|
| + EXPECT_EQ(PaintChunk::Id(container2, backgroundDrawingType), getPaintController().paintChunks()[3].id);
|
| + EXPECT_EQ(PaintChunk::Id(content2, backgroundDrawingType), getPaintController().paintChunks()[4].id);
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(FloatRect(LayoutRect::infiniteIntRect())));
|
| + EXPECT_THAT(getPaintController().paintChunks()[1].rasterInvalidationRects, UnorderedElementsAre(FloatRect(LayoutRect::infiniteIntRect())));
|
| + EXPECT_THAT(getPaintController().paintChunks()[2].rasterInvalidationRects, UnorderedElementsAre(FloatRect(LayoutRect::infiniteIntRect())));
|
| + EXPECT_THAT(getPaintController().paintChunks()[3].rasterInvalidationRects, UnorderedElementsAre(FloatRect(LayoutRect::infiniteIntRect())));
|
| + EXPECT_THAT(getPaintController().paintChunks()[4].rasterInvalidationRects, UnorderedElementsAre(FloatRect(LayoutRect::infiniteIntRect())));
|
| + }
|
| +
|
| // Invalidate container1 but not content1.
|
| container1.setDisplayItemsUncached();
|
|
|
| @@ -755,6 +1032,10 @@ TEST_F_OR_P(PaintControllerTest, CachedNestedSubsequenceUpdate)
|
| EXPECT_FALSE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, content2));
|
| // Content2 now outputs foreground only.
|
| {
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(content2, foregroundDrawingType);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, content2Properties);
|
| + }
|
| SubsequenceRecorder r(context, content2);
|
| drawRect(context, content2, foregroundDrawingType, FloatRect(100, 200, 50, 200));
|
| }
|
| @@ -767,12 +1048,20 @@ TEST_F_OR_P(PaintControllerTest, CachedNestedSubsequenceUpdate)
|
| // When under-invalidation-checking is enabled, useCachedSubsequenceIfPossible is forced off,
|
| // and the client is expected to create the same painting as in the previous paint.
|
| EXPECT_FALSE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, content1));
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(content1, backgroundDrawingType);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, content1Properties);
|
| + }
|
| SubsequenceRecorder r(context, content1);
|
| drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 50, 200));
|
| drawRect(context, content1, foregroundDrawingType, FloatRect(100, 100, 50, 200));
|
| } else {
|
| EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, content1));
|
| }
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + PaintChunk::Id id(container1, foregroundDrawingType);
|
| + getPaintController().updateCurrentPaintChunkProperties(&id, container1ForegroundProperties);
|
| + }
|
| drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100));
|
| }
|
|
|
| @@ -798,16 +1087,34 @@ TEST_F_OR_P(PaintControllerTest, CachedNestedSubsequenceUpdate)
|
| TestDisplayItem(container1, foregroundDrawingType),
|
| TestDisplayItem(container1, DisplayItem::EndSubsequence));
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(3u, getPaintController().paintChunks().size());
|
| + EXPECT_EQ(PaintChunk::Id(content2, foregroundDrawingType), getPaintController().paintChunks()[0].id);
|
| + EXPECT_EQ(PaintChunk::Id(content1, backgroundDrawingType), getPaintController().paintChunks()[1].id);
|
| + EXPECT_EQ(PaintChunk::Id(container1, foregroundDrawingType), getPaintController().paintChunks()[2].id);
|
| + // This is a new chunk.
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(LayoutRect::infiniteIntRect())));
|
| + // This chunk didn't change.
|
| + EXPECT_THAT(getPaintController().paintChunks()[1].rasterInvalidationRects, UnorderedElementsAre());
|
| + // |container1| is invalidated.
|
| + EXPECT_THAT(getPaintController().paintChunks()[2].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 100, 100), // Old bounds of |container1|.
|
| + FloatRect(100, 100, 100, 100))); // New bounds of |container1|.
|
| + }
|
| +
|
| #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
|
| DisplayItemClient::endShouldKeepAliveAllClients();
|
| #endif
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, SkipCache)
|
| +TEST_P(PaintControllerTest, SkipCache)
|
| {
|
| - FakeDisplayItemClient multicol("multicol");
|
| - FakeDisplayItemClient content("content");
|
| + FakeDisplayItemClient multicol("multicol", LayoutRect(100, 100, 200, 200));
|
| + FakeDisplayItemClient content("content", LayoutRect(100, 100, 100, 100));
|
| GraphicsContext context(getPaintController());
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
|
|
| FloatRect rect1(100, 100, 50, 50);
|
| FloatRect rect2(150, 100, 50, 50);
|
| @@ -830,6 +1137,13 @@ TEST_F_OR_P(PaintControllerTest, SkipCache)
|
| RefPtr<const SkPicture> picture2 = static_cast<const DrawingDisplayItem&>(getPaintController().getDisplayItemList()[2]).picture();
|
| EXPECT_NE(picture1, picture2);
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(FloatRect(LayoutRect::infiniteIntRect())));
|
| +
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| + }
|
| +
|
| // Draw again with nothing invalidated.
|
| EXPECT_TRUE(getPaintController().clientCacheIsValid(multicol));
|
| drawRect(context, multicol, backgroundDrawingType, FloatRect(100, 200, 100, 100));
|
| @@ -855,6 +1169,15 @@ TEST_F_OR_P(PaintControllerTest, SkipCache)
|
| EXPECT_NE(picture1, static_cast<const DrawingDisplayItem&>(getPaintController().getDisplayItemList()[1]).picture());
|
| EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(getPaintController().getDisplayItemList()[2]).picture());
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 100, 100), // Old bounds of |content|.
|
| + FloatRect(100, 100, 100, 100))); // New bounds of |content|.
|
| +
|
| + getPaintController().updateCurrentPaintChunkProperties(&m_rootPaintChunkId, PaintChunkProperties());
|
| + }
|
| +
|
| // Now the multicol becomes 3 columns and repaints.
|
| multicol.setDisplayItemsUncached();
|
| drawRect(context, multicol, backgroundDrawingType, FloatRect(100, 100, 100, 100));
|
| @@ -875,9 +1198,18 @@ TEST_F_OR_P(PaintControllerTest, SkipCache)
|
| EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(getPaintController().newDisplayItemList()[2]).picture());
|
|
|
| getPaintController().commitNewDisplayItems();
|
| +
|
| + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| + EXPECT_EQ(1u, getPaintController().paintChunks().size());
|
| + EXPECT_THAT(getPaintController().paintChunks()[0].rasterInvalidationRects, UnorderedElementsAre(
|
| + FloatRect(100, 100, 200, 200), // Old bounds of |multicol|.
|
| + FloatRect(100, 100, 200, 200), // New bounds of |multicol|.
|
| + FloatRect(100, 100, 100, 100), // Old bounds of |content|.
|
| + FloatRect(100, 100, 100, 100))); // New bounds of |content|.
|
| + }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, PartialSkipCache)
|
| +TEST_P(PaintControllerTest, PartialSkipCache)
|
| {
|
| FakeDisplayItemClient content("content");
|
| GraphicsContext context(getPaintController());
|
| @@ -932,7 +1264,7 @@ TEST_F_OR_P(PaintControllerTest, PartialSkipCache)
|
| EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(getPaintController().getDisplayItemList()[2]).picture());
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, OptimizeNoopPairs)
|
| +TEST_F(PaintControllerTestBase, OptimizeNoopPairs)
|
| {
|
| FakeDisplayItemClient first("first");
|
| FakeDisplayItemClient second("second");
|
| @@ -985,7 +1317,7 @@ TEST_F_OR_P(PaintControllerTest, OptimizeNoopPairs)
|
| TestDisplayItem(third, backgroundDrawingType));
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, SmallPaintControllerHasOnePaintChunk)
|
| +TEST_F(PaintControllerTestBase, SmallPaintControllerHasOnePaintChunk)
|
| {
|
| RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true);
|
| FakeDisplayItemClient client("test client");
|
| @@ -1000,16 +1332,7 @@ TEST_F_OR_P(PaintControllerTest, SmallPaintControllerHasOnePaintChunk)
|
| EXPECT_EQ(1u, paintChunks[0].endIndex);
|
| }
|
|
|
| -#define EXPECT_RECT_EQ(expected, actual) \
|
| - do { \
|
| - const IntRect& actualRect = actual; \
|
| - EXPECT_EQ(expected.x(), actualRect.x()); \
|
| - EXPECT_EQ(expected.y(), actualRect.y()); \
|
| - EXPECT_EQ(expected.width(), actualRect.width()); \
|
| - EXPECT_EQ(expected.height(), actualRect.height()); \
|
| - } while (false)
|
| -
|
| -TEST_F_OR_P(PaintControllerTest, PaintArtifactWithVisualRects)
|
| +TEST_F(PaintControllerTestBase, PaintArtifactWithVisualRects)
|
| {
|
| FakeDisplayItemClient client("test client", LayoutRect(0, 0, 200, 100));
|
|
|
| @@ -1019,7 +1342,7 @@ TEST_F_OR_P(PaintControllerTest, PaintArtifactWithVisualRects)
|
| getPaintController().commitNewDisplayItems(LayoutSize(20, 30));
|
| const auto& paintArtifact = getPaintController().paintArtifact();
|
| ASSERT_EQ(1u, paintArtifact.getDisplayItemList().size());
|
| - EXPECT_RECT_EQ(IntRect(-20, -30, 200, 100), visualRect(paintArtifact, 0));
|
| + EXPECT_EQ(IntRect(-20, -30, 200, 100), visualRect(paintArtifact, 0));
|
| }
|
|
|
| void drawPath(GraphicsContext& context, DisplayItemClient& client, DisplayItem::Type type, unsigned count)
|
| @@ -1041,7 +1364,7 @@ void drawPath(GraphicsContext& context, DisplayItemClient& client, DisplayItem::
|
| context.drawPath(path, paint);
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, IsSuitableForGpuRasterizationSinglePath)
|
| +TEST_F(PaintControllerTestBase, IsSuitableForGpuRasterizationSinglePath)
|
| {
|
| FakeDisplayItemClient client("test client", LayoutRect(0, 0, 200, 100));
|
| GraphicsContext context(getPaintController());
|
| @@ -1050,7 +1373,7 @@ TEST_F_OR_P(PaintControllerTest, IsSuitableForGpuRasterizationSinglePath)
|
| EXPECT_TRUE(getPaintController().paintArtifact().isSuitableForGpuRasterization());
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationSinglePictureManyPaths)
|
| +TEST_F(PaintControllerTestBase, IsNotSuitableForGpuRasterizationSinglePictureManyPaths)
|
| {
|
| FakeDisplayItemClient client("test client", LayoutRect(0, 0, 200, 100));
|
| GraphicsContext context(getPaintController());
|
| @@ -1060,7 +1383,7 @@ TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationSinglePictureMa
|
| EXPECT_FALSE(getPaintController().paintArtifact().isSuitableForGpuRasterization());
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationMultiplePicturesSinglePathEach)
|
| +TEST_F(PaintControllerTestBase, IsNotSuitableForGpuRasterizationMultiplePicturesSinglePathEach)
|
| {
|
| FakeDisplayItemClient client("test client", LayoutRect(0, 0, 200, 100));
|
| GraphicsContext context(getPaintController());
|
| @@ -1074,7 +1397,7 @@ TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationMultiplePicture
|
| EXPECT_FALSE(getPaintController().paintArtifact().isSuitableForGpuRasterization());
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationSinglePictureManyPathsTwoPaints)
|
| +TEST_F(PaintControllerTestBase, IsNotSuitableForGpuRasterizationSinglePictureManyPathsTwoPaints)
|
| {
|
| FakeDisplayItemClient client("test client", LayoutRect(0, 0, 200, 100));
|
|
|
| @@ -1095,7 +1418,7 @@ TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationSinglePictureMa
|
| }
|
| }
|
|
|
| -TEST_F_OR_P(PaintControllerTest, IsNotSuitableForGpuRasterizationSinglePictureManyPathsCached)
|
| +TEST_F(PaintControllerTestBase, IsNotSuitableForGpuRasterizationSinglePictureManyPathsCached)
|
| {
|
| FakeDisplayItemClient client("test client", LayoutRect(0, 0, 200, 100));
|
|
|
| @@ -1137,7 +1460,7 @@ TEST_F(PaintControllerTestBase, IsNotSuitableForGpuRasterizationSinglePictureMan
|
| }
|
|
|
| // Temporarily disabled (pref regressions due to GPU veto stickiness: http://crbug.com/603969).
|
| -TEST_F_OR_P(PaintControllerTest, DISABLED_IsNotSuitableForGpuRasterizationConcaveClipPath)
|
| +TEST_F(PaintControllerTestBase, DISABLED_IsNotSuitableForGpuRasterizationConcaveClipPath)
|
| {
|
| Path path;
|
| path.addLineTo(FloatPoint(50, 50));
|
|
|