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

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

Issue 2434443005: Only automatically promote scrollers which are untransformed and opaque. (Closed)
Patch Set: Force compositing to test scrolling contents background painting Created 4 years, 2 months 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/paint/PaintLayerScrollableAreaTest.h" 5 #include "core/paint/PaintLayerScrollableAreaTest.h"
6 6
7 #include "platform/graphics/GraphicsLayer.h" 7 #include "platform/graphics/GraphicsLayer.h"
8 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
8 9
9 namespace blink { 10 namespace blink {
10 11
11 TEST_F(PaintLayerScrollableAreaTest, 12 TEST_F(PaintLayerScrollableAreaTest,
12 CanPaintBackgroundOntoScrollingContentsLayer) { 13 CanPaintBackgroundOntoScrollingContentsLayer) {
13 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true); 14 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true);
14 setBodyInnerHTML( 15 setBodyInnerHTML(
15 "<style>" 16 "<style>"
16 ".scroller { overflow: scroll; will-change: transform; width: 300px; " 17 ".scroller { overflow: scroll; will-change: transform; width: 300px; "
17 "height: 300px;} .spacer { height: 1000px; }" 18 "height: 300px;} .spacer { height: 1000px; }"
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 scroller->setAttribute(HTMLNames::styleAttr, 232 scroller->setAttribute(HTMLNames::styleAttr,
232 "background: white local content-box;"); 233 "background: white local content-box;");
233 document().view()->updateAllLifecyclePhases(); 234 document().view()->updateAllLifecyclePhases();
234 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); 235 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
235 ASSERT_TRUE(paintLayer); 236 ASSERT_TRUE(paintLayer);
236 EXPECT_TRUE(paintLayer->needsCompositedScrolling()); 237 EXPECT_TRUE(paintLayer->needsCompositedScrolling());
237 EXPECT_TRUE(paintLayer->graphicsLayerBacking()); 238 EXPECT_TRUE(paintLayer->graphicsLayerBacking());
238 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); 239 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling());
239 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); 240 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque());
240 } 241 }
242
243 // Tests that a transform on the scroller or an ancestor will prevent promotion
244 // TODO(flackr): Allow integer transforms as long as all of the ancestor
245 // transforms are also integer.
246 TEST_F(PaintLayerScrollableAreaTest, OnlyNonTransformedOpaqueLayersPromoted) {
247 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true);
248
249 setBodyInnerHTML(
250 "<style>"
251 "#scroller { overflow: scroll; height: 200px; width: 200px; background: "
252 "white local content-box; }"
253 "#scrolled { height: 300px; }"
254 "</style>"
255 "<div id=\"parent\">"
256 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>"
257 "</div>");
258 document().view()->updateAllLifecyclePhases();
259
260 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled());
261 Element* parent = document().getElementById("parent");
262 Element* scroller = document().getElementById("scroller");
263 PaintLayer* paintLayer =
264 toLayoutBoxModelObject(scroller->layoutObject())->layer();
265 ASSERT_TRUE(paintLayer);
266 EXPECT_TRUE(paintLayer->needsCompositedScrolling());
267 EXPECT_TRUE(paintLayer->graphicsLayerBacking());
268 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling());
269 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque());
270
271 // Change the parent to have a transform.
272 parent->setAttribute(HTMLNames::styleAttr, "transform: translate(1px, 0);");
273 document().view()->updateAllLifecyclePhases();
274 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
275 ASSERT_TRUE(paintLayer);
276 EXPECT_FALSE(paintLayer->needsCompositedScrolling());
277 EXPECT_FALSE(paintLayer->graphicsLayerBacking());
278
279 // Change the parent to have no transform again.
280 parent->removeAttribute(HTMLNames::styleAttr);
281 document().view()->updateAllLifecyclePhases();
282 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
283 ASSERT_TRUE(paintLayer);
284 EXPECT_TRUE(paintLayer->needsCompositedScrolling());
285 EXPECT_TRUE(paintLayer->graphicsLayerBacking());
286 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling());
287 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque());
288
289 // Apply a transform to the scroller directly.
290 scroller->setAttribute(HTMLNames::styleAttr, "transform: translate(1px, 0);");
291 document().view()->updateAllLifecyclePhases();
292 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
293 ASSERT_TRUE(paintLayer);
294 EXPECT_FALSE(paintLayer->needsCompositedScrolling());
295 EXPECT_FALSE(paintLayer->graphicsLayerBacking());
241 } 296 }
297
298 // Test that opacity applied to the scroller or an ancestor will cause the
299 // scrolling contents layer to not be promoted.
300 TEST_F(PaintLayerScrollableAreaTest, OnlyOpaqueLayersPromoted) {
301 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true);
302
303 setBodyInnerHTML(
304 "<style>"
305 "#scroller { overflow: scroll; height: 200px; width: 200px; background: "
306 "white local content-box; }"
307 "#scrolled { height: 300px; }"
308 "</style>"
309 "<div id=\"parent\">"
310 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>"
311 "</div>");
312 document().view()->updateAllLifecyclePhases();
313
314 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled());
315 Element* parent = document().getElementById("parent");
316 Element* scroller = document().getElementById("scroller");
317 PaintLayer* paintLayer =
318 toLayoutBoxModelObject(scroller->layoutObject())->layer();
319 ASSERT_TRUE(paintLayer);
320 EXPECT_TRUE(paintLayer->needsCompositedScrolling());
321 EXPECT_TRUE(paintLayer->graphicsLayerBacking());
322 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling());
323 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque());
324
325 // Change the parent to be partially translucent.
326 parent->setAttribute(HTMLNames::styleAttr, "opacity: 0.5;");
327 document().view()->updateAllLifecyclePhases();
328 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
329 ASSERT_TRUE(paintLayer);
330 EXPECT_FALSE(paintLayer->needsCompositedScrolling());
331 EXPECT_FALSE(paintLayer->graphicsLayerBacking());
332
333 // Change the parent to be opaque again.
334 parent->setAttribute(HTMLNames::styleAttr, "opacity: 1;");
335 document().view()->updateAllLifecyclePhases();
336 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
337 ASSERT_TRUE(paintLayer);
338 EXPECT_TRUE(paintLayer->needsCompositedScrolling());
339 EXPECT_TRUE(paintLayer->graphicsLayerBacking());
340 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling());
341 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque());
342
343 // Make the scroller translucent.
344 scroller->setAttribute(HTMLNames::styleAttr, "opacity: 0.5");
345 document().view()->updateAllLifecyclePhases();
346 paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer();
347 ASSERT_TRUE(paintLayer);
348 EXPECT_FALSE(paintLayer->needsCompositedScrolling());
349 EXPECT_FALSE(paintLayer->graphicsLayerBacking());
350 }
351 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698