Changeset 243380 in webkit
- Timestamp:
- Mar 22, 2019 9:28:55 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r243377 r243380 1 2019-03-22 Antti Koivisto <antti@apple.com> 2 3 Handle UI side hit testing for ScrollPositioningBehavior::Stationary positioned nodes 4 https://bugs.webkit.org/show_bug.cgi?id=196100 5 <rdar://problem/49117933> 6 7 Reviewed by Simon Fraser. 8 9 * fast/scrolling/ios/overflow-scroll-overlap-6-expected.txt: Added. 10 * fast/scrolling/ios/overflow-scroll-overlap-6.html: Added. 11 1 12 2019-03-22 Simon Fraser <simon.fraser@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r243374 r243380 1 2019-03-22 Antti Koivisto <antti@apple.com> 2 3 Handle UI side hit testing for ScrollPositioningBehavior::Stationary positioned nodes 4 https://bugs.webkit.org/show_bug.cgi?id=196100 5 <rdar://problem/49117933> 6 7 Reviewed by Simon Fraser. 8 9 Test: fast/scrolling/ios/overflow-scroll-overlap-6.html 10 11 * page/scrolling/ScrollingTree.cpp: 12 (WebCore::ScrollingTree::commitTreeState): 13 * page/scrolling/ScrollingTree.h: 14 (WebCore::ScrollingTree::positionedNodesWithRelatedOverflow): 15 16 Add a separate map of positioned node ids for easy access. 17 18 * page/scrolling/cocoa/ScrollingTreePositionedNode.h: 19 (WebCore::ScrollingTreePositionedNode::scrollPositioningBehavior const): 20 (WebCore::ScrollingTreePositionedNode::relatedOverflowScrollingNodes const): 21 * page/scrolling/cocoa/ScrollingTreePositionedNode.mm: 22 (WebCore::ScrollingTreePositionedNode::commitStateBeforeChildren): 23 1 24 2019-03-22 Antoine Quint <graouts@apple.com> 2 25 -
trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp
r242997 r243380 176 176 177 177 m_overflowRelatedNodesMap.clear(); 178 m_positionedNodesWithRelatedOverflow.clear(); 178 179 179 180 // orphanNodes keeps child nodes alive while we rebuild child lists. -
trunk/Source/WebCore/page/scrolling/ScrollingTree.h
r243316 r243380 151 151 RelatedNodesMap& overflowRelatedNodes() { return m_overflowRelatedNodesMap; } 152 152 153 HashSet<ScrollingNodeID>& positionedNodesWithRelatedOverflow() { return m_positionedNodesWithRelatedOverflow; } 154 153 155 WEBCORE_EXPORT String scrollingTreeAsText(ScrollingStateTreeAsTextBehavior = ScrollingStateTreeAsTextBehaviorNormal); 154 156 … … 174 176 175 177 RelatedNodesMap m_overflowRelatedNodesMap; 178 HashSet<ScrollingNodeID> m_positionedNodesWithRelatedOverflow; 176 179 177 180 struct TreeState { -
trunk/Source/WebCore/page/scrolling/cocoa/ScrollingTreePositionedNode.h
r243316 r243380 44 44 CALayer *layer() const { return m_layer.get(); } 45 45 46 ScrollPositioningBehavior scrollPositioningBehavior() const { return m_constraints.scrollPositioningBehavior(); } 47 const Vector<ScrollingNodeID>& relatedOverflowScrollingNodes() const { return m_relatedOverflowScrollingNodes; } 48 46 49 private: 47 50 ScrollingTreePositionedNode(ScrollingTree&, ScrollingNodeID); -
trunk/Source/WebCore/page/scrolling/cocoa/ScrollingTreePositionedNode.mm
r243309 r243380 73 73 } 74 74 } 75 if (!m_relatedOverflowScrollingNodes.isEmpty() && m_constraints.scrollPositioningBehavior() != ScrollPositioningBehavior::None) 76 scrollingTree().positionedNodesWithRelatedOverflow().add(scrollingNodeID()); 75 77 } 76 78 -
trunk/Source/WebKit/ChangeLog
r243379 r243380 1 2019-03-22 Antti Koivisto <antti@apple.com> 2 3 Handle UI side hit testing for ScrollPositioningBehavior::Stationary positioned nodes 4 https://bugs.webkit.org/show_bug.cgi?id=196100 5 <rdar://problem/49117933> 6 7 Reviewed by Simon Fraser. 8 9 Test: fast/scrolling/ios/overflow-scroll-overlap-6.html 10 11 * UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h: 12 (WebKit::RemoteLayerTreeNode::relatedScrollContainerIDs const): 13 (WebKit::RemoteLayerTreeNode::relatedScrollContainerPositioningBehavior const): 14 15 Make more generic and save the associated positioning behavior. 16 17 (WebKit::RemoteLayerTreeNode::nonAncestorScrollContainerIDs const): Deleted. 18 (WebKit::RemoteLayerTreeNode::addNonAncestorScrollContainerID): Deleted. 19 (WebKit::RemoteLayerTreeNode::clearNonAncestorScrollContainerIDs): Deleted. 20 * UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm: 21 (WebKit::RemoteLayerTreeNode::setRelatedScrollContainerBehaviorAndIDs): 22 * UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.h: 23 * UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm: 24 (WebKit::isScrolledBy): 25 26 Stationary relationship means the layer won't scroll the scroller. 27 28 * UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm: 29 (WebKit::RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations): 30 1 31 2019-03-22 Chris Dumez <cdumez@apple.com> 2 32 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h
r243316 r243380 60 60 void setEventRegion(const WebCore::Region&); 61 61 62 // If empty the layer is scrolled by an ancestor scroller.63 const auto& nonAncestorScrollContainerIDs() const { return m_nonAncestorScrollLayerIDs; }64 void addNonAncestorScrollContainerID(WebCore::GraphicsLayer::PlatformLayerID layerID) { m_nonAncestorScrollLayerIDs.append(layerID); }65 void clearNonAncestorScrollContainerIDs() { m_nonAncestorScrollLayerIDs.clear(); }62 // If empty the layer is scrolled normally by an ancestor scroller. 63 const auto& relatedScrollContainerIDs() const { return m_relatedScrollContainerIDs; } 64 WebCore::ScrollPositioningBehavior relatedScrollContainerPositioningBehavior() const { return m_relatedScrollContainerPositioningBehavior; } 65 void setRelatedScrollContainerBehaviorAndIDs(WebCore::ScrollPositioningBehavior, Vector<WebCore::GraphicsLayer::PlatformLayerID>&&); 66 66 67 67 void detachFromParent(); … … 83 83 84 84 WebCore::Region m_eventRegion; 85 Vector<WebCore::GraphicsLayer::PlatformLayerID> m_nonAncestorScrollLayerIDs; 85 86 Vector<WebCore::GraphicsLayer::PlatformLayerID> m_relatedScrollContainerIDs; 87 WebCore::ScrollPositioningBehavior m_relatedScrollContainerPositioningBehavior { WebCore::ScrollPositioningBehavior::None }; 86 88 }; 87 89 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm
r243007 r243380 93 93 } 94 94 95 void RemoteLayerTreeNode::setRelatedScrollContainerBehaviorAndIDs(WebCore::ScrollPositioningBehavior behavior, Vector<WebCore::GraphicsLayer::PlatformLayerID>&& scrollContainerIDs) 96 { 97 m_relatedScrollContainerPositioningBehavior = behavior; 98 m_relatedScrollContainerIDs = WTFMove(scrollContainerIDs); 99 } 100 95 101 void RemoteLayerTreeNode::initializeLayer() 96 102 { -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.h
r243316 r243380 128 128 #endif 129 129 bool m_propagatesMainFrameScrolls; 130 HashSet<WebCore::GraphicsLayer::PlatformLayerID> m_layersWith NonAncestorScrollingRelations;130 HashSet<WebCore::GraphicsLayer::PlatformLayerID> m_layersWithScrollingRelations; 131 131 }; 132 132 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm
r243316 r243380 75 75 76 76 auto* node = RemoteLayerTreeNode::forCALayer(view.layer); 77 if (node && scrollLayerID && node->nonAncestorScrollContainerIDs().contains(scrollLayerID)) 78 return true; 77 if (node && scrollLayerID && node->relatedScrollContainerIDs().contains(scrollLayerID)) { 78 switch (node->relatedScrollContainerPositioningBehavior()) { 79 case WebCore::ScrollPositioningBehavior::Moves: 80 return true; 81 case WebCore::ScrollPositioningBehavior::Stationary: 82 return false; 83 case WebCore::ScrollPositioningBehavior::None: 84 ASSERT_NOT_REACHED(); 85 } 86 } 79 87 } 80 88 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm
r243316 r243380 122 122 void RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations(const RemoteLayerTreeHost& remoteLayerTreeHost) 123 123 { 124 for (auto layerID : m_layersWith NonAncestorScrollingRelations) {124 for (auto layerID : m_layersWithScrollingRelations) { 125 125 if (auto* layerNode = remoteLayerTreeHost.nodeForID(layerID)) 126 layerNode-> clearNonAncestorScrollContainerIDs();127 } 128 m_layersWith NonAncestorScrollingRelations.clear();129 130 // Usually a scroll view scrolls its descendant layers. In some positioning cases it also controls non-descendants .126 layerNode->setRelatedScrollContainerBehaviorAndIDs({ }, { }); 127 } 128 m_layersWithScrollingRelations.clear(); 129 130 // Usually a scroll view scrolls its descendant layers. In some positioning cases it also controls non-descendants, or doesn't control a descendant. 131 131 // To do overlap hit testing correctly we tell layers about such relations. 132 133 // FIXME: This doesn't contain ScrollPositioningBehavior::Stationary nodes. They will need to be handled too. 134 // See https://bugs.webkit.org/show_bug.cgi?id=196100 135 for (auto& overflowAndPositionedNodeIDs : m_scrollingTree->overflowRelatedNodes()) { 136 auto* overflowNode = downcast<ScrollingTreeOverflowScrollingNode>(m_scrollingTree->nodeForID(overflowAndPositionedNodeIDs.key)); 137 for (auto positionedNodeID : overflowAndPositionedNodeIDs.value) { 138 auto* positionedNode = downcast<ScrollingTreePositionedNode>(m_scrollingTree->nodeForID(positionedNodeID)); 139 auto* positionedLayerNode = RemoteLayerTreeNode::forCALayer(positionedNode->layer()); 140 141 positionedLayerNode->addNonAncestorScrollContainerID(RemoteLayerTreeNode::layerID(overflowNode->scrollContainerLayer())); 142 143 m_layersWithNonAncestorScrollingRelations.add(positionedLayerNode->layerID()); 132 for (auto positionedNodeID : m_scrollingTree->positionedNodesWithRelatedOverflow()) { 133 auto* positionedNode = downcast<ScrollingTreePositionedNode>(m_scrollingTree->nodeForID(positionedNodeID)); 134 auto* positionedLayerNode = RemoteLayerTreeNode::forCALayer(positionedNode->layer()); 135 136 Vector<GraphicsLayer::PlatformLayerID> scrollContainerLayerIDs; 137 138 for (auto overflowNodeID : positionedNode->relatedOverflowScrollingNodes()) { 139 auto* overflowNode = downcast<ScrollingTreeOverflowScrollingNode>(m_scrollingTree->nodeForID(overflowNodeID)); 140 scrollContainerLayerIDs.append(RemoteLayerTreeNode::layerID(overflowNode->scrollContainerLayer())); 144 141 } 142 143 positionedLayerNode->setRelatedScrollContainerBehaviorAndIDs(positionedNode->scrollPositioningBehavior(), WTFMove(scrollContainerLayerIDs)); 144 145 m_layersWithScrollingRelations.add(positionedLayerNode->layerID()); 145 146 } 146 147 }
Note: See TracChangeset
for help on using the changeset viewer.