TEST_F(PaintPropertyTreeBuilderTest, PositionAndScroll) { loadTestData("position-and-scroll.html"); Element* scroller = document().getElementById("scroller"); scroller->scrollTo(0, 100); FrameView* frameView = document().view(); frameView->updateAllLifecyclePhases(); ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(0, -100), scrollerProperties->scrollTranslation()->matrix()); EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->scrollTranslation()->parent()); // The relative-positioned element should have accumulated box offset (exclude scrolling), // and should be affected by ancestor scroll transforms. Element* relPos = document().getElementById("rel-pos"); ObjectPaintProperties* relPosProperties = relPos->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(680, 1120), relPosProperties->paintOffsetTranslation()->matrix()); EXPECT_EQ(scrollerProperties->scrollTranslation(), relPosProperties->paintOffsetTranslation()->parent()); // The absolute-positioned element should not be affected by non-positioned scroller at all. Element* absPos = document().getElementById("abs-pos"); ObjectPaintProperties* absPosProperties = absPos->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(123, 456), absPosProperties->paintOffsetTranslation()->matrix()); EXPECT_EQ(frameView->scrollTranslation(), absPosProperties->paintOffsetTranslation()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, FixedPosition) { loadTestData("fixed-position.html"); FrameView* frameView = document().view(); // target1 is a fixed-position element inside an absolute-position scrolling element. // It should be attached under the viewport to skip scrolling and offset of the parent. Element* target1 = document().getElementById("target1"); ObjectPaintProperties* target1Properties = target1->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(200, 150), target1Properties->paintOffsetTranslation()->matrix()); EXPECT_EQ(frameView->preTranslation(), target1Properties->paintOffsetTranslation()->parent()); EXPECT_EQ(target1Properties->paintOffsetTranslation(), target1Properties->overflowClip()->localTransformSpace()); EXPECT_EQ(FloatRoundedRect(0, 0, 100, 100), target1Properties->overflowClip()->clipRect()); // Likewise, it inherits clip from the viewport, skipping overflow clip of the scroller. EXPECT_EQ(frameView->contentClip(), target1Properties->overflowClip()->parent()); // target2 is a fixed-position element inside a transformed scrolling element. // It should be attached under the scrolled box of the transformed element. Element* target2 = document().getElementById("target2"); ObjectPaintProperties* target2Properties = target2->layoutObject()->objectPaintProperties(); Element* scroller = document().getElementById("scroller"); ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(200, 150), target2Properties->paintOffsetTranslation()->matrix()); EXPECT_EQ(scrollerProperties->scrollTranslation(), target2Properties->paintOffsetTranslation()->parent()); EXPECT_EQ(target2Properties->paintOffsetTranslation(), target2Properties->overflowClip()->localTransformSpace()); EXPECT_EQ(FloatRoundedRect(0, 0, 100, 100), target2Properties->overflowClip()->clipRect()); EXPECT_EQ(scrollerProperties->overflowClip(), target2Properties->overflowClip()->parent()); }
// TODO(trchen): Settings::rootLayerScrolls cannot be switched after main frame being created. // Need to set it during test setup. Besides that, the test still won't work because // root layer scrolling mode is not compatible with SPv2 at this moment. // (Duplicate display item ID for FrameView and LayoutView.) TEST_F(PaintPropertyTreeBuilderTest, DISABLED_FrameScrollingRootLayerScrolls) { document().settings()->setRootLayerScrolls(true); setBodyInnerHTML("<style> body { height: 10000px; } </style>"); document().domWindow()->scrollTo(0, 100); FrameView* frameView = document().view(); frameView->updateAllLifecyclePhases(); EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix()); EXPECT_EQ(nullptr, frameView->preTranslation()->parent()); EXPECT_EQ(TransformationMatrix(), frameView->scrollTranslation()->matrix()); EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->parent()); LayoutView* layoutView = document().layoutView(); ObjectPaintProperties* layoutViewProperties = layoutView->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(0, -100), layoutViewProperties->scrollTranslation()->matrix()); EXPECT_EQ(frameView->scrollTranslation(), layoutViewProperties->scrollTranslation()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, FixedPosition) { loadTestData("fixed-position.html"); // target1 is a fixed-position element inside an absolute-position scrolling element. // It should be attached under the viewport to skip scrolling and offset of the parent. Element* target1 = document().getElementById("target1"); ObjectPaintProperties* target1Properties = target1->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(200, 150), target1Properties->paintOffsetTranslation()->matrix()); EXPECT_EQ(document().view()->preTranslation(), target1Properties->paintOffsetTranslation()->parent()); // target2 is a fixed-position element inside a transformed scrolling element. // It should be attached under the scrolled box of the transformed element. Element* target2 = document().getElementById("target2"); ObjectPaintProperties* target2Properties = target2->layoutObject()->objectPaintProperties(); Element* scroller = document().getElementById("scroller"); ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(200, 150), target2Properties->paintOffsetTranslation()->matrix()); EXPECT_EQ(scrollerProperties->scrollTranslation(), target2Properties->paintOffsetTranslation()->parent()); }