Changeset 240826 in webkit
- Timestamp:
- Jan 31, 2019, 3:58:25 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h (modified) (1 diff)
-
page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm (modified) (4 diffs)
-
rendering/RenderLayerBacking.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r240825 r240826 1 2019-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 1 25 2019-01-31 Simon Fraser <simon.fraser@apple.com> 2 26 -
trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h
r240787 r240826 29 29 30 30 #include "ScrollingTreeOverflowScrollingNode.h" 31 #include "ScrollingTreeScrollingNodeDelegateMac.h" 32 33 OBJC_CLASS CALayer; 31 34 32 35 namespace WebCore { 33 36 34 class ScrollingTreeOverflowScrollingNodeMac : public WebCore::ScrollingTreeOverflowScrollingNode {37 class ScrollingTreeOverflowScrollingNodeMac : public ScrollingTreeOverflowScrollingNode { 35 38 public: 36 static Ref<ScrollingTreeOverflowScrollingNodeMac> create( WebCore::ScrollingTree&, WebCore::ScrollingNodeID);39 static Ref<ScrollingTreeOverflowScrollingNodeMac> create(ScrollingTree&, ScrollingNodeID); 37 40 virtual ~ScrollingTreeOverflowScrollingNodeMac(); 38 41 39 42 private: 40 ScrollingTreeOverflowScrollingNodeMac( WebCore::ScrollingTree&, WebCore::ScrollingNodeID);43 ScrollingTreeOverflowScrollingNodeMac(ScrollingTree&, ScrollingNodeID); 41 44 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; 44 47 45 WebCore::FloatPoint scrollPosition() const override; 48 FloatPoint scrollPosition() const override; 49 void setScrollPosition(const FloatPoint&) override; 50 void setScrollPositionWithoutContentEdgeConstraints(const FloatPoint&) override; 46 51 47 void setScrollLayerPosition(const WebCore::FloatPoint&, const WebCore::FloatRect& layoutViewport) override;52 void setScrollLayerPosition(const FloatPoint&, const FloatRect& layoutViewport) override; 48 53 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; 51 56 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; 53 58 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 55 68 }; 56 69 -
trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm
r240105 r240826 29 29 #if ENABLE(ASYNC_SCROLLING) && PLATFORM(MAC) 30 30 31 #import "Logging.h" 32 #import "ScrollingStateOverflowScrollingNode.h" 33 #import "ScrollingTree.h" 34 #import <wtf/text/TextStream.h> 35 31 36 namespace WebCore { 32 37 33 Ref<ScrollingTreeOverflowScrollingNodeMac> ScrollingTreeOverflowScrollingNodeMac::create( WebCore::ScrollingTree& scrollingTree, WebCore::ScrollingNodeID nodeID)38 Ref<ScrollingTreeOverflowScrollingNodeMac> ScrollingTreeOverflowScrollingNodeMac::create(ScrollingTree& scrollingTree, ScrollingNodeID nodeID) 34 39 { 35 40 return adoptRef(*new ScrollingTreeOverflowScrollingNodeMac(scrollingTree, nodeID)); 36 41 } 37 42 38 ScrollingTreeOverflowScrollingNodeMac::ScrollingTreeOverflowScrollingNodeMac( WebCore::ScrollingTree& scrollingTree, WebCore::ScrollingNodeID nodeID)43 ScrollingTreeOverflowScrollingNodeMac::ScrollingTreeOverflowScrollingNodeMac(ScrollingTree& scrollingTree, ScrollingNodeID nodeID) 39 44 : ScrollingTreeOverflowScrollingNode(scrollingTree, nodeID) 45 , m_delegate(*this) 40 46 { 41 47 } … … 45 51 } 46 52 47 void ScrollingTreeOverflowScrollingNodeMac::commitStateBeforeChildren(const WebCore::ScrollingStateNode& stateNode)53 void ScrollingTreeOverflowScrollingNodeMac::commitStateBeforeChildren(const ScrollingStateNode& stateNode) 48 54 { 49 55 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. 50 65 } 51 66 … … 53 68 { 54 69 ScrollingTreeOverflowScrollingNode::commitStateAfterChildren(stateNode); 70 71 // FIXME: RequestedScrollPosition etc. 55 72 } 73 74 ScrollingEventResult 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 56 101 57 102 void ScrollingTreeOverflowScrollingNodeMac::updateLayersAfterAncestorChange(const ScrollingTreeNode& changedNode, const FloatRect& fixedPositionRect, const FloatSize& cumulativeDelta) … … 64 109 FloatPoint ScrollingTreeOverflowScrollingNodeMac::scrollPosition() const 65 110 { 66 return { };111 return -m_scrolledContentsLayer.get().position; 67 112 } 68 113 69 void ScrollingTreeOverflowScrollingNodeMac::setScroll LayerPosition(const FloatPoint& scrollPosition, const FloatRect&)114 void ScrollingTreeOverflowScrollingNodeMac::setScrollPosition(const FloatPoint& scrollPosition) 70 115 { 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 125 void ScrollingTreeOverflowScrollingNodeMac::setScrollPositionWithoutContentEdgeConstraints(const FloatPoint& scrollPosition) 126 { 127 setScrollLayerPosition(scrollPosition, { }); 128 scrollingTree().scrollingTreeNodeDidScroll(scrollingNodeID(), scrollPosition, { }); 129 } 130 131 void 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, { }); 72 139 } 73 140 -
trunk/Source/WebCore/rendering/RenderLayerBacking.cpp
r240713 r240826 1746 1746 1747 1747 // Inner layer which renders the content that scrolls. 1748 m_scrollingContentsLayer = createGraphicsLayer("scrolled Contents");1748 m_scrollingContentsLayer = createGraphicsLayer("scrolled contents"); 1749 1749 m_scrollingContentsLayer->setDrawsContent(true); 1750 1750 m_scrollingContentsLayer->setAnchorPoint({ });
Note:
See TracChangeset
for help on using the changeset viewer.