Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Unified Diff: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp

Issue 2733633002: Handle nested position:sticky elements correctly (compositor) (Closed)
Patch Set: Add comment referencing crbug.com/702229 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
index 0e2bee46da5a69c85e3461504b0afec24a9aa556..794d8c86e12c9fdea9013ca355bd20b1ae2f8da8 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
@@ -1496,8 +1496,8 @@ TEST_P(CompositedLayerMappingTest, StickyPositionContentOffset) {
->contentLayer()
->layer()
->stickyPositionConstraint();
- EXPECT_EQ(IntPoint(-11, -11),
- IntPoint(constraint1.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(-11, -11),
+ FloatPoint(constraint1.parentRelativeStickyBoxOffset));
// Since the nested div will be squashed into the same composited layer the
// sticky element is offset by the nested element's offset.
@@ -1507,8 +1507,8 @@ TEST_P(CompositedLayerMappingTest, StickyPositionContentOffset) {
->contentLayer()
->layer()
->stickyPositionConstraint();
- EXPECT_EQ(IntPoint(-50, -50),
- IntPoint(constraint2.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(-50, -50),
+ FloatPoint(constraint2.parentRelativeStickyBoxOffset));
}
TEST_P(CompositedLayerMappingTest, StickyPositionTableCellContentOffset) {
@@ -1536,8 +1536,8 @@ TEST_P(CompositedLayerMappingTest, StickyPositionTableCellContentOffset) {
->contentLayer()
->layer()
->stickyPositionConstraint();
- EXPECT_EQ(IntPoint(0, 50),
- IntPoint(constraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 50),
+ FloatPoint(constraint.parentRelativeStickyBoxOffset));
}
TEST_P(CompositedLayerMappingTest, StickyPositionEnclosingLayersContentOffset) {
@@ -1564,8 +1564,8 @@ TEST_P(CompositedLayerMappingTest, StickyPositionEnclosingLayersContentOffset) {
->contentLayer()
->layer()
->stickyPositionConstraint();
- EXPECT_EQ(IntPoint(0, 10),
- IntPoint(constraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 10),
+ FloatPoint(constraint.parentRelativeStickyBoxOffset));
// Now scroll the page - this should not affect the parent-relative offset.
LayoutBoxModelObject* scroller =
@@ -1584,8 +1584,102 @@ TEST_P(CompositedLayerMappingTest, StickyPositionEnclosingLayersContentOffset) {
->contentLayer()
->layer()
->stickyPositionConstraint();
- EXPECT_EQ(IntPoint(0, 10),
- IntPoint(constraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 10),
+ FloatPoint(constraint.parentRelativeStickyBoxOffset));
+}
+
+TEST_P(CompositedLayerMappingTest, StickyPositionNestedStickyContentOffset) {
+ setBodyInnerHTML(
+ "<style>.composited { will-change: transform; }"
+ "#scroller { overflow: auto; height: 200px; width: 200px; }"
+ ".container { height: 500px; }"
+ "#outerSticky { position: sticky; top: 0; height: 100px; }"
+ "#middleSticky { position: sticky; top: 10px; height: 50px; }"
+ "#innerSticky { position: sticky; top: 25px; height: 25px; }</style>"
+ "<div id='scroller' class='composited'>"
+ " <div style='height: 50px'></div>"
+ " <div class='composited container'>"
+ " <div style='height: 10px;'></div>"
+ " <div id='outerSticky' class='composited'>"
+ " <div id='middleSticky' class='composited'>"
+ " <div style='height: 5px;'></div>"
+ " <div id='innerSticky' class='composited'></div>"
+ " </div>"
+ " </div>"
+ " </div>"
+ "</div>");
+
+ PaintLayer* outerSticky =
+ toLayoutBox(getLayoutObjectByElementId("outerSticky"))->layer();
+ PaintLayer* middleSticky =
+ toLayoutBox(getLayoutObjectByElementId("middleSticky"))->layer();
+ PaintLayer* innerSticky =
+ toLayoutBox(getLayoutObjectByElementId("innerSticky"))->layer();
+
+ WebLayerStickyPositionConstraint outerStickyConstraint =
+ outerSticky->compositedLayerMapping()
+ ->mainGraphicsLayer()
+ ->contentLayer()
+ ->layer()
+ ->stickyPositionConstraint();
+ WebLayerStickyPositionConstraint middleStickyConstraint =
+ middleSticky->compositedLayerMapping()
+ ->mainGraphicsLayer()
+ ->contentLayer()
+ ->layer()
+ ->stickyPositionConstraint();
+ WebLayerStickyPositionConstraint innerStickyConstraint =
+ innerSticky->compositedLayerMapping()
+ ->mainGraphicsLayer()
+ ->contentLayer()
+ ->layer()
+ ->stickyPositionConstraint();
+
+ EXPECT_EQ(FloatPoint(0, 10),
+ FloatPoint(outerStickyConstraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 0),
+ FloatPoint(middleStickyConstraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 5),
+ FloatPoint(innerStickyConstraint.parentRelativeStickyBoxOffset));
+
+ // Scroll the content to engage the sticky elements.
+ LayoutBoxModelObject* scroller =
+ toLayoutBoxModelObject(getLayoutObjectByElementId("scroller"));
+ PaintLayerScrollableArea* scrollableArea = scroller->getScrollableArea();
+ scrollableArea->scrollToAbsolutePosition(
+ FloatPoint(scrollableArea->scrollPosition().x(), 110));
+ ASSERT_EQ(110.0, scrollableArea->scrollPosition().y());
+
+ outerSticky->setNeedsCompositingInputsUpdate();
+ middleSticky->setNeedsCompositingInputsUpdate();
+ innerSticky->setNeedsCompositingInputsUpdate();
+
+ document().view()->updateLifecycleToCompositingCleanPlusScrolling();
+
+ outerStickyConstraint = outerSticky->compositedLayerMapping()
+ ->mainGraphicsLayer()
+ ->contentLayer()
+ ->layer()
+ ->stickyPositionConstraint();
+ middleStickyConstraint = middleSticky->compositedLayerMapping()
+ ->mainGraphicsLayer()
+ ->contentLayer()
+ ->layer()
+ ->stickyPositionConstraint();
+ innerStickyConstraint = innerSticky->compositedLayerMapping()
+ ->mainGraphicsLayer()
+ ->contentLayer()
+ ->layer()
+ ->stickyPositionConstraint();
+
+ // After scrolling and despite ancestor sticky changes, the offset relative to
+ // the parent layer should remain constant.
+ EXPECT_EQ(FloatPoint(0, 10),
+ FloatPoint(outerStickyConstraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 0),
+ FloatPoint(middleStickyConstraint.parentRelativeStickyBoxOffset));
+ EXPECT_EQ(FloatPoint(0, 5),
+ FloatPoint(innerStickyConstraint.parentRelativeStickyBoxOffset));
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698