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

Side by Side Diff: third_party/WebKit/Source/core/paint/BoxPaintInvalidatorTest.cpp

Issue 2449953005: [SPInvalidation] Handle pixel-snapping of paint invalidation rects (Closed)
Patch Set: PaintInvalidationRectInBacking struct Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698