TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromotedOnStyleChange) { RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); setBodyInnerHTML( "<style>" "#scroller { overflow: scroll; height: 200px; width: 200px; background: " "rgba(255,255,255,0.5) local content-box; }" "#scrolled { height: 300px; }" "</style>" "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); document().view()->updateAllLifecyclePhases(); EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); Element* scroller = document().getElementById("scroller"); PaintLayer* paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_FALSE(paintLayer->needsCompositedScrolling()); // Change the background to transparent scroller->setAttribute(HTMLNames::styleAttr, "background: white local content-box;"); document().view()->updateAllLifecyclePhases(); paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_TRUE(paintLayer->needsCompositedScrolling()); EXPECT_TRUE(paintLayer->graphicsLayerBacking()); ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); }
// Test that opacity applied to the scroller or an ancestor will cause the // scrolling contents layer to not be promoted. TEST_F(PaintLayerScrollableAreaTest, OnlyOpaqueLayersPromoted) { ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); setBodyInnerHTML( "<style>" "#scroller { overflow: scroll; height: 200px; width: 200px; background: " "white local content-box; }" "#scrolled { height: 300px; }" "</style>" "<div id=\"parent\">" " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" "</div>"); document().view()->updateAllLifecyclePhases(); EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); Element* parent = document().getElementById("parent"); Element* scroller = document().getElementById("scroller"); PaintLayer* paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_TRUE(paintLayer->needsCompositedScrolling()); EXPECT_TRUE(paintLayer->graphicsLayerBacking()); ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); // Change the parent to be partially translucent. parent->setAttribute(HTMLNames::styleAttr, "opacity: 0.5;"); document().view()->updateAllLifecyclePhases(); paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_FALSE(paintLayer->needsCompositedScrolling()); EXPECT_FALSE(paintLayer->graphicsLayerBacking()); // Change the parent to be opaque again. parent->setAttribute(HTMLNames::styleAttr, "opacity: 1;"); document().view()->updateAllLifecyclePhases(); paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_TRUE(paintLayer->needsCompositedScrolling()); EXPECT_TRUE(paintLayer->graphicsLayerBacking()); ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); // Make the scroller translucent. scroller->setAttribute(HTMLNames::styleAttr, "opacity: 0.5"); document().view()->updateAllLifecyclePhases(); paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_FALSE(paintLayer->needsCompositedScrolling()); EXPECT_FALSE(paintLayer->graphicsLayerBacking()); }
TEST_P(CompositedLayerMappingTest, VerticalRightLeftWritingModeDocument) { setBodyInnerHTML( "<style>html,body { margin: 0px } html { -webkit-writing-mode: " "vertical-rl}</style> <div id='target' style='width: 10000px; height: " "200px;'></div>"); document().view()->updateAllLifecyclePhases(); document().view()->layoutViewportScrollableArea()->setScrollOffset( ScrollOffset(-5000, 0), ProgrammaticScroll); document().view()->updateAllLifecyclePhases(); PaintLayer* paintLayer = document().layoutViewItem().layer(); ASSERT_TRUE(paintLayer->graphicsLayerBacking()); ASSERT_TRUE(paintLayer->compositedLayerMapping()); // A scroll by -5000px is equivalent to a scroll by (10000 - 5000 - 800)px = // 4200px in non-RTL mode. Expanding the resulting rect by 4000px in each // direction yields this result. EXPECT_RECT_EQ( IntRect(200, 0, 8800, 600), recomputeInterestRect(paintLayer->graphicsLayerBackingForScrolling())); }
TEST_F(PaintLayerScrollableAreaTest, TransparentLayersNotPromoted) { RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); setBodyInnerHTML( "<style>" "#scroller { overflow: scroll; height: 200px; width: 200px; background: " "rgba(0, 255, 0, 0.5) local content-box; border: 10px solid rgba(0, 255, " "0, 0.5); }" "#scrolled { height: 300px; }" "</style>" "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); document().view()->updateAllLifecyclePhases(); EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); Element* scroller = document().getElementById("scroller"); PaintLayer* paintLayer = toLayoutBoxModelObject(scroller->layoutObject())->layer(); ASSERT_TRUE(paintLayer); EXPECT_FALSE(paintLayer->needsCompositedScrolling()); EXPECT_FALSE(paintLayer->graphicsLayerBacking()); EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); }