Changeset 243316 in webkit
- Timestamp:
- Mar 21, 2019 12:54:25 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r243314 r243316 1 2019-03-21 Antti Koivisto <antti@apple.com> 2 3 UI-process hit-testing needs to know about containing block relationships 4 https://bugs.webkit.org/show_bug.cgi?id=195845 5 <rdar://problem/48949633> 6 7 Reviewed by Simon Fraser. 8 9 * fast/scrolling/ios/overflow-scroll-overlap-5-expected.txt: Added. 10 * fast/scrolling/ios/overflow-scroll-overlap-5.html: Added. 11 1 12 2019-03-21 Shawn Roberts <sroberts@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r243315 r243316 1 2019-03-21 Antti Koivisto <antti@apple.com> 2 3 UI-process hit-testing needs to know about containing block relationships 4 https://bugs.webkit.org/show_bug.cgi?id=195845 5 <rdar://problem/48949633> 6 7 Reviewed by Simon Fraser. 8 9 Test: fast/scrolling/ios/overflow-scroll-overlap-5.html 10 11 * page/scrolling/ScrollingTree.h: 12 * page/scrolling/ScrollingTreeScrollingNode.h: 13 * page/scrolling/cocoa/ScrollingTreePositionedNode.h: 14 (WebCore::ScrollingTreePositionedNode::layer const): 15 1 16 2019-03-21 Zalan Bujtas <zalan@apple.com> 2 17 -
trunk/Source/WebCore/page/scrolling/ScrollingTree.h
r242997 r243316 74 74 virtual Ref<ScrollingTreeNode> createScrollingTreeNode(ScrollingNodeType, ScrollingNodeID) = 0; 75 75 76 ScrollingTreeNode* nodeForID(ScrollingNodeID) const;76 WEBCORE_EXPORT ScrollingTreeNode* nodeForID(ScrollingNodeID) const; 77 77 78 78 // Called after a scrolling tree node has handled a scroll and updated its layers. -
trunk/Source/WebCore/page/scrolling/ScrollingTreeScrollingNode.h
r242687 r243316 82 82 ScrollingTreeScrollingNode* scrollingNodeForPoint(LayoutPoint) const override; 83 83 84 #if PLATFORM(COCOA) 85 CALayer *scrollContainerLayer() const { return m_scrollContainerLayer.get(); } 86 CALayer *scrolledContentsLayer() const { return m_scrolledContentsLayer.get(); } 87 #endif 88 84 89 protected: 85 90 ScrollingTreeScrollingNode(ScrollingTree&, ScrollingNodeType, ScrollingNodeID); … … 121 126 bool expectsWheelEventTestTrigger() const { return m_expectsWheelEventTestTrigger; } 122 127 123 #if PLATFORM(COCOA)124 CALayer *scrollContainerLayer() const { return m_scrollContainerLayer.get(); }125 CALayer *scrolledContentsLayer() const { return m_scrolledContentsLayer.get(); }126 #endif127 128 128 LayoutPoint parentToLocalPoint(LayoutPoint) const override; 129 129 LayoutPoint localToContentsPoint(LayoutPoint) const override; -
trunk/Source/WebCore/page/scrolling/cocoa/ScrollingTreePositionedNode.h
r242997 r243316 42 42 virtual ~ScrollingTreePositionedNode(); 43 43 44 CALayer *layer() const { return m_layer.get(); } 45 44 46 private: 45 47 ScrollingTreePositionedNode(ScrollingTree&, ScrollingNodeID); -
trunk/Source/WebKit/ChangeLog
r243302 r243316 1 2019-03-21 Antti Koivisto <antti@apple.com> 2 3 UI-process hit-testing needs to know about containing block relationships 4 https://bugs.webkit.org/show_bug.cgi?id=195845 5 <rdar://problem/48949633> 6 7 Reviewed by Simon Fraser. 8 9 Test: fast/scrolling/ios/overflow-scroll-overlap-5.html 10 11 When an overflow scroller contains a positioned element the element may not be on a descendant layer of the scroller, 12 yet should move along with it. This needs to be taken into account in UI-side hit testing. 13 14 * UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h: 15 (WebKit::RemoteLayerTreeNode::nonAncestorScrollContainerIDs const): 16 (WebKit::RemoteLayerTreeNode::addNonAncestorScrollContainerID): 17 (WebKit::RemoteLayerTreeNode::clearNonAncestorScrollContainerIDs): 18 19 Maintain non-ancestor scrolling relationships for layers. 20 21 * UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.cpp: 22 (WebKit::RemoteScrollingCoordinatorProxy::commitScrollingTreeState): 23 (WebKit::RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations): 24 * UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.h: 25 * UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm: 26 (WebKit::isScrolledBy): 27 28 Helper to figure out who scrolls who. 29 30 (-[UIView _web_findDescendantViewAtPoint:withEvent:]): 31 * UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm: 32 (WebKit::RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations): 33 34 After commit, pull the non-ancestor scrolling relationships from the scrolling tree and update the layer tree. 35 1 36 2019-03-21 Daniel Bates <dabates@apple.com> 2 37 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h
r243007 r243316 28 28 #include <WebCore/GraphicsLayer.h> 29 29 #include <wtf/RetainPtr.h> 30 #include <wtf/Vector.h> 30 31 31 32 OBJC_CLASS CALayer; … … 59 60 void setEventRegion(const WebCore::Region&); 60 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(); } 66 61 67 void detachFromParent(); 62 68 … … 77 83 78 84 WebCore::Region m_eventRegion; 85 Vector<WebCore::GraphicsLayer::PlatformLayerID> m_nonAncestorScrollLayerIDs; 79 86 }; 80 87 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.cpp
r242979 r243316 81 81 m_requestedScrollInfo = &requestedScrollInfo; 82 82 83 // FIXME: There must be a better idiom for this. 84 std::unique_ptr<ScrollingStateTree> stateTree(const_cast<RemoteScrollingCoordinatorTransaction&>(transaction).scrollingStateTree().release()); 85 86 const RemoteLayerTreeHost* layerTreeHost = this->layerTreeHost(); 83 auto stateTree = WTFMove(const_cast<RemoteScrollingCoordinatorTransaction&>(transaction).scrollingStateTree()); 84 85 auto* layerTreeHost = this->layerTreeHost(); 87 86 if (!layerTreeHost) { 88 87 ASSERT_NOT_REACHED(); … … 92 91 connectStateNodeLayers(*stateTree, *layerTreeHost); 93 92 m_scrollingTree->commitTreeState(WTFMove(stateTree)); 93 94 establishLayerTreeScrollingRelations(*layerTreeHost); 94 95 95 96 m_requestedScrollInfo = nullptr; … … 164 165 } 165 166 } 167 168 void RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations(const RemoteLayerTreeHost&) 169 { 170 } 171 166 172 #endif 167 173 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.h
r242687 r243316 31 31 #include "RemoteScrollingCoordinator.h" 32 32 #include "RemoteScrollingTree.h" 33 #include <WebCore/GraphicsLayer.h> 33 34 #include <wtf/Noncopyable.h> 34 35 #include <wtf/RefPtr.h> … … 109 110 private: 110 111 void connectStateNodeLayers(WebCore::ScrollingStateTree&, const RemoteLayerTreeHost&); 112 void establishLayerTreeScrollingRelations(const RemoteLayerTreeHost&); 113 111 114 #if ENABLE(CSS_SCROLL_SNAP) 112 115 bool shouldSnapForMainFrameScrolling(WebCore::ScrollEventAxis) const; … … 125 128 #endif 126 129 bool m_propagatesMainFrameScrolls; 130 HashSet<WebCore::GraphicsLayer::PlatformLayerID> m_layersWithNonAncestorScrollingRelations; 127 131 }; 128 132 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm
r243134 r243316 66 66 } 67 67 68 static bool isScrolledBy(WKChildScrollView* scrollView, UIView *hitView) 69 { 70 auto scrollLayerID = RemoteLayerTreeNode::layerID(scrollView.layer); 71 72 for (UIView *view = hitView; view; view = [view superview]) { 73 if (view == scrollView) 74 return true; 75 76 auto* node = RemoteLayerTreeNode::forCALayer(view.layer); 77 if (node && scrollLayerID && node->nonAncestorScrollContainerIDs().contains(scrollLayerID)) 78 return true; 79 } 80 81 return false; 82 } 83 68 84 } 69 85 … … 90 106 91 107 if ([view isKindOfClass:[WKChildScrollView class]]) { 92 // See if the deepest view hit is actually a child of the scrollview. 93 if ([viewsAtPoint.last() isDescendantOfView:view]) 108 if (WebKit::isScrolledBy((WKChildScrollView *)view, viewsAtPoint.last())) 94 109 return view; 95 110 } -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm
r242913 r243316 44 44 #import <WebCore/ScrollTypes.h> 45 45 #import <WebCore/ScrollingTreeFrameScrollingNode.h> 46 #import <WebCore/ScrollingTreeOverflowScrollingNode.h> 47 #import <WebCore/ScrollingTreePositionedNode.h> 46 48 #endif 47 49 … … 118 120 } 119 121 122 void RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations(const RemoteLayerTreeHost& remoteLayerTreeHost) 123 { 124 for (auto layerID : m_layersWithNonAncestorScrollingRelations) { 125 if (auto* layerNode = remoteLayerTreeHost.nodeForID(layerID)) 126 layerNode->clearNonAncestorScrollContainerIDs(); 127 } 128 m_layersWithNonAncestorScrollingRelations.clear(); 129 130 // Usually a scroll view scrolls its descendant layers. In some positioning cases it also controls non-descendants. 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()); 144 } 145 } 146 } 147 120 148 #if ENABLE(CSS_SCROLL_SNAP) 121 149 void RemoteScrollingCoordinatorProxy::adjustTargetContentOffsetForSnapping(CGSize maxScrollOffsets, CGPoint velocity, CGFloat topInset, CGPoint* targetContentOffset)
Note: See TracChangeset
for help on using the changeset viewer.