Index: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp |
index 0bd39b24c1d26095495def793d9203972de95d3e..9979fdd019d6bc03bd1a02f449159e970f201d15 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp |
@@ -1109,4 +1109,78 @@ TEST_F(PaintPropertyTreeBuilderTest, SvgPixelSnappingShouldResetPaintOffset) |
EXPECT_EQ(svgWithTransformProperties->transform(), rectWithTransformProperties->transform()->parent()); |
} |
+TEST_F(PaintPropertyTreeBuilderTest, CachedProperties) |
+{ |
+ setBodyInnerHTML( |
+ "<div id='a' style='transform: translate(33px, 44px)'>" |
+ " <div id='b' style='transform: translate(55px, 66px)'>" |
+ " <div id='c' style='transform: translate(77px, 88px)'>C<div>" |
+ " </div>" |
+ "</div>"); |
+ |
+ Element* a = document().getElementById("a"); |
+ ObjectPaintProperties* aProperties = a->layoutObject()->objectPaintProperties(); |
+ TransformPaintPropertyNode* aTransformNode = aProperties->transform(); |
+ EXPECT_EQ(TransformationMatrix().translate(33, 44), aTransformNode->matrix()); |
+ |
+ Element* b = document().getElementById("b"); |
+ ObjectPaintProperties* bProperties = b->layoutObject()->objectPaintProperties(); |
+ TransformPaintPropertyNode* bTransformNode = bProperties->transform(); |
+ EXPECT_EQ(TransformationMatrix().translate(55, 66), bTransformNode->matrix()); |
+ |
+ Element* c = document().getElementById("c"); |
+ ObjectPaintProperties* cProperties = c->layoutObject()->objectPaintProperties(); |
+ TransformPaintPropertyNode* cTransformNode = cProperties->transform(); |
+ EXPECT_EQ(TransformationMatrix().translate(77, 88), cTransformNode->matrix()); |
+ |
+ // Change transform of b. B's transform node should be a new node with the new value, |
+ // and a and c's transform nodes should be unchanged (with c's parent adjusted). |
+ b->setAttribute(HTMLNames::styleAttr, "transform: translate(111px, 222px)"); |
+ document().view()->updateAllLifecyclePhases(); |
+ |
+ EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(aTransformNode, aProperties->transform()); |
+ |
+ EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties()); |
+ bTransformNode = bProperties->transform(); |
+ EXPECT_EQ(TransformationMatrix().translate(111, 222), bTransformNode->matrix()); |
+ EXPECT_EQ(aTransformNode, bTransformNode->parent()); |
+ |
+ EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(cTransformNode, cProperties->transform()); |
+ EXPECT_EQ(bTransformNode, cTransformNode->parent()); |
+ |
+ // Remove transform from b. B's transform node should be removed from the tree, |
+ // and a and c's transform nodes should be unchanged (with c's parent adjusted). |
+ b->setAttribute(HTMLNames::styleAttr, ""); |
+ document().view()->updateAllLifecyclePhases(); |
+ |
+ EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(aTransformNode, aProperties->transform()); |
+ |
+ EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(nullptr, bProperties->transform()); |
+ |
+ EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(cTransformNode, cProperties->transform()); |
+ EXPECT_EQ(aTransformNode, cTransformNode->parent()); |
+ |
+ // Re-add transform to b. B's transform node should be inserted into the tree, |
+ // and a and c's transform nodes should be unchanged (with c's parent adjusted). |
+ b->setAttribute(HTMLNames::styleAttr, "transform: translate(4px, 5px)"); |
+ document().view()->updateAllLifecyclePhases(); |
+ |
+ EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(aTransformNode, aProperties->transform()); |
+ |
+ EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties()); |
+ bTransformNode = bProperties->transform(); |
+ EXPECT_EQ(TransformationMatrix().translate(4, 5), bTransformNode->matrix()); |
+ EXPECT_EQ(aTransformNode, bTransformNode->parent()); |
+ |
+ EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties()); |
+ EXPECT_EQ(cTransformNode, cProperties->transform()); |
+ EXPECT_EQ(bTransformNode, cTransformNode->parent()); |
+} |
+ |
} // namespace blink |