Index: third_party/WebKit/Source/core/layout/MapCoordinatesTest.cpp |
diff --git a/third_party/WebKit/Source/core/layout/MapCoordinatesTest.cpp b/third_party/WebKit/Source/core/layout/MapCoordinatesTest.cpp |
index 6008d5b5d880f26655424857156769ea46b6b41e..924d619149ceeb3e930952e250847aa8aa9aa54c 100644 |
--- a/third_party/WebKit/Source/core/layout/MapCoordinatesTest.cpp |
+++ b/third_party/WebKit/Source/core/layout/MapCoordinatesTest.cpp |
@@ -1045,4 +1045,96 @@ TEST_F(MapCoordinatesTest, SVGForeignObject) |
EXPECT_EQ(FloatPoint(), mappedPoint); |
} |
+TEST_F(MapCoordinatesTest, LocalToAbsoluteTransform) |
+{ |
+ setBodyInnerHTML( |
+ "<div id='container' style='position: absolute; left: 0; top: 0;'>" |
+ " <div id='scale' style='transform: scale(2.0); transform-origin: left top;'>" |
+ " <div id='child'></div>" |
+ " </div>" |
+ "</div>"); |
+ LayoutBoxModelObject* container = toLayoutBoxModelObject(getLayoutObjectByElementId("container")); |
+ TransformationMatrix containerMatrix = container->localToAbsoluteTransform(); |
+ EXPECT_TRUE(containerMatrix.isIdentity()); |
+ |
+ LayoutObject* child = getLayoutObjectByElementId("child"); |
+ TransformationMatrix childMatrix = child->localToAbsoluteTransform(); |
+ EXPECT_FALSE(childMatrix.isIdentityOrTranslation()); |
+ EXPECT_TRUE(childMatrix.isAffine()); |
+ EXPECT_EQ(0.0, childMatrix.projectPoint(FloatPoint(0.0, 0.0)).x()); |
+ EXPECT_EQ(0.0, childMatrix.projectPoint(FloatPoint(0.0, 0.0)).y()); |
+ EXPECT_EQ(20.0, childMatrix.projectPoint(FloatPoint(10.0, 20.0)).x()); |
+ EXPECT_EQ(40.0, childMatrix.projectPoint(FloatPoint(10.0, 20.0)).y()); |
+} |
+ |
+TEST_F(MapCoordinatesTest, LocalToAncestorTransform) |
+{ |
+ setBodyInnerHTML( |
+ "<div id='container'>" |
+ " <div id='rotate1' style='transform: rotate(45deg); transform-origin: left top;'>" |
+ " <div id='rotate2' style='transform: rotate(90deg); transform-origin: left top;'>" |
+ " <div id='child'></div>" |
+ " </div>" |
+ " </div>" |
+ "</div>"); |
+ LayoutBoxModelObject* container = toLayoutBoxModelObject(getLayoutObjectByElementId("container")); |
+ LayoutBoxModelObject* rotate1 = toLayoutBoxModelObject(getLayoutObjectByElementId("rotate1")); |
+ LayoutBoxModelObject* rotate2 = toLayoutBoxModelObject(getLayoutObjectByElementId("rotate2")); |
+ LayoutObject* child = getLayoutObjectByElementId("child"); |
+ TransformationMatrix matrix; |
+ |
+ matrix = child->localToAncestorTransform(rotate2); |
+ EXPECT_TRUE(matrix.isIdentity()); |
+ |
+ // Rotate (100, 0) 90 degrees to (0, 100) |
+ matrix = child->localToAncestorTransform(rotate1); |
+ EXPECT_FALSE(matrix.isIdentity()); |
+ EXPECT_TRUE(matrix.isAffine()); |
+ EXPECT_NEAR(0.0, matrix.projectPoint(FloatPoint(100.0, 0.0)).x(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(100.0, matrix.projectPoint(FloatPoint(100.0, 0.0)).y(), LayoutUnit::epsilon()); |
+ |
+ // Rotate (100, 0) 135 degrees to (-70.7, 70.7) |
+ matrix = child->localToAncestorTransform(container); |
+ EXPECT_FALSE(matrix.isIdentity()); |
+ EXPECT_TRUE(matrix.isAffine()); |
+ EXPECT_NEAR(-100.0 * sqrt(2.0) / 2.0, matrix.projectPoint(FloatPoint(100.0, 0.0)).x(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(100.0 * sqrt(2.0) / 2.0, matrix.projectPoint(FloatPoint(100.0, 0.0)).y(), LayoutUnit::epsilon()); |
+} |
+ |
+TEST_F(MapCoordinatesTest, LocalToAbsoluteTransformFlattens) |
+{ |
+ document().frame()->settings()->setAcceleratedCompositingEnabled(true); |
+ setBodyInnerHTML( |
+ "<div style='position: absolute; left: 0; top: 0;'>" |
+ " <div style='transform: rotateY(45deg); -webkit-transform-style:preserve-3d;'>" |
+ " <div style='transform: rotateY(-45deg); -webkit-transform-style:preserve-3d;'>" |
+ " <div id='child1'></div>" |
+ " </div>" |
+ " </div>" |
+ " <div style='transform: rotateY(45deg);'>" |
+ " <div style='transform: rotateY(-45deg);'>" |
+ " <div id='child2'></div>" |
+ " </div>" |
+ " </div>" |
+ "</div>"); |
+ LayoutObject* child1 = getLayoutObjectByElementId("child1"); |
+ LayoutObject* child2 = getLayoutObjectByElementId("child2"); |
+ TransformationMatrix matrix; |
+ |
+ matrix = child1->localToAbsoluteTransform(); |
+ |
+ // With child1, the rotations cancel and points should map basically back to themselves. |
+ EXPECT_NEAR(100.0, matrix.projectPoint(FloatPoint(100.0, 50.0)).x(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(50.0, matrix.projectPoint(FloatPoint(100.0, 50.0)).y(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(50.0, matrix.projectPoint(FloatPoint(50.0, 100.0)).x(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(100.0, matrix.projectPoint(FloatPoint(50.0, 100.0)).y(), LayoutUnit::epsilon()); |
+ |
+ // With child2, each rotation gets flattened and the end result is approximately a 90-degree rotation. |
+ matrix = child2->localToAbsoluteTransform(); |
+ EXPECT_NEAR(50.0, matrix.projectPoint(FloatPoint(100.0, 50.0)).x(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(50.0, matrix.projectPoint(FloatPoint(100.0, 50.0)).y(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(25.0, matrix.projectPoint(FloatPoint(50.0, 100.0)).x(), LayoutUnit::epsilon()); |
+ EXPECT_NEAR(100.0, matrix.projectPoint(FloatPoint(50.0, 100.0)).y(), LayoutUnit::epsilon()); |
+} |
+ |
} // namespace blink |