OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/HTMLNames.h" | 5 #include "core/HTMLNames.h" |
6 #include "core/frame/FrameView.h" | 6 #include "core/frame/FrameView.h" |
7 #include "core/layout/LayoutTestHelper.h" | 7 #include "core/layout/LayoutTestHelper.h" |
8 #include "core/layout/LayoutView.h" | 8 #include "core/layout/LayoutView.h" |
9 #include "core/paint/PaintLayer.h" | 9 #include "core/paint/PaintLayer.h" |
10 #include "platform/graphics/GraphicsLayer.h" | 10 #include "platform/graphics/GraphicsLayer.h" |
11 #include "platform/graphics/paint/RasterInvalidationTracking.h" | 11 #include "platform/graphics/paint/RasterInvalidationTracking.h" |
| 12 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" |
12 | 13 |
13 namespace blink { | 14 namespace blink { |
14 | 15 |
15 class BoxPaintInvalidatorTest : public RenderingTest { | 16 class BoxPaintInvalidatorTest : public RenderingTest { |
16 protected: | 17 protected: |
17 const RasterInvalidationTracking* getRasterInvalidationTracking() const { | 18 const RasterInvalidationTracking* getRasterInvalidationTracking() const { |
18 // TODO(wangxianzhu): Test SPv2. | 19 // TODO(wangxianzhu): Test SPv2. |
19 return layoutView() | 20 return layoutView() |
20 .layer() | 21 .layer() |
21 ->graphicsLayerBacking() | 22 ->graphicsLayerBacking() |
(...skipping 17 matching lines...) Expand all Loading... |
39 "</style>" | 40 "</style>" |
40 "<div id='target'></div>"); | 41 "<div id='target'></div>"); |
41 } | 42 } |
42 }; | 43 }; |
43 | 44 |
44 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) { | 45 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) { |
45 document().view()->setTracksPaintInvalidations(true); | 46 document().view()->setTracksPaintInvalidations(true); |
46 Element* target = document().getElementById("target"); | 47 Element* target = document().getElementById("target"); |
47 target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 200px"); | 48 target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 200px"); |
48 document().view()->updateAllLifecyclePhases(); | 49 document().view()->updateAllLifecyclePhases(); |
49 const auto* rasterInvalidations = | 50 const auto& rasterInvalidations = |
50 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 51 getRasterInvalidationTracking()->trackedRasterInvalidations; |
51 EXPECT_EQ(2u, rasterInvalidations->size()); | 52 EXPECT_EQ(2u, rasterInvalidations.size()); |
52 EXPECT_EQ(IntRect(60, 0, 60, 240), (*rasterInvalidations)[0].rect); | 53 EXPECT_EQ(IntRect(60, 0, 60, 240), rasterInvalidations[0].rect); |
53 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); | 54 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); |
54 EXPECT_EQ(IntRect(0, 120, 120, 120), (*rasterInvalidations)[1].rect); | 55 EXPECT_EQ(IntRect(0, 120, 120, 120), rasterInvalidations[1].rect); |
55 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); | 56 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); |
56 document().view()->setTracksPaintInvalidations(false); | 57 document().view()->setTracksPaintInvalidations(false); |
57 } | 58 } |
58 | 59 |
59 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationShrink) { | 60 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationShrink) { |
60 document().view()->setTracksPaintInvalidations(true); | 61 document().view()->setTracksPaintInvalidations(true); |
61 Element* target = document().getElementById("target"); | 62 Element* target = document().getElementById("target"); |
62 target->setAttribute(HTMLNames::styleAttr, "width: 20px; height: 80px"); | 63 target->setAttribute(HTMLNames::styleAttr, "width: 20px; height: 80px"); |
63 document().view()->updateAllLifecyclePhases(); | 64 document().view()->updateAllLifecyclePhases(); |
64 const auto* rasterInvalidations = | 65 const auto& rasterInvalidations = |
65 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 66 getRasterInvalidationTracking()->trackedRasterInvalidations; |
66 EXPECT_EQ(2u, rasterInvalidations->size()); | 67 EXPECT_EQ(2u, rasterInvalidations.size()); |
67 EXPECT_EQ(IntRect(30, 0, 40, 140), (*rasterInvalidations)[0].rect); | 68 EXPECT_EQ(IntRect(30, 0, 40, 140), rasterInvalidations[0].rect); |
68 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); | 69 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); |
69 EXPECT_EQ(IntRect(0, 100, 70, 40), (*rasterInvalidations)[1].rect); | 70 EXPECT_EQ(IntRect(0, 100, 70, 40), rasterInvalidations[1].rect); |
70 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); | 71 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); |
71 document().view()->setTracksPaintInvalidations(false); | 72 document().view()->setTracksPaintInvalidations(false); |
72 } | 73 } |
73 | 74 |
74 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationMixed) { | 75 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationMixed) { |
75 document().view()->setTracksPaintInvalidations(true); | 76 document().view()->setTracksPaintInvalidations(true); |
76 Element* target = document().getElementById("target"); | 77 Element* target = document().getElementById("target"); |
77 target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 80px"); | 78 target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 80px"); |
78 document().view()->updateAllLifecyclePhases(); | 79 document().view()->updateAllLifecyclePhases(); |
| 80 const auto& rasterInvalidations = |
| 81 getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 82 EXPECT_EQ(2u, rasterInvalidations.size()); |
| 83 EXPECT_EQ(IntRect(60, 0, 60, 120), rasterInvalidations[0].rect); |
| 84 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); |
| 85 EXPECT_EQ(IntRect(0, 100, 70, 40), rasterInvalidations[1].rect); |
| 86 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); |
| 87 document().view()->setTracksPaintInvalidations(false); |
| 88 } |
| 89 |
| 90 TEST_F(BoxPaintInvalidatorTest, SubpixelVisualRectChagne) { |
| 91 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 92 |
| 93 Element* target = document().getElementById("target"); |
| 94 LayoutObject* targetObject = target->layoutObject(); |
| 95 EXPECT_FALSE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); |
| 96 |
| 97 // Should do full invalidation if new geometry has subpixels. |
| 98 document().view()->setTracksPaintInvalidations(true); |
| 99 target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px"); |
| 100 document().view()->updateAllLifecyclePhases(); |
| 101 EXPECT_TRUE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); |
79 const auto* rasterInvalidations = | 102 const auto* rasterInvalidations = |
80 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 103 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
81 EXPECT_EQ(2u, rasterInvalidations->size()); | 104 EXPECT_EQ(2u, rasterInvalidations->size()); |
82 EXPECT_EQ(IntRect(60, 0, 60, 120), (*rasterInvalidations)[0].rect); | 105 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); |
| 106 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[0].reason); |
| 107 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[1].rect); |
| 108 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[1].reason); |
| 109 document().view()->setTracksPaintInvalidations(false); |
| 110 |
| 111 // Should do full invalidation if old geometry has subpixels. |
| 112 document().view()->setTracksPaintInvalidations(true); |
| 113 target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px"); |
| 114 document().view()->updateAllLifecyclePhases(); |
| 115 EXPECT_FALSE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); |
| 116 rasterInvalidations = |
| 117 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 118 EXPECT_EQ(2u, rasterInvalidations->size()); |
| 119 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[0].rect); |
| 120 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[0].reason); |
| 121 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[1].rect); |
| 122 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[1].reason); |
| 123 document().view()->setTracksPaintInvalidations(false); |
| 124 } |
| 125 |
| 126 TEST_F(BoxPaintInvalidatorTest, SubpixelChangeWithoutVisualRectChange) { |
| 127 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 128 |
| 129 Element* target = document().getElementById("target"); |
| 130 LayoutObject* targetObject = target->layoutObject(); |
| 131 EXPECT_EQ(LayoutRect(0, 0, 70, 140), |
| 132 targetObject->previousPaintInvalidationRect()); |
| 133 EXPECT_FALSE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); |
| 134 |
| 135 // Should do full invalidation if new geometry has subpixels even if the paint |
| 136 // invalidation rect doesn't change. |
| 137 document().view()->setTracksPaintInvalidations(true); |
| 138 target->setAttribute(HTMLNames::styleAttr, |
| 139 "margin-top: 0.6px; width: 50px; height: 99.3px"); |
| 140 document().view()->updateAllLifecyclePhases(); |
| 141 EXPECT_EQ(LayoutRect(0, 0, 70, 140), |
| 142 targetObject->previousPaintInvalidationRect()); |
| 143 EXPECT_TRUE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); |
| 144 const auto* rasterInvalidations = |
| 145 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 146 EXPECT_EQ(1u, rasterInvalidations->size()); |
| 147 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); |
| 148 EXPECT_EQ(PaintInvalidationLocationChange, (*rasterInvalidations)[0].reason); |
| 149 document().view()->setTracksPaintInvalidations(false); |
| 150 |
| 151 // When changing size in subpixels keeping the paint invalidation rect |
| 152 // unchanged, incremental incremental should cover all the changed pixels. |
| 153 document().view()->setTracksPaintInvalidations(true); |
| 154 target->setAttribute(HTMLNames::styleAttr, |
| 155 "margin-top: 0.6px; width: 49.3px; height: 98.5px"); |
| 156 document().view()->updateAllLifecyclePhases(); |
| 157 EXPECT_EQ(LayoutRect(0, 0, 70, 140), |
| 158 targetObject->previousPaintInvalidationRect()); |
| 159 EXPECT_TRUE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); |
| 160 rasterInvalidations = |
| 161 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 162 EXPECT_EQ(2u, rasterInvalidations->size()); |
| 163 EXPECT_EQ(IntRect(59, 0, 11, 140), (*rasterInvalidations)[0].rect); |
83 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); | 164 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); |
84 EXPECT_EQ(IntRect(0, 100, 70, 40), (*rasterInvalidations)[1].rect); | 165 EXPECT_EQ(IntRect(0, 119, 70, 21), (*rasterInvalidations)[1].rect); |
85 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); | 166 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); |
86 document().view()->setTracksPaintInvalidations(false); | 167 document().view()->setTracksPaintInvalidations(false); |
87 } | 168 } |
88 | 169 |
89 } // namespace blink | 170 } // namespace blink |
OLD | NEW |