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, FixedTransformAncestorAcrossSVGHTMLBoundary) { setBodyInnerHTML( "<style> body { margin: 0px; } </style>" "<svg id='svg' style='transform: translate3d(1px, 2px, 3px);'>" " <g id='container' transform='translate(20 30)'>" " <foreignObject>" " <body>" " <div id='fixed' style='position: fixed; left: 200px; top: 150px;'></div>" " </body>" " </foreignObject>" " </g>" "</svg>"); LayoutObject& svg = *document().getElementById("svg")->layoutObject(); ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgProperties->transform()->matrix()); LayoutObject& container = *document().getElementById("container")->layoutObject(); ObjectPaintProperties* containerProperties = container.objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(20, 30), containerProperties->transform()->matrix()); EXPECT_EQ(svgProperties->transform(), containerProperties->transform()->parent()); Element* fixed = document().getElementById("fixed"); ObjectPaintProperties* fixedProperties = fixed->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(200, 150), fixedProperties->paintOffsetTranslation()->matrix()); // Ensure the fixed position element is rooted at the nearest transform container. EXPECT_EQ(containerProperties->transform(), fixedProperties->paintOffsetTranslation()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, RelativePositionInline) { loadTestData("relative-position-inline.html"); Element* inlineBlock = document().getElementById("inline-block"); ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(135, 490), inlineBlockProperties->paintOffsetTranslation()->matrix()); EXPECT_EQ(document().view()->scrollTranslation(), inlineBlockProperties->paintOffsetTranslation()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, Transform) { loadTestData("transform.html"); Element* transform = document().getElementById("transform"); ObjectPaintProperties* transformProperties = transform->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate3d(123, 456, 789), transformProperties->transform()->matrix()); EXPECT_EQ(FloatPoint3D(200, 150, 0), transformProperties->transform()->origin()); EXPECT_EQ(transformProperties->paintOffsetTranslation(), transformProperties->transform()->parent()); EXPECT_EQ(TransformationMatrix().translate(50, 100), transformProperties->paintOffsetTranslation()->matrix()); EXPECT_EQ(document().view()->scrollTranslation(), transformProperties->paintOffsetTranslation()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, SVGRootPaintOffsetTransformNode) { setBodyInnerHTML( "<style>body { margin: 0px; } </style>" "<svg id='svg' style='margin-left: 50px; margin-top: 25px; width: 100px; height: 100px;' />"); LayoutObject& svg = *document().getElementById("svg")->layoutObject(); ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); // Ensure that a paint offset transform is emitted for SVG, even without a CSS transform. EXPECT_EQ(nullptr, svgProperties->transform()); EXPECT_EQ(TransformationMatrix().translate(50, 25), svgProperties->paintOffsetTranslation()->matrix()); EXPECT_EQ(document().view()->scrollTranslation(), svgProperties->paintOffsetTranslation()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, Perspective) { loadTestData("perspective.html"); Element* perspective = document().getElementById("perspective"); ObjectPaintProperties* perspectiveProperties = perspective->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().applyPerspective(100), perspectiveProperties->perspective()->matrix()); // The perspective origin is the center of the border box plus accumulated paint offset. EXPECT_EQ(FloatPoint3D(250, 250, 0), perspectiveProperties->perspective()->origin()); EXPECT_EQ(document().view()->scrollTranslation(), perspectiveProperties->perspective()->parent()); // Adding perspective doesn't clear paint offset. The paint offset will be passed down to children. Element* inner = document().getElementById("inner"); ObjectPaintProperties* innerProperties = inner->layoutObject()->objectPaintProperties(); EXPECT_EQ(TransformationMatrix().translate(50, 100), innerProperties->paintOffsetTranslation()->matrix()); EXPECT_EQ(perspectiveProperties->perspective(), innerProperties->paintOffsetTranslation()->parent()); }