Changeset 240826 in webkit


Ignore:
Timestamp:
Jan 31, 2019, 3:58:25 PM (7 years ago)
Author:
Simon Fraser
Message:

Basic scrollability for async overflow scrolling on macOS
https://bugs.webkit.org/show_bug.cgi?id=194093

Reviewed by Antti Koivisto.

Give a ScrollingTreeOverflowScrollingNodeMac a ScrollingTreeScrollingNodeDelegateMac and have it keep track
of its layers so basic scrolling works for async overflow scroll.

  • page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h:
  • page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm:

(WebCore::ScrollingTreeOverflowScrollingNodeMac::create):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::ScrollingTreeOverflowScrollingNodeMac):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::commitStateBeforeChildren):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::commitStateAfterChildren):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::scrollPosition const):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::setScrollPosition):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::setScrollPositionWithoutContentEdgeConstraints):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::setScrollLayerPosition):

  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::updateScrollingLayers):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r240825 r240826  
     12019-01-31  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Basic scrollability for async overflow scrolling on macOS
     4        https://bugs.webkit.org/show_bug.cgi?id=194093
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Give a ScrollingTreeOverflowScrollingNodeMac a ScrollingTreeScrollingNodeDelegateMac and have it keep track
     9        of its layers so basic scrolling works for async overflow scroll.
     10
     11        * page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h:
     12        * page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm:
     13        (WebCore::ScrollingTreeOverflowScrollingNodeMac::create):
     14        (WebCore::ScrollingTreeOverflowScrollingNodeMac::ScrollingTreeOverflowScrollingNodeMac):
     15        (WebCore::ScrollingTreeOverflowScrollingNodeMac::commitStateBeforeChildren):
     16        (WebCore::ScrollingTreeOverflowScrollingNodeMac::commitStateAfterChildren):
     17        (WebCore::ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent):
     18        (WebCore::ScrollingTreeOverflowScrollingNodeMac::scrollPosition const):
     19        (WebCore::ScrollingTreeOverflowScrollingNodeMac::setScrollPosition):
     20        (WebCore::ScrollingTreeOverflowScrollingNodeMac::setScrollPositionWithoutContentEdgeConstraints):
     21        (WebCore::ScrollingTreeOverflowScrollingNodeMac::setScrollLayerPosition):
     22        * rendering/RenderLayerBacking.cpp:
     23        (WebCore::RenderLayerBacking::updateScrollingLayers):
     24
    1252019-01-31  Simon Fraser  <simon.fraser@apple.com>
    226
  • trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h

    r240787 r240826  
    2929
    3030#include "ScrollingTreeOverflowScrollingNode.h"
     31#include "ScrollingTreeScrollingNodeDelegateMac.h"
     32
     33OBJC_CLASS CALayer;
    3134
    3235namespace WebCore {
    3336
    34 class ScrollingTreeOverflowScrollingNodeMac : public WebCore::ScrollingTreeOverflowScrollingNode {
     37class ScrollingTreeOverflowScrollingNodeMac : public ScrollingTreeOverflowScrollingNode {
    3538public:
    36     static Ref<ScrollingTreeOverflowScrollingNodeMac> create(WebCore::ScrollingTree&, WebCore::ScrollingNodeID);
     39    static Ref<ScrollingTreeOverflowScrollingNodeMac> create(ScrollingTree&, ScrollingNodeID);
    3740    virtual ~ScrollingTreeOverflowScrollingNodeMac();
    3841
    3942private:
    40     ScrollingTreeOverflowScrollingNodeMac(WebCore::ScrollingTree&, WebCore::ScrollingNodeID);
     43    ScrollingTreeOverflowScrollingNodeMac(ScrollingTree&, ScrollingNodeID);
    4144
    42     void commitStateBeforeChildren(const WebCore::ScrollingStateNode&) override;
    43     void commitStateAfterChildren(const WebCore::ScrollingStateNode&) override;
     45    void commitStateBeforeChildren(const ScrollingStateNode&) override;
     46    void commitStateAfterChildren(const ScrollingStateNode&) override;
    4447   
    45     WebCore::FloatPoint scrollPosition() const override;
     48    FloatPoint scrollPosition() const override;
     49    void setScrollPosition(const FloatPoint&) override;
     50    void setScrollPositionWithoutContentEdgeConstraints(const FloatPoint&) override;
    4651
    47     void setScrollLayerPosition(const WebCore::FloatPoint&, const WebCore::FloatRect& layoutViewport) override;
     52    void setScrollLayerPosition(const FloatPoint&, const FloatRect& layoutViewport) override;
    4853
    49     void updateLayersAfterViewportChange(const WebCore::FloatRect&, double) override { }
    50     void updateLayersAfterDelegatedScroll(const WebCore::FloatPoint& scrollPosition) override;
     54    void updateLayersAfterViewportChange(const FloatRect&, double) override { }
     55    void updateLayersAfterDelegatedScroll(const FloatPoint& scrollPosition) override;
    5156
    52     void updateLayersAfterAncestorChange(const WebCore::ScrollingTreeNode& changedNode, const WebCore::FloatRect& fixedPositionRect, const WebCore::FloatSize& cumulativeDelta) override;
     57    void updateLayersAfterAncestorChange(const ScrollingTreeNode& changedNode, const FloatRect& fixedPositionRect, const FloatSize& cumulativeDelta) override;
    5358
    54     ScrollingEventResult handleWheelEvent(const WebCore::PlatformWheelEvent&) override { return ScrollingEventResult::DidNotHandleEvent; }
     59    ScrollingEventResult handleWheelEvent(const PlatformWheelEvent&) override;
     60
     61
     62    RetainPtr<CALayer> m_scrollLayer;
     63    RetainPtr<CALayer> m_scrolledContentsLayer;
     64
     65
     66    ScrollingTreeScrollingNodeDelegateMac m_delegate;
     67
    5568};
    5669
  • trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm

    r240105 r240826  
    2929#if ENABLE(ASYNC_SCROLLING) && PLATFORM(MAC)
    3030
     31#import "Logging.h"
     32#import "ScrollingStateOverflowScrollingNode.h"
     33#import "ScrollingTree.h"
     34#import <wtf/text/TextStream.h>
     35
    3136namespace WebCore {
    3237
    33 Ref<ScrollingTreeOverflowScrollingNodeMac> ScrollingTreeOverflowScrollingNodeMac::create(WebCore::ScrollingTree& scrollingTree, WebCore::ScrollingNodeID nodeID)
     38Ref<ScrollingTreeOverflowScrollingNodeMac> ScrollingTreeOverflowScrollingNodeMac::create(ScrollingTree& scrollingTree, ScrollingNodeID nodeID)
    3439{
    3540    return adoptRef(*new ScrollingTreeOverflowScrollingNodeMac(scrollingTree, nodeID));
    3641}
    3742
    38 ScrollingTreeOverflowScrollingNodeMac::ScrollingTreeOverflowScrollingNodeMac(WebCore::ScrollingTree& scrollingTree, WebCore::ScrollingNodeID nodeID)
     43ScrollingTreeOverflowScrollingNodeMac::ScrollingTreeOverflowScrollingNodeMac(ScrollingTree& scrollingTree, ScrollingNodeID nodeID)
    3944    : ScrollingTreeOverflowScrollingNode(scrollingTree, nodeID)
     45    , m_delegate(*this)
    4046{
    4147}
     
    4551}
    4652
    47 void ScrollingTreeOverflowScrollingNodeMac::commitStateBeforeChildren(const WebCore::ScrollingStateNode& stateNode)
     53void ScrollingTreeOverflowScrollingNodeMac::commitStateBeforeChildren(const ScrollingStateNode& stateNode)
    4854{
    4955    ScrollingTreeOverflowScrollingNode::commitStateBeforeChildren(stateNode);
     56    const auto& scrollingStateNode = downcast<ScrollingStateOverflowScrollingNode>(stateNode);
     57
     58    if (scrollingStateNode.hasChangedProperty(ScrollingStateNode::ScrollLayer))
     59        m_scrollLayer = scrollingStateNode.layer();
     60
     61    if (scrollingStateNode.hasChangedProperty(ScrollingStateScrollingNode::ScrolledContentsLayer))
     62        m_scrolledContentsLayer = scrollingStateNode.scrolledContentsLayer();
     63
     64    // FIXME: Scroll snap data.
    5065}
    5166
     
    5368{
    5469    ScrollingTreeOverflowScrollingNode::commitStateAfterChildren(stateNode);
     70   
     71    // FIXME: RequestedScrollPosition etc.
    5572}
     73
     74ScrollingEventResult ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent)
     75{
     76    if (!canHaveScrollbars())
     77        return ScrollingEventResult::DidNotHandleEvent;
     78
     79
     80#if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
     81    if (expectsWheelEventTestTrigger()) {
     82        if (scrollingTree().shouldHandleWheelEventSynchronously(wheelEvent))
     83            m_delegate.removeTestDeferralForReason(reinterpret_cast<WheelEventTestTrigger::ScrollableAreaIdentifier>(scrollingNodeID()), WheelEventTestTrigger::ScrollingThreadSyncNeeded);
     84        else
     85            m_delegate.deferTestsForReason(reinterpret_cast<WheelEventTestTrigger::ScrollableAreaIdentifier>(scrollingNodeID()), WheelEventTestTrigger::ScrollingThreadSyncNeeded);
     86    }
     87#endif
     88
     89    m_delegate.handleWheelEvent(wheelEvent);
     90
     91    // FIXME: Scroll snap
     92
     93    scrollingTree().setOrClearLatchedNode(wheelEvent, scrollingNodeID());
     94    scrollingTree().handleWheelEventPhase(wheelEvent.phase());
     95   
     96    // FIXME: This needs to return whether the event was handled.
     97    return ScrollingEventResult::DidHandleEvent;
     98}
     99
     100
    56101
    57102void ScrollingTreeOverflowScrollingNodeMac::updateLayersAfterAncestorChange(const ScrollingTreeNode& changedNode, const FloatRect& fixedPositionRect, const FloatSize& cumulativeDelta)
     
    64109FloatPoint ScrollingTreeOverflowScrollingNodeMac::scrollPosition() const
    65110{
    66     return { };
     111    return -m_scrolledContentsLayer.get().position;
    67112}
    68113
    69 void ScrollingTreeOverflowScrollingNodeMac::setScrollLayerPosition(const FloatPoint& scrollPosition, const FloatRect&)
     114void ScrollingTreeOverflowScrollingNodeMac::setScrollPosition(const FloatPoint& scrollPosition)
    70115{
    71     UNUSED_PARAM(scrollPosition);
     116    LOG_WITH_STREAM(Scrolling, stream << "ScrollingTreeOverflowScrollingNodeMac::setScrollPosition " << scrollPosition << " scrollPosition(): " << this->scrollPosition() << " min: " << minimumScrollPosition() << " max: " << maximumScrollPosition());
     117
     118    // Scroll deltas can be non-integral with some input devices, so scrollPosition may not be integral.
     119    // FIXME: when we support half-pixel scroll positions on Retina displays, this will need to round to half pixels.
     120    FloatPoint roundedPosition(roundf(scrollPosition.x()), roundf(scrollPosition.y()));
     121
     122    ScrollingTreeOverflowScrollingNode::setScrollPosition(roundedPosition);
     123}
     124
     125void ScrollingTreeOverflowScrollingNodeMac::setScrollPositionWithoutContentEdgeConstraints(const FloatPoint& scrollPosition)
     126{
     127    setScrollLayerPosition(scrollPosition, { });
     128    scrollingTree().scrollingTreeNodeDidScroll(scrollingNodeID(), scrollPosition, { });
     129}
     130
     131void ScrollingTreeOverflowScrollingNodeMac::setScrollLayerPosition(const FloatPoint& scrollPosition, const FloatRect& fixedPositionRect)
     132{
     133    m_scrolledContentsLayer.get().position = -scrollPosition;
     134    if (!m_children)
     135        return;
     136
     137    for (auto& child : *m_children)
     138        child->updateLayersAfterAncestorChange(*this, fixedPositionRect, { });
    72139}
    73140
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r240713 r240826  
    17461746
    17471747        // Inner layer which renders the content that scrolls.
    1748         m_scrollingContentsLayer = createGraphicsLayer("scrolled Contents");
     1748        m_scrollingContentsLayer = createGraphicsLayer("scrolled contents");
    17491749        m_scrollingContentsLayer->setDrawsContent(true);
    17501750        m_scrollingContentsLayer->setAnchorPoint({ });
Note: See TracChangeset for help on using the changeset viewer.