Index: Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp |
=================================================================== |
--- Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp (revision 125578) |
+++ Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp (working copy) |
@@ -948,6 +948,36 @@ |
EXPECT_TRANSFORMATION_MATRIX_EQ(expectedGrandChildScreenSpaceTransform, grandChild->screenSpaceTransform()); |
} |
+TEST(CCLayerTreeHostCommonTest, verifyTransformsForDegenerateIntermediateLayer) |
+{ |
+ // A layer that is empty in one axis, but not the other, was accidentally skipping a necessary translation. |
+ // Without that translation, the coordinate space of the layer's drawTransform is incorrect. |
+ // |
+ // Normally this isn't a problem, because the layer wouldn't be drawn anyway, but if that layer becomes a renderSurface, then |
+ // its drawTransform is implicitly inherited by the rest of the subtree, which then is positioned incorrectly as a result. |
+ |
+ RefPtr<LayerChromium> root = LayerChromium::create(); |
+ RefPtr<LayerChromium> child = LayerChromium::create(); |
+ RefPtr<LayerChromiumWithForcedDrawsContent> grandChild = adoptRef(new LayerChromiumWithForcedDrawsContent()); |
+ |
+ // The child height is zero, but has non-zero width that should be accounted for while computing drawTransforms. |
+ const WebTransformationMatrix identityMatrix; |
+ setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(100, 100), false); |
+ setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 0), false); |
+ setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); |
+ |
+ root->addChild(child); |
+ child->addChild(grandChild); |
+ child->setForceRenderSurface(true); |
+ |
+ executeCalculateDrawTransformsAndVisibility(root.get()); |
+ |
+ ASSERT_TRUE(child->renderSurface()); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->renderSurface()->drawTransform()); // This is the real test, the rest are sanity checks. |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform()); |
+} |
+ |
TEST(CCLayerTreeHostCommonTest, verifyRenderSurfaceListForRenderSurfaceWithClippedLayer) |
{ |
RefPtr<LayerChromium> parent = LayerChromium::create(); |