TEST_F(CompositedLayerMappingTest, RotatedInterestRect) { setBodyInnerHTML( "<div id='target' style='width: 200px; height: 200px; will-change: transform; transform: rotateZ(45deg)'></div>"); document().view()->updateAllLifecyclePhases(); Element* element = document().getElementById("target"); PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), recomputeInterestRect(paintLayer->graphicsLayerBacking())); }
TEST_F(CompositedLayerMappingTest, TallLayerInterestRect) { setBodyInnerHTML("<div id='target' style='width: 200px; height: 10000px; will-change: transform'></div>"); document().view()->updateAllLifecyclePhases(); Element* element = document().getElementById("target"); PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); ASSERT_TRUE(paintLayer->graphicsLayerBacking()); // Screen-space visible content rect is [8, 8, 200, 600]. Mapping back to local, adding 4000px in all directions, then // clipping, yields this rect. EXPECT_RECT_EQ(IntRect(0, 0, 200, 4592), recomputeInterestRect(paintLayer->graphicsLayerBacking())); }
// 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_F(CompositedLayerMappingTest, TallLayerWholeDocumentInterestRect) { setBodyInnerHTML("<div id='target' style='width: 200px; height: 10000px; will-change: transform'></div>"); document().settings()->setMainFrameClipsContent(false); document().view()->updateAllLifecyclePhases(); Element* element = document().getElementById("target"); PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); ASSERT_TRUE(paintLayer->graphicsLayerBacking()); ASSERT_TRUE(paintLayer->compositedLayerMapping()); // recomputeInterestRect computes the interest rect; computeInterestRect applies the extra setting to paint everything. EXPECT_RECT_EQ(IntRect(0, 0, 200, 4592), recomputeInterestRect(paintLayer->graphicsLayerBacking())); EXPECT_RECT_EQ(IntRect(0, 0, 200, 10000), computeInterestRect(paintLayer->compositedLayerMapping(), paintLayer->graphicsLayerBacking(), IntRect())); }
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_P(CompositedLayerMappingTest, RotatedInterestRectNear90Degrees) { setBodyInnerHTML( "<div id='target' style='width: 10000px; height: 200px; will-change: " "transform; transform: rotateY(89.9999deg)'></div>"); document().view()->updateAllLifecyclePhases(); Element* element = document().getElementById("target"); PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); // Because the layer is rotated to almost 90 degrees, floating-point error // leads to a reverse-projected rect that is much much larger than the // original layer size in certain dimensions. In such cases, we often fall // back to the 4000px interest rect padding amount. EXPECT_RECT_EQ(IntRect(0, 0, 4000, 200), recomputeInterestRect(paintLayer->graphicsLayerBacking())); }
void RenderedPosition::positionInGraphicsLayerBacking(CompositedSelectionBound& bound) const { bound.layer = nullptr; bound.edgeTopInLayer = bound.edgeBottomInLayer = FloatPoint(); if (isNull()) return; LayoutRect rect = m_layoutObject->localCaretRect(m_inlineBox, m_offset); PaintLayer* layer = nullptr; bound.edgeTopInLayer = m_layoutObject->localToInvalidationBackingPoint(rect.minXMinYCorner(), &layer); bound.edgeBottomInLayer = m_layoutObject->localToInvalidationBackingPoint(rect.minXMaxYCorner(), nullptr); bound.layer = layer ? layer->graphicsLayerBacking() : nullptr; }
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()); }