Changeset 243380 in webkit


Ignore:
Timestamp:
Mar 22, 2019 9:28:55 AM (5 years ago)
Author:
Antti Koivisto
Message:

Handle UI side hit testing for ScrollPositioningBehavior::Stationary positioned nodes
https://bugs.webkit.org/show_bug.cgi?id=196100
<rdar://problem/49117933>

Reviewed by Simon Fraser.

Source/WebCore:

Test: fast/scrolling/ios/overflow-scroll-overlap-6.html

  • page/scrolling/ScrollingTree.cpp:

(WebCore::ScrollingTree::commitTreeState):

  • page/scrolling/ScrollingTree.h:

(WebCore::ScrollingTree::positionedNodesWithRelatedOverflow):

Add a separate map of positioned node ids for easy access.

  • page/scrolling/cocoa/ScrollingTreePositionedNode.h:

(WebCore::ScrollingTreePositionedNode::scrollPositioningBehavior const):
(WebCore::ScrollingTreePositionedNode::relatedOverflowScrollingNodes const):

  • page/scrolling/cocoa/ScrollingTreePositionedNode.mm:

(WebCore::ScrollingTreePositionedNode::commitStateBeforeChildren):

Source/WebKit:

Test: fast/scrolling/ios/overflow-scroll-overlap-6.html

  • UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h:

(WebKit::RemoteLayerTreeNode::relatedScrollContainerIDs const):
(WebKit::RemoteLayerTreeNode::relatedScrollContainerPositioningBehavior const):

Make more generic and save the associated positioning behavior.

(WebKit::RemoteLayerTreeNode::nonAncestorScrollContainerIDs const): Deleted.
(WebKit::RemoteLayerTreeNode::addNonAncestorScrollContainerID): Deleted.
(WebKit::RemoteLayerTreeNode::clearNonAncestorScrollContainerIDs): Deleted.

  • UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm:

(WebKit::RemoteLayerTreeNode::setRelatedScrollContainerBehaviorAndIDs):

  • UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.h:
  • UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm:

(WebKit::isScrolledBy):

Stationary relationship means the layer won't scroll the scroller.

  • UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm:

(WebKit::RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations):

LayoutTests:

  • fast/scrolling/ios/overflow-scroll-overlap-6-expected.txt: Added.
  • fast/scrolling/ios/overflow-scroll-overlap-6.html: Added.
Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r243377 r243380  
     12019-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
    1122019-03-22  Simon Fraser  <simon.fraser@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r243374 r243380  
     12019-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
    1242019-03-22  Antoine Quint  <graouts@apple.com>
    225
  • trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp

    r242997 r243380  
    176176
    177177    m_overflowRelatedNodesMap.clear();
     178    m_positionedNodesWithRelatedOverflow.clear();
    178179
    179180    // orphanNodes keeps child nodes alive while we rebuild child lists.
  • trunk/Source/WebCore/page/scrolling/ScrollingTree.h

    r243316 r243380  
    151151    RelatedNodesMap& overflowRelatedNodes() { return m_overflowRelatedNodesMap; }
    152152
     153    HashSet<ScrollingNodeID>& positionedNodesWithRelatedOverflow() { return m_positionedNodesWithRelatedOverflow; }
     154
    153155    WEBCORE_EXPORT String scrollingTreeAsText(ScrollingStateTreeAsTextBehavior = ScrollingStateTreeAsTextBehaviorNormal);
    154156   
     
    174176
    175177    RelatedNodesMap m_overflowRelatedNodesMap;
     178    HashSet<ScrollingNodeID> m_positionedNodesWithRelatedOverflow;
    176179
    177180    struct TreeState {
  • trunk/Source/WebCore/page/scrolling/cocoa/ScrollingTreePositionedNode.h

    r243316 r243380  
    4444    CALayer *layer() const { return m_layer.get(); }
    4545
     46    ScrollPositioningBehavior scrollPositioningBehavior() const { return m_constraints.scrollPositioningBehavior(); }
     47    const Vector<ScrollingNodeID>& relatedOverflowScrollingNodes() const { return m_relatedOverflowScrollingNodes; }
     48
    4649private:
    4750    ScrollingTreePositionedNode(ScrollingTree&, ScrollingNodeID);
  • trunk/Source/WebCore/page/scrolling/cocoa/ScrollingTreePositionedNode.mm

    r243309 r243380  
    7373        }
    7474    }
     75    if (!m_relatedOverflowScrollingNodes.isEmpty() && m_constraints.scrollPositioningBehavior() != ScrollPositioningBehavior::None)
     76        scrollingTree().positionedNodesWithRelatedOverflow().add(scrollingNodeID());
    7577}
    7678
  • trunk/Source/WebKit/ChangeLog

    r243379 r243380  
     12019-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
    1312019-03-22  Chris Dumez  <cdumez@apple.com>
    232
  • trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h

    r243316 r243380  
    6060    void setEventRegion(const WebCore::Region&);
    6161
    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>&&);
    6666
    6767    void detachFromParent();
     
    8383
    8484    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 };
    8688};
    8789
  • trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm

    r243007 r243380  
    9393}
    9494
     95void RemoteLayerTreeNode::setRelatedScrollContainerBehaviorAndIDs(WebCore::ScrollPositioningBehavior behavior, Vector<WebCore::GraphicsLayer::PlatformLayerID>&& scrollContainerIDs)
     96{
     97    m_relatedScrollContainerPositioningBehavior = behavior;
     98    m_relatedScrollContainerIDs = WTFMove(scrollContainerIDs);
     99}
     100
    95101void RemoteLayerTreeNode::initializeLayer()
    96102{
  • trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteScrollingCoordinatorProxy.h

    r243316 r243380  
    128128#endif
    129129    bool m_propagatesMainFrameScrolls;
    130     HashSet<WebCore::GraphicsLayer::PlatformLayerID> m_layersWithNonAncestorScrollingRelations;
     130    HashSet<WebCore::GraphicsLayer::PlatformLayerID> m_layersWithScrollingRelations;
    131131};
    132132
  • trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm

    r243316 r243380  
    7575
    7676        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        }
    7987    }
    8088
  • trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm

    r243316 r243380  
    122122void RemoteScrollingCoordinatorProxy::establishLayerTreeScrollingRelations(const RemoteLayerTreeHost& remoteLayerTreeHost)
    123123{
    124     for (auto layerID : m_layersWithNonAncestorScrollingRelations) {
     124    for (auto layerID : m_layersWithScrollingRelations) {
    125125        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.
     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.
    131131    // 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()));
    144141        }
     142
     143        positionedLayerNode->setRelatedScrollContainerBehaviorAndIDs(positionedNode->scrollPositioningBehavior(), WTFMove(scrollContainerLayerIDs));
     144
     145        m_layersWithScrollingRelations.add(positionedLayerNode->layerID());
    145146    }
    146147}
Note: See TracChangeset for help on using the changeset viewer.