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 42aac1843e81d5f068738e8be8731ad949367c16..e2b49c6ab8ffab24a5249d7644557ed8265ed37e 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp |
@@ -719,4 +719,105 @@ TEST_F(PaintPropertyTreeBuilderTest, TableCellLayoutLocation) |
EXPECT_EQ(frameView->scrollTranslation(), targetProperties->localBorderBoxProperties()->transform); |
} |
+TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendant) |
+{ |
+ // This test verifies that clip tree hierarchy being generated correctly for the hard case |
+ // such that a fixed position element getting clipped by an absolute position CSS clip. |
+ setBodyInnerHTML( |
+ "<style>" |
+ " #clip {" |
+ " position: absolute;" |
+ " left: 123px;" |
+ " top: 456px;" |
+ " clip: rect(10px, 80px, 70px, 40px);" |
+ " width: 100px;" |
+ " height: 100px;" |
+ " }" |
+ " #fixed {" |
+ " position: fixed;" |
+ " left: 654px;" |
+ " top: 321px;" |
+ " }" |
+ "</style>" |
+ "<div id='clip'><div id='fixed'></div></div>" |
+ ); |
+ LayoutRect localClipRect(40, 10, 40, 60); |
+ LayoutRect absoluteClipRect = localClipRect; |
+ absoluteClipRect.move(123, 456); |
+ |
+ FrameView* frameView = document().view(); |
+ |
+ LayoutObject& clip = *document().getElementById("clip")->layoutObject(); |
+ ObjectPaintProperties* clipProperties = clip.objectPaintProperties(); |
+ EXPECT_EQ(frameView->contentClip(), clipProperties->cssClip()->parent()); |
+ EXPECT_EQ(frameView->scrollTranslation(), clipProperties->cssClip()->localTransformSpace()); |
+ EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->cssClip()->clipRect()); |
+ |
+ LayoutObject& fixed = *document().getElementById("fixed")->layoutObject(); |
+ ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties(); |
+ EXPECT_EQ(clipProperties->cssClip(), fixedProperties->localBorderBoxProperties()->clip); |
+ EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProperties()->transform->parent()); |
+ EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->localBorderBoxProperties()->transform->matrix()); |
+ EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintOffset); |
+} |
+ |
+TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendantNonShared) |
+{ |
+ // This test is similar to CSSClipFixedPositionDescendant above, except that |
+ // now we have a parent overflow clip that should be escaped by the fixed descendant. |
+ setBodyInnerHTML( |
+ "<style>" |
+ " body {" |
+ " margin: 0;" |
+ " }" |
+ " #overflow {" |
+ " position: relative;" |
+ " width: 50px;" |
+ " height: 50px;" |
+ " overflow: scroll;" |
+ " }" |
+ " #clip {" |
+ " position: absolute;" |
+ " left: 123px;" |
+ " top: 456px;" |
+ " clip: rect(10px, 80px, 70px, 40px);" |
+ " width: 100px;" |
+ " height: 100px;" |
+ " }" |
+ " #fixed {" |
+ " position: fixed;" |
+ " left: 654px;" |
+ " top: 321px;" |
+ " }" |
+ "</style>" |
+ "<div id='overflow'><div id='clip'><div id='fixed'></div></div></div>" |
+ ); |
+ LayoutRect localClipRect(40, 10, 40, 60); |
+ LayoutRect absoluteClipRect = localClipRect; |
+ absoluteClipRect.move(123, 456); |
+ |
+ FrameView* frameView = document().view(); |
+ |
+ LayoutObject& overflow = *document().getElementById("overflow")->layoutObject(); |
+ ObjectPaintProperties* overflowProperties = overflow.objectPaintProperties(); |
+ EXPECT_EQ(frameView->contentClip(), overflowProperties->overflowClip()->parent()); |
+ EXPECT_EQ(frameView->scrollTranslation(), overflowProperties->scrollTranslation()->parent()); |
+ |
+ LayoutObject& clip = *document().getElementById("clip")->layoutObject(); |
+ ObjectPaintProperties* clipProperties = clip.objectPaintProperties(); |
+ EXPECT_EQ(overflowProperties->overflowClip(), clipProperties->cssClip()->parent()); |
+ EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClip()->localTransformSpace()); |
+ EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->cssClip()->clipRect()); |
+ EXPECT_EQ(frameView->contentClip(), clipProperties->cssClipFixedPosition()->parent()); |
+ EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClipFixedPosition()->localTransformSpace()); |
+ EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->cssClipFixedPosition()->clipRect()); |
+ |
+ LayoutObject& fixed = *document().getElementById("fixed")->layoutObject(); |
+ ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties(); |
+ EXPECT_EQ(clipProperties->cssClipFixedPosition(), fixedProperties->localBorderBoxProperties()->clip); |
+ EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProperties()->transform->parent()); |
+ EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->localBorderBoxProperties()->transform->matrix()); |
+ EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintOffset); |
+} |
+ |
} // namespace blink |