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/paint/PaintLayerScrollableArea.h" | 5 #include "core/paint/PaintLayerScrollableArea.h" |
6 | 6 |
7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
8 #include "core/layout/LayoutBoxModelObject.h" | 8 #include "core/layout/LayoutBoxModelObject.h" |
9 #include "core/layout/LayoutTestHelper.h" | 9 #include "core/layout/LayoutTestHelper.h" |
10 #include "core/paint/PaintLayer.h" | 10 #include "core/paint/PaintLayer.h" |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 // the outline is drawn into the decoration layer which will not be covered | 149 // the outline is drawn into the decoration layer which will not be covered |
150 // up. | 150 // up. |
151 EXPECT_TRUE(canPaintBackgroundOntoScrollingContentsLayer("scroller15")); | 151 EXPECT_TRUE(canPaintBackgroundOntoScrollingContentsLayer("scroller15")); |
152 | 152 |
153 // #scroller16 cannot paint background into scrolling contents layer because | 153 // #scroller16 cannot paint background into scrolling contents layer because |
154 // the scroller has a clip which would not be respected by the scrolling | 154 // the scroller has a clip which would not be respected by the scrolling |
155 // contents layer. | 155 // contents layer. |
156 EXPECT_FALSE(canPaintBackgroundOntoScrollingContentsLayer("scroller16")); | 156 EXPECT_FALSE(canPaintBackgroundOntoScrollingContentsLayer("scroller16")); |
157 } | 157 } |
158 | 158 |
159 TEST_F(PaintLayerScrollableAreaTest, OpaqueContainedLayersPromoted) { | 159 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromoted) { |
160 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 160 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
161 | 161 |
162 setBodyInnerHTML( | 162 setBodyInnerHTML( |
163 "<style>" | 163 "<style>" |
164 "#scroller { overflow: scroll; height: 200px; width: 200px; " | 164 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
165 "contain: paint; background: white local content-box; " | 165 "white local content-box; border: 10px solid rgba(0, 255, 0, 0.5); }" |
166 "border: 10px solid rgba(0, 255, 0, 0.5); }" | |
167 "#scrolled { height: 300px; }" | 166 "#scrolled { height: 300px; }" |
168 "</style>" | 167 "</style>" |
169 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 168 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
170 document().view()->updateAllLifecyclePhases(); | 169 document().view()->updateAllLifecyclePhases(); |
171 | 170 |
172 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 171 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
173 Element* scroller = document().getElementById("scroller"); | 172 Element* scroller = document().getElementById("scroller"); |
174 PaintLayer* paintLayer = | 173 PaintLayer* paintLayer = |
175 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 174 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
176 ASSERT_TRUE(paintLayer); | 175 ASSERT_TRUE(paintLayer); |
177 EXPECT_TRUE(paintLayer->needsCompositedScrolling()); | 176 EXPECT_TRUE(paintLayer->needsCompositedScrolling()); |
178 EXPECT_TRUE(paintLayer->graphicsLayerBacking()); | 177 EXPECT_TRUE(paintLayer->graphicsLayerBacking()); |
179 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); | 178 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); |
180 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); | 179 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); |
181 } | 180 } |
182 | 181 |
183 // Tests that we don't promote scrolling content which would not be contained. | |
184 // Promoting the scroller would also require promoting the positioned div | |
185 // which would lose subpixel anti-aliasing due to its transparent background. | |
186 TEST_F(PaintLayerScrollableAreaTest, NonContainedLayersNotPromoted) { | |
187 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | |
188 | |
189 setBodyInnerHTML( | |
190 "<style>" | |
191 "#scroller { overflow: scroll; height: 200px; width: 200px; " | |
192 "background: white local content-box; " | |
193 "border: 10px solid rgba(0, 255, 0, 0.5); }" | |
194 "#scrolled { height: 300px; }" | |
195 "#positioned { position: relative; }" | |
196 "</style>" | |
197 "<div id=\"scroller\">" | |
198 " <div id=\"positioned\">Not contained by scroller.</div>" | |
199 " <div id=\"scrolled\"></div>" | |
200 "</div>"); | |
201 document().view()->updateAllLifecyclePhases(); | |
202 | |
203 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | |
204 Element* scroller = document().getElementById("scroller"); | |
205 PaintLayer* paintLayer = | |
206 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | |
207 ASSERT_TRUE(paintLayer); | |
208 EXPECT_FALSE(paintLayer->needsCompositedScrolling()); | |
209 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); | |
210 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); | |
211 } | |
212 | |
213 TEST_F(PaintLayerScrollableAreaTest, TransparentLayersNotPromoted) { | 182 TEST_F(PaintLayerScrollableAreaTest, TransparentLayersNotPromoted) { |
214 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 183 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
215 | 184 |
216 setBodyInnerHTML( | 185 setBodyInnerHTML( |
217 "<style>" | 186 "<style>" |
218 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 187 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
219 "rgba(0, 255, 0, 0.5) local content-box; border: 10px solid rgba(0, 255, " | 188 "rgba(0, 255, 0, 0.5) local content-box; border: 10px solid rgba(0, 255, " |
220 "0, 0.5); contain: paint; }" | 189 "0, 0.5); }" |
221 "#scrolled { height: 300px; }" | 190 "#scrolled { height: 300px; }" |
222 "</style>" | 191 "</style>" |
223 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 192 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
224 document().view()->updateAllLifecyclePhases(); | 193 document().view()->updateAllLifecyclePhases(); |
225 | 194 |
226 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 195 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
227 Element* scroller = document().getElementById("scroller"); | 196 Element* scroller = document().getElementById("scroller"); |
228 PaintLayer* paintLayer = | 197 PaintLayer* paintLayer = |
229 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 198 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
230 ASSERT_TRUE(paintLayer); | 199 ASSERT_TRUE(paintLayer); |
231 EXPECT_FALSE(paintLayer->needsCompositedScrolling()); | 200 EXPECT_FALSE(paintLayer->needsCompositedScrolling()); |
232 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); | 201 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); |
233 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); | 202 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); |
234 } | 203 } |
235 | 204 |
236 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersDepromotedOnStyleChange) { | 205 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersDepromotedOnStyleChange) { |
237 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 206 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
238 | 207 |
239 setBodyInnerHTML( | 208 setBodyInnerHTML( |
240 "<style>" | 209 "<style>" |
241 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 210 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
242 "white local content-box; contain: paint; }" | 211 "white local content-box; }" |
243 "#scrolled { height: 300px; }" | 212 "#scrolled { height: 300px; }" |
244 "</style>" | 213 "</style>" |
245 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 214 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
246 document().view()->updateAllLifecyclePhases(); | 215 document().view()->updateAllLifecyclePhases(); |
247 | 216 |
248 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 217 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
249 Element* scroller = document().getElementById("scroller"); | 218 Element* scroller = document().getElementById("scroller"); |
250 PaintLayer* paintLayer = | 219 PaintLayer* paintLayer = |
251 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 220 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
252 ASSERT_TRUE(paintLayer); | 221 ASSERT_TRUE(paintLayer); |
(...skipping 10 matching lines...) Expand all Loading... |
263 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); | 232 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); |
264 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); | 233 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); |
265 } | 234 } |
266 | 235 |
267 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromotedOnStyleChange) { | 236 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromotedOnStyleChange) { |
268 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 237 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
269 | 238 |
270 setBodyInnerHTML( | 239 setBodyInnerHTML( |
271 "<style>" | 240 "<style>" |
272 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 241 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
273 "rgba(255,255,255,0.5) local content-box; contain: paint; }" | 242 "rgba(255,255,255,0.5) local content-box; }" |
274 "#scrolled { height: 300px; }" | 243 "#scrolled { height: 300px; }" |
275 "</style>" | 244 "</style>" |
276 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 245 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
277 document().view()->updateAllLifecyclePhases(); | 246 document().view()->updateAllLifecyclePhases(); |
278 | 247 |
279 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 248 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
280 Element* scroller = document().getElementById("scroller"); | 249 Element* scroller = document().getElementById("scroller"); |
281 PaintLayer* paintLayer = | 250 PaintLayer* paintLayer = |
282 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 251 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
283 ASSERT_TRUE(paintLayer); | 252 ASSERT_TRUE(paintLayer); |
(...skipping 13 matching lines...) Expand all Loading... |
297 | 266 |
298 // Tests that a transform on the scroller or an ancestor will prevent promotion | 267 // Tests that a transform on the scroller or an ancestor will prevent promotion |
299 // TODO(flackr): Allow integer transforms as long as all of the ancestor | 268 // TODO(flackr): Allow integer transforms as long as all of the ancestor |
300 // transforms are also integer. | 269 // transforms are also integer. |
301 TEST_F(PaintLayerScrollableAreaTest, OnlyNonTransformedOpaqueLayersPromoted) { | 270 TEST_F(PaintLayerScrollableAreaTest, OnlyNonTransformedOpaqueLayersPromoted) { |
302 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); | 271 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); |
303 | 272 |
304 setBodyInnerHTML( | 273 setBodyInnerHTML( |
305 "<style>" | 274 "<style>" |
306 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 275 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
307 "white local content-box; contain: paint; }" | 276 "white local content-box; }" |
308 "#scrolled { height: 300px; }" | 277 "#scrolled { height: 300px; }" |
309 "</style>" | 278 "</style>" |
310 "<div id=\"parent\">" | 279 "<div id=\"parent\">" |
311 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" | 280 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" |
312 "</div>"); | 281 "</div>"); |
313 document().view()->updateAllLifecyclePhases(); | 282 document().view()->updateAllLifecyclePhases(); |
314 | 283 |
315 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 284 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
316 Element* parent = document().getElementById("parent"); | 285 Element* parent = document().getElementById("parent"); |
317 Element* scroller = document().getElementById("scroller"); | 286 Element* scroller = document().getElementById("scroller"); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 } | 320 } |
352 | 321 |
353 // Test that opacity applied to the scroller or an ancestor will cause the | 322 // Test that opacity applied to the scroller or an ancestor will cause the |
354 // scrolling contents layer to not be promoted. | 323 // scrolling contents layer to not be promoted. |
355 TEST_F(PaintLayerScrollableAreaTest, OnlyOpaqueLayersPromoted) { | 324 TEST_F(PaintLayerScrollableAreaTest, OnlyOpaqueLayersPromoted) { |
356 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); | 325 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); |
357 | 326 |
358 setBodyInnerHTML( | 327 setBodyInnerHTML( |
359 "<style>" | 328 "<style>" |
360 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 329 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
361 "white local content-box; contain: paint; }" | 330 "white local content-box; }" |
362 "#scrolled { height: 300px; }" | 331 "#scrolled { height: 300px; }" |
363 "</style>" | 332 "</style>" |
364 "<div id=\"parent\">" | 333 "<div id=\"parent\">" |
365 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" | 334 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" |
366 "</div>"); | 335 "</div>"); |
367 document().view()->updateAllLifecyclePhases(); | 336 document().view()->updateAllLifecyclePhases(); |
368 | 337 |
369 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 338 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
370 Element* parent = document().getElementById("parent"); | 339 Element* parent = document().getElementById("parent"); |
371 Element* scroller = document().getElementById("scroller"); | 340 Element* scroller = document().getElementById("scroller"); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 ASSERT_TRUE(blackLayer); | 401 ASSERT_TRUE(blackLayer); |
433 | 402 |
434 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, | 403 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, |
435 noneLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); | 404 noneLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); |
436 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, | 405 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, |
437 whiteLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); | 406 whiteLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); |
438 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeLight, | 407 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeLight, |
439 blackLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); | 408 blackLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); |
440 } | 409 } |
441 } | 410 } |
OLD | NEW |