Changeset 284084 in webkit
- Timestamp:
- Oct 13, 2021 12:59:14 AM (9 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/scrollingcoordinator/mac/nested-sticky-with-nonsticking-sticky-parent-expected.html (added)
-
LayoutTests/scrollingcoordinator/mac/nested-sticky-with-nonsticking-sticky-parent.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/page/scrolling/ScrollingStateStickyNode.cpp (modified) (4 diffs)
-
Source/WebCore/page/scrolling/ScrollingStateStickyNode.h (modified) (1 diff)
-
Source/WebCore/page/scrolling/cocoa/ScrollingTreeStickyNode.mm (modified) (3 diffs)
-
Source/WebCore/page/scrolling/nicosia/ScrollingTreeStickyNode.cpp (modified) (4 diffs)
-
Source/WebCore/page/scrolling/nicosia/ScrollingTreeStickyNode.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r284068 r284084 1 2021-10-13 Martin Robinson <mrobinson@webkit.org> 2 3 Sticky element inside another sticky element does not redraw properly on scroll 4 https://bugs.webkit.org/show_bug.cgi?id=199915 5 <rdar://problem/53375284> 6 7 Reviewed by Simon Fraser. 8 9 When calculating layer position for sticky nodes in the scrolling tree, take into 10 account situations where the sticky parents of sticky nodes don't stick (due to 11 sizing). This was handled properly in layout, but not in the scrolling tree, which 12 caused these kinds of nodes to jump around. 13 14 * scrollingcoordinator/mac/nested-sticky-with-nonsticking-sticky-parent-expected.html: Added. 15 * scrollingcoordinator/mac/nested-sticky-with-nonsticking-sticky-parent.html: Added. 16 1 17 2021-10-12 Arcady Goldmints-Orlov <agoldmints@igalia.com> 2 18 -
trunk/Source/WebCore/ChangeLog
r284080 r284084 1 2021-10-13 Martin Robinson <mrobinson@webkit.org> 2 3 Sticky element inside another sticky element does not redraw properly on scroll 4 https://bugs.webkit.org/show_bug.cgi?id=199915 5 <rdar://problem/53375284> 6 7 Reviewed by Simon Fraser. 8 9 When calculating layer position for sticky nodes in the scrolling tree, take into 10 account situations where the sticky parents of sticky nodes don't stick (due to 11 sizing). This was handled properly in layout, but not in the scrolling tree, which 12 caused these kinds of nodes to jump around. 13 14 Test: scrollingcoordinator/mac/nested-sticky-with-nonsticking-sticky-parent.html 15 16 * page/scrolling/ScrollingStateStickyNode.cpp: 17 (WebCore::ScrollingStateStickyNode::computeLayerPosition const): 18 (WebCore::ScrollingStateStickyNode::scrollDeltaSinceLastCommit const): 19 * page/scrolling/ScrollingStateStickyNode.h: 20 * page/scrolling/cocoa/ScrollingTreeStickyNode.mm: 21 (WebCore::ScrollingTreeStickyNode::computeLayerPosition const): 22 * page/scrolling/nicosia/ScrollingTreeStickyNode.cpp: 23 (WebCore::ScrollingTreeStickyNode::computeLayerPosition const): 24 (WebCore::ScrollingTreeStickyNode::scrollDeltaSinceLastCommit const): 25 * page/scrolling/nicosia/ScrollingTreeStickyNode.h: 26 1 27 2021-10-12 Jer Noble <jer.noble@apple.com> 2 28 -
trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.cpp
r269458 r284084 87 87 { 88 88 // This logic follows ScrollingTreeStickyNode::computeLayerPosition(). 89 FloatSize offsetFromStickyAncestors; 89 90 auto computeLayerPositionForScrollingNode = [&](ScrollingStateNode& scrollingStateNode) { 90 91 FloatRect constrainingRect; … … 95 96 constrainingRect = FloatRect(overflowScrollingNode.scrollPosition(), m_constraints.constrainingRectAtLastLayout().size()); 96 97 } 98 constrainingRect.move(offsetFromStickyAncestors); 97 99 return m_constraints.layerPositionForConstrainingRect(constrainingRect); 98 100 }; … … 111 113 return computeLayerPositionForScrollingNode(*ancestor); 112 114 113 if (is<ScrollingStateFixedNode>(*ancestor) || is<ScrollingStateStickyNode>(*ancestor)) { 115 if (is<ScrollingStateStickyNode>(*ancestor)) 116 offsetFromStickyAncestors += downcast<ScrollingStateStickyNode>(*ancestor).scrollDeltaSinceLastCommit(viewportRect); 117 118 if (is<ScrollingStateFixedNode>(*ancestor)) { 114 119 // FIXME: Do we need scrolling tree nodes at all for nested cases? 115 120 return m_constraints.layerPositionAtLastLayout(); … … 142 147 } 143 148 } 149 } 150 151 FloatSize ScrollingStateStickyNode::scrollDeltaSinceLastCommit(const LayoutRect& viewportRect) const 152 { 153 auto layerPosition = computeLayerPosition(viewportRect); 154 return layerPosition - m_constraints.layerPositionAtLastLayout(); 144 155 } 145 156 -
trunk/Source/WebCore/page/scrolling/ScrollingStateStickyNode.h
r269458 r284084 54 54 FloatPoint computeLayerPosition(const LayoutRect& viewportRect) const; 55 55 void reconcileLayerPositionForViewportRect(const LayoutRect& viewportRect, ScrollingLayerPositionAction) final; 56 FloatSize scrollDeltaSinceLastCommit(const LayoutRect& viewportRect) const; 56 57 57 58 void dumpProperties(WTF::TextStream&, ScrollingStateTreeAsTextBehavior) const final; -
trunk/Source/WebCore/page/scrolling/cocoa/ScrollingTreeStickyNode.mm
r278429 r284084 70 70 FloatPoint ScrollingTreeStickyNode::computeLayerPosition() const 71 71 { 72 FloatSize offsetFromStickyAncestors; 72 73 auto computeLayerPositionForScrollingNode = [&](ScrollingTreeNode& scrollingNode) { 73 74 FloatRect constrainingRect; … … 80 81 constrainingRect.move(overflowScrollingNode.scrollDeltaSinceLastCommit()); 81 82 } 83 constrainingRect.move(-offsetFromStickyAncestors); 82 84 return m_constraints.layerPositionForConstrainingRect(constrainingRect); 83 85 }; … … 96 98 return computeLayerPositionForScrollingNode(*ancestor); 97 99 98 if (is<ScrollingTreeFixedNode>(*ancestor) || is<ScrollingTreeStickyNode>(*ancestor)) { 100 if (is<ScrollingTreeStickyNode>(*ancestor)) 101 offsetFromStickyAncestors += downcast<ScrollingTreeStickyNode>(*ancestor).scrollDeltaSinceLastCommit(); 102 103 if (is<ScrollingTreeFixedNode>(*ancestor)) { 99 104 // FIXME: Do we need scrolling tree nodes at all for nested cases? 100 105 return m_constraints.layerPositionAtLastLayout(); -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeStickyNode.cpp
r278429 r284084 112 112 FloatPoint ScrollingTreeStickyNode::computeLayerPosition() const 113 113 { 114 FloatSize offsetFromStickyAncestors; 114 115 auto computeLayerPositionForScrollingNode = [&](ScrollingTreeNode& scrollingNode) { 115 116 FloatRect constrainingRect; … … 122 123 constrainingRect.move(overflowScrollingNode.scrollDeltaSinceLastCommit()); 123 124 } 125 constrainingRect.move(-offsetFromStickyAncestors); 124 126 return m_constraints.layerPositionForConstrainingRect(constrainingRect); 125 127 }; … … 138 140 return computeLayerPositionForScrollingNode(*ancestor); 139 141 140 if (is<ScrollingTreeFixedNode>(*ancestor) || is<ScrollingTreeStickyNode>(*ancestor)) { 142 if (is<ScrollingTreeStickyNode>(*ancestor)) 143 offsetFromStickyAncestors += downcast<ScrollingTreeStickyNode>(*ancestor).scrollDeltaSinceLastCommit(); 144 145 if (is<ScrollingTreeFixedNode>(*ancestor)) { 141 146 // FIXME: Do we need scrolling tree nodes at all for nested cases? 142 147 return m_constraints.layerPositionAtLastLayout(); … … 147 152 } 148 153 154 FloatSize ScrollingTreeStickyNode::scrollDeltaSinceLastCommit() const 155 { 156 auto layerPosition = computeLayerPosition(); 157 return layerPosition - m_constraints.layerPositionAtLastLayout(); 158 } 159 149 160 } // namespace WebCore 150 161 -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeStickyNode.h
r250339 r284084 55 55 56 56 FloatPoint computeLayerPosition() const; 57 FloatSize scrollDeltaSinceLastCommit() const; 57 58 58 59 StickyPositionViewportConstraints m_constraints;
Note: See TracChangeset
for help on using the changeset viewer.