Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp b/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp |
| index ca38e7dbde378cc0ca7de8fdf33e9bedec7527f2..f4aca15dfad8b6531c6eda4acd1494a797c51e89 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp |
| @@ -122,4 +122,63 @@ TEST_F(LayoutObjectTest, MapToVisibleRectInAncestorSpace) |
| EXPECT_TRUE(rect == LayoutRect(0, 10, 20, 20)); |
| } |
| +TEST_F(LayoutObjectTest, 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(LayoutObjectTest, 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()); |
| + |
| + // Allow a maximum error of half a pixel. |
| + const float kMaxError = 0.5; |
|
szager1
2016/03/08 23:34:15
Internally, TransformState uses LayoutUnit's. I k
dmazzoni
2016/03/09 18:14:59
Done.
|
| + |
| + // Sotate (100, 0) 90 degrees to (0, 100) |
|
szager1
2016/03/08 23:34:15
typo
dmazzoni
2016/03/09 18:14:59
Done.
|
| + matrix = child->localToAncestorTransform(rotate1); |
| + EXPECT_FALSE(matrix.isIdentity()); |
| + EXPECT_TRUE(matrix.isAffine()); |
| + EXPECT_NEAR(0.0, matrix.projectPoint(FloatPoint(100.0, 0.0)).x(), kMaxError); |
| + EXPECT_NEAR(100.0, matrix.projectPoint(FloatPoint(100.0, 0.0)).y(), kMaxError); |
| + |
| + // Rotate (100, 0) 135 degrees to (-70.7, 70.7) |
| + matrix = child->localToAncestorTransform(container); |
| + EXPECT_FALSE(matrix.isIdentity()); |
| + EXPECT_TRUE(matrix.isAffine()); |
| + EXPECT_NEAR(-70.7, matrix.projectPoint(FloatPoint(100.0, 0.0)).x(), kMaxError); |
| + EXPECT_NEAR(70.7, matrix.projectPoint(FloatPoint(100.0, 0.0)).y(), kMaxError); |
| +} |
| + |
| } // namespace blink |