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" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 " border-style: solid;" | 52 " border-style: solid;" |
53 " border-color: red;" | 53 " border-color: red;" |
54 " }" | 54 " }" |
55 " .local-background {" | 55 " .local-background {" |
56 " background-attachment: local;" | 56 " background-attachment: local;" |
57 " overflow: scroll;" | 57 " overflow: scroll;" |
58 " }" | 58 " }" |
59 " .gradient {" | 59 " .gradient {" |
60 " background-image: linear-gradient(blue, yellow)" | 60 " background-image: linear-gradient(blue, yellow)" |
61 " }" | 61 " }" |
| 62 " .transform {" |
| 63 " transform: scale(2);" |
| 64 " }" |
62 "</style>" | 65 "</style>" |
63 "<div id='target' class='border'></div>"); | 66 "<div id='target' class='border'></div>"); |
64 } | 67 } |
65 }; | 68 }; |
66 | 69 |
67 INSTANTIATE_TEST_CASE_P(All, BoxPaintInvalidatorTest, ::testing::Bool()); | 70 INSTANTIATE_TEST_CASE_P(All, BoxPaintInvalidatorTest, ::testing::Bool()); |
68 | 71 |
69 TEST_P(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) { | 72 TEST_P(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) { |
70 document().view()->setTracksPaintInvalidations(true); | 73 document().view()->setTracksPaintInvalidations(true); |
71 Element* target = document().getElementById("target"); | 74 Element* target = document().getElementById("target"); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 EXPECT_EQ(IntRect(0, 100, 70, 40), rasterInvalidations[1].rect); | 112 EXPECT_EQ(IntRect(0, 100, 70, 40), rasterInvalidations[1].rect); |
110 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); | 113 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); |
111 document().view()->setTracksPaintInvalidations(false); | 114 document().view()->setTracksPaintInvalidations(false); |
112 } | 115 } |
113 | 116 |
114 TEST_P(BoxPaintInvalidatorTest, SubpixelVisualRectChagne) { | 117 TEST_P(BoxPaintInvalidatorTest, SubpixelVisualRectChagne) { |
115 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); | 118 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
116 | 119 |
117 Element* target = document().getElementById("target"); | 120 Element* target = document().getElementById("target"); |
118 | 121 |
119 // Should do full invalidation if new geometry has subpixels. | |
120 document().view()->setTracksPaintInvalidations(true); | 122 document().view()->setTracksPaintInvalidations(true); |
121 target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px"); | 123 target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px"); |
122 document().view()->updateAllLifecyclePhases(); | 124 document().view()->updateAllLifecyclePhases(); |
123 const auto* rasterInvalidations = | 125 const auto* rasterInvalidations = |
124 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 126 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
125 ASSERT_EQ(2u, rasterInvalidations->size()); | 127 ASSERT_EQ(2u, rasterInvalidations->size()); |
126 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); | 128 EXPECT_EQ(IntRect(60, 0, 61, 111), (*rasterInvalidations)[0].rect); |
127 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); | 129 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); |
128 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[1].rect); | 130 EXPECT_EQ(IntRect(0, 90, 70, 50), (*rasterInvalidations)[1].rect); |
129 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[1].reason); | 131 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); |
130 document().view()->setTracksPaintInvalidations(false); | 132 document().view()->setTracksPaintInvalidations(false); |
131 | 133 |
132 // Should do full invalidation if old geometry has subpixels. | |
133 document().view()->setTracksPaintInvalidations(true); | 134 document().view()->setTracksPaintInvalidations(true); |
134 target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px"); | 135 target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px"); |
135 document().view()->updateAllLifecyclePhases(); | 136 document().view()->updateAllLifecyclePhases(); |
136 rasterInvalidations = | 137 rasterInvalidations = |
137 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 138 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
138 ASSERT_EQ(2u, rasterInvalidations->size()); | 139 ASSERT_EQ(2u, rasterInvalidations->size()); |
139 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[0].rect); | 140 EXPECT_EQ(IntRect(60, 0, 61, 111), (*rasterInvalidations)[0].rect); |
| 141 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); |
| 142 EXPECT_EQ(IntRect(0, 90, 70, 50), (*rasterInvalidations)[1].rect); |
| 143 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); |
| 144 document().view()->setTracksPaintInvalidations(false); |
| 145 } |
| 146 |
| 147 TEST_P(BoxPaintInvalidatorTest, SubpixelVisualRectChangeWithTransform) { |
| 148 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 149 |
| 150 Element* target = document().getElementById("target"); |
| 151 target->setAttribute(HTMLNames::classAttr, "border transform"); |
| 152 document().view()->updateAllLifecyclePhases(); |
| 153 |
| 154 document().view()->setTracksPaintInvalidations(true); |
| 155 target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px"); |
| 156 document().view()->updateAllLifecyclePhases(); |
| 157 const auto* rasterInvalidations = |
| 158 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 159 ASSERT_EQ(2u, rasterInvalidations->size()); |
| 160 EXPECT_EQ(IntRect(0, 0, 140, 280), (*rasterInvalidations)[0].rect); |
140 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); | 161 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
141 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[1].rect); | 162 EXPECT_EQ(IntRect(0, 0, 242, 222), (*rasterInvalidations)[1].rect); |
| 163 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[1].reason); |
| 164 document().view()->setTracksPaintInvalidations(false); |
| 165 |
| 166 document().view()->setTracksPaintInvalidations(true); |
| 167 target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px"); |
| 168 document().view()->updateAllLifecyclePhases(); |
| 169 rasterInvalidations = |
| 170 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 171 ASSERT_EQ(2u, rasterInvalidations->size()); |
| 172 EXPECT_EQ(IntRect(0, 0, 242, 222), (*rasterInvalidations)[0].rect); |
| 173 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
| 174 EXPECT_EQ(IntRect(0, 0, 140, 280), (*rasterInvalidations)[1].rect); |
142 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[1].reason); | 175 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[1].reason); |
143 document().view()->setTracksPaintInvalidations(false); | 176 document().view()->setTracksPaintInvalidations(false); |
144 } | 177 } |
145 | 178 |
146 TEST_P(BoxPaintInvalidatorTest, SubpixelChangeWithoutVisualRectChange) { | 179 TEST_P(BoxPaintInvalidatorTest, SubpixelWithinPixelsChange) { |
147 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); | 180 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
148 | 181 |
149 Element* target = document().getElementById("target"); | 182 Element* target = document().getElementById("target"); |
150 LayoutObject* targetObject = target->layoutObject(); | 183 LayoutObject* targetObject = target->layoutObject(); |
151 EXPECT_EQ(LayoutRect(0, 0, 70, 140), targetObject->previousVisualRect()); | 184 EXPECT_EQ(LayoutRect(0, 0, 70, 140), targetObject->previousVisualRect()); |
152 | 185 |
153 // Should do full invalidation if new geometry has subpixels even if the paint | |
154 // invalidation rect doesn't change. | |
155 document().view()->setTracksPaintInvalidations(true); | 186 document().view()->setTracksPaintInvalidations(true); |
156 target->setAttribute(HTMLNames::styleAttr, | 187 target->setAttribute(HTMLNames::styleAttr, |
157 "margin-top: 0.6px; width: 50px; height: 99.3px"); | 188 "margin-top: 0.6px; width: 50px; height: 99.3px"); |
158 document().view()->updateAllLifecyclePhases(); | 189 document().view()->updateAllLifecyclePhases(); |
159 EXPECT_EQ(LayoutRect(0, 0, 70, 140), targetObject->previousVisualRect()); | 190 EXPECT_EQ(LayoutRect(LayoutUnit(), LayoutUnit(0.6), LayoutUnit(70), |
| 191 LayoutUnit(139.3)), |
| 192 targetObject->previousVisualRect()); |
160 const auto* rasterInvalidations = | 193 const auto* rasterInvalidations = |
161 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 194 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
162 ASSERT_EQ(1u, rasterInvalidations->size()); | 195 ASSERT_EQ(1u, rasterInvalidations->size()); |
163 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); | 196 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); |
164 EXPECT_EQ(PaintInvalidationLocationChange, (*rasterInvalidations)[0].reason); | 197 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[0].reason); |
165 document().view()->setTracksPaintInvalidations(false); | 198 document().view()->setTracksPaintInvalidations(false); |
166 | 199 |
167 document().view()->setTracksPaintInvalidations(true); | 200 document().view()->setTracksPaintInvalidations(true); |
168 target->setAttribute(HTMLNames::styleAttr, | 201 target->setAttribute(HTMLNames::styleAttr, |
169 "margin-top: 0.6px; width: 49.3px; height: 98.5px"); | 202 "margin-top: 0.6px; width: 49.3px; height: 98.5px"); |
170 document().view()->updateAllLifecyclePhases(); | 203 document().view()->updateAllLifecyclePhases(); |
171 EXPECT_EQ(LayoutRect(0, 0, 70, 140), targetObject->previousVisualRect()); | 204 EXPECT_EQ(LayoutRect(LayoutUnit(), LayoutUnit(0.6), LayoutUnit(69.3), |
| 205 LayoutUnit(138.5)), |
| 206 targetObject->previousVisualRect()); |
172 rasterInvalidations = | 207 rasterInvalidations = |
173 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 208 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
174 ASSERT_EQ(1u, rasterInvalidations->size()); | 209 ASSERT_EQ(2u, rasterInvalidations->size()); |
175 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); | 210 EXPECT_EQ(IntRect(59, 0, 11, 140), (*rasterInvalidations)[0].rect); |
176 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); | 211 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); |
| 212 EXPECT_EQ(IntRect(0, 119, 70, 21), (*rasterInvalidations)[1].rect); |
| 213 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); |
177 document().view()->setTracksPaintInvalidations(false); | 214 document().view()->setTracksPaintInvalidations(false); |
178 } | 215 } |
179 | 216 |
180 TEST_P(BoxPaintInvalidatorTest, ResizeRotated) { | 217 TEST_P(BoxPaintInvalidatorTest, ResizeRotated) { |
181 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); | 218 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
182 | 219 |
183 Element* target = document().getElementById("target"); | 220 Element* target = document().getElementById("target"); |
184 target->setAttribute(HTMLNames::styleAttr, "transform: rotate(45deg)"); | 221 target->setAttribute(HTMLNames::styleAttr, "transform: rotate(45deg)"); |
185 document().view()->updateAllLifecyclePhases(); | 222 document().view()->updateAllLifecyclePhases(); |
186 | 223 |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 getRasterInvalidationTracking()->trackedRasterInvalidations; | 584 getRasterInvalidationTracking()->trackedRasterInvalidations; |
548 ASSERT_EQ(1u, rasterInvalidations.size()); | 585 ASSERT_EQ(1u, rasterInvalidations.size()); |
549 EXPECT_EQ(IntRect(0, 120, 70, 120), rasterInvalidations[0].rect); | 586 EXPECT_EQ(IntRect(0, 120, 70, 120), rasterInvalidations[0].rect); |
550 EXPECT_EQ(static_cast<const DisplayItemClient*>(target->layoutObject()), | 587 EXPECT_EQ(static_cast<const DisplayItemClient*>(target->layoutObject()), |
551 rasterInvalidations[0].client); | 588 rasterInvalidations[0].client); |
552 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); | 589 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); |
553 document().view()->setTracksPaintInvalidations(false); | 590 document().view()->setTracksPaintInvalidations(false); |
554 } | 591 } |
555 | 592 |
556 } // namespace blink | 593 } // namespace blink |
OLD | NEW |