Changeset 282697 in webkit
- Timestamp:
- Sep 17, 2021, 2:43:47 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 16 edited
-
ChangeLog (modified) (1 diff)
-
Sources.txt (modified) (1 diff)
-
SourcesGTK.txt (modified) (1 diff)
-
SourcesWPE.txt (modified) (1 diff)
-
WebCore.xcodeproj/project.pbxproj (modified) (6 diffs)
-
page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp (modified) (7 diffs)
-
page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h (modified) (3 diffs)
-
platform/ScrollAnimation.h (modified) (3 diffs)
-
platform/ScrollAnimationKinetic.cpp (modified) (7 diffs)
-
platform/ScrollAnimationKinetic.h (modified) (2 diffs)
-
platform/ScrollAnimationSmooth.cpp (modified) (12 diffs)
-
platform/ScrollAnimationSmooth.h (modified) (6 diffs)
-
platform/ScrollAnimator.cpp (modified) (7 diffs)
-
platform/ScrollAnimator.h (modified) (5 diffs)
-
platform/generic/ScrollAnimatorGeneric.cpp (modified) (4 diffs)
-
platform/generic/ScrollAnimatorGeneric.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r282696 r282697 1 2021-09-17 Simon Fraser <simon.fraser@apple.com> 2 3 Make ScrollAnimation a little more generic 4 https://bugs.webkit.org/show_bug.cgi?id=230385 5 6 Reviewed by Tim Horton. 7 8 Prepare for new ScrollAnimation subclasses by making it a little more generic. Rather 9 than the function callbacks, use a virtual client class, implemented by ScrollAnimator 10 and ScrollingTreeScrollingNodeDelegateNicosia. Remove the generic 'scroll' methods 11 from the base class, since they only apply to ScrollAnimationSmooth (clients need 12 to keep derived class pointers, and most already do). 13 14 Remove ambiguity around the currentPosition by requiring it for every 'start' call. 15 Remove ambiguity around setCurrentPosition() by removing it. Clients just call stop(). 16 Remove ambiguity around retargeting by making it explicit. 17 18 Do per-axis setup when starting animations, not when creating one, so the animation starts 19 out stateless. 20 21 * Sources.txt: Build platform/ScrollAnimationKinetic.cpp for macOS, mostly to catch 22 build errors (it's currently unused). 23 * WebCore.xcodeproj/project.pbxproj: 24 * page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp: 25 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::resetCurrentPosition): 26 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::ensureScrollAnimationKinetic): 27 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::ensureScrollAnimationSmooth): 28 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::handleWheelEvent): 29 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::scrollAnimationDidUpdate): 30 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::scrollAnimationDidEnd): 31 (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::scrollExtentsForAnimation): 32 * page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h: 33 * platform/ScrollAnimation.h: 34 (WebCore::ScrollAnimation::ScrollAnimation): 35 (WebCore::ScrollAnimation::updateScrollExtents): 36 (WebCore::ScrollAnimation::serviceAnimation): 37 (WebCore::ScrollAnimation::~ScrollAnimation): Deleted. 38 (WebCore::ScrollAnimation::scroll): Deleted. 39 (WebCore::ScrollAnimation::updateVisibleLengths): Deleted. 40 (WebCore::ScrollAnimation::setCurrentPosition): Deleted. 41 * platform/ScrollAnimationKinetic.cpp: 42 (WebCore::ScrollAnimationKinetic::ScrollAnimationKinetic): 43 (WebCore::ScrollAnimationKinetic::startAnimatedScrollWithInitialVelocity): 44 (WebCore::ScrollAnimationKinetic::animationTimerFired): 45 (WebCore::ScrollAnimationKinetic::start): Deleted. 46 * platform/ScrollAnimationKinetic.h: 47 * platform/ScrollAnimationSmooth.cpp: 48 (WebCore::ScrollAnimationSmooth::ScrollAnimationSmooth): 49 (WebCore::ScrollAnimationSmooth::startAnimatedScroll): 50 (WebCore::ScrollAnimationSmooth::startAnimatedScrollToDestination): 51 (WebCore::ScrollAnimationSmooth::stop): 52 (WebCore::ScrollAnimationSmooth::updateScrollExtents): 53 (WebCore::ScrollAnimationSmooth::initializeAxesData): 54 (WebCore::ScrollAnimationSmooth::animationTimerFired): 55 (WebCore::ScrollAnimationSmooth::PerAxisData::PerAxisData): Deleted. 56 (WebCore::ScrollAnimationSmooth::scroll): Deleted. 57 (WebCore::ScrollAnimationSmooth::updateVisibleLengths): Deleted. 58 (WebCore::ScrollAnimationSmooth::setCurrentPosition): Deleted. 59 * platform/ScrollAnimationSmooth.h: Rename some "time" variables to "duration" for clarity 60 * platform/ScrollAnimator.cpp: 61 (WebCore::ScrollAnimator::ScrollAnimator): 62 (WebCore::ScrollAnimator::scroll): 63 (WebCore::ScrollAnimator::scrollToPositionWithoutAnimation): 64 (WebCore::ScrollAnimator::scrollToPositionWithAnimation): 65 (WebCore::ScrollAnimator::retargetRunningAnimation): 66 (WebCore::ScrollAnimator::contentsResized const): 67 (WebCore::ScrollAnimator::willEndLiveResize): 68 (WebCore::ScrollAnimator::didAddVerticalScrollbar): 69 (WebCore::ScrollAnimator::didAddHorizontalScrollbar): 70 (WebCore::ScrollAnimator::scrollAnimationDidUpdate): 71 (WebCore::ScrollAnimator::scrollAnimationDidEnd): 72 (WebCore::ScrollAnimator::scrollExtentsForAnimation): 73 (): Deleted. 74 (WebCore::m_keyboardScrollingAnimator): Deleted. 75 * platform/ScrollAnimator.h: 76 * platform/generic/ScrollAnimatorGeneric.cpp: 77 (WebCore::ScrollAnimatorGeneric::ScrollAnimatorGeneric): 78 (WebCore::ScrollAnimatorGeneric::handleWheelEvent): 79 (WebCore::ScrollAnimatorGeneric::updatePosition): 80 (WebCore::ScrollAnimatorGeneric::scrollAnimationDidUpdate): 81 * platform/generic/ScrollAnimatorGeneric.h: 82 1 83 2021-09-17 Cameron McCormack <heycam@apple.com> 2 84 -
trunk/Source/WebCore/Sources.txt
r282525 r282697 1812 1812 platform/RuntimeApplicationChecks.cpp 1813 1813 platform/SSLKeyGenerator.cpp 1814 platform/ScrollAnimationKinetic.cpp 1814 1815 platform/ScrollAnimationSmooth.cpp 1815 1816 platform/ScrollAnimator.cpp -
trunk/Source/WebCore/SourcesGTK.txt
r282643 r282697 70 70 page/scrolling/nicosia/ScrollingTreeStickyNode.cpp 71 71 72 platform/ScrollAnimationKinetic.cpp73 72 platform/UserAgentQuirks.cpp 74 73 -
trunk/Source/WebCore/SourcesWPE.txt
r274750 r282697 59 59 page/scrolling/nicosia/ScrollingTreeStickyNode.cpp 60 60 61 platform/ScrollAnimationKinetic.cpp62 61 platform/UserAgentQuirks.cpp 63 62 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r282525 r282697 353 353 0F9DAA0F1FD1C66A0079C5B2 /* DOMGCOutputConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F9DAA0E1FD1C6640079C5B2 /* DOMGCOutputConstraint.h */; }; 354 354 0FA24D7A162DF91900A3F4C0 /* GraphicsLayerUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FA24D78162DF91900A3F4C0 /* GraphicsLayerUpdater.h */; settings = {ATTRIBUTES = (Private, ); }; }; 355 0FA61B0E26F43213001AADB6 /* ScrollAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FA61B0C26F43212001AADB6 /* ScrollAnimation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 355 356 0FB6252F18DE1B1500A07C05 /* GeometryUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB6252D18DE1B1500A07C05 /* GeometryUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; 356 357 0FB8890F167D30160010CDA5 /* ScrollingStateStickyNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB8890D167D30160010CDA5 /* ScrollingStateStickyNode.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 6325 6326 0FA24D77162DF91900A3F4C0 /* GraphicsLayerUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsLayerUpdater.cpp; sourceTree = "<group>"; }; 6326 6327 0FA24D78162DF91900A3F4C0 /* GraphicsLayerUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GraphicsLayerUpdater.h; sourceTree = "<group>"; }; 6328 0FA61B0C26F43212001AADB6 /* ScrollAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollAnimation.h; sourceTree = "<group>"; }; 6327 6329 0FB0689425243B90001E8E75 /* DisplayTextBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DisplayTextBox.cpp; sourceTree = "<group>"; }; 6328 6330 0FB0689625243B90001E8E75 /* DisplayTextBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DisplayTextBox.h; sourceTree = "<group>"; }; … … 28044 28046 BC8AE34C12EA096A00EB3AE6 /* ScrollableArea.cpp */, 28045 28047 BC8AE34D12EA096A00EB3AE6 /* ScrollableArea.h */, 28048 0FA61B0C26F43212001AADB6 /* ScrollAnimation.h */, 28046 28049 0FC692BC257C0F410098E3F9 /* ScrollAnimationKinetic.cpp */, 28047 28050 0FC692BA257C0F400098E3F9 /* ScrollAnimationKinetic.h */, … … 33133 33136 652FBBBC0DE27CB60001D386 /* JSDOMWindowCustom.h in Headers */, 33134 33137 460CBF361D4BCD0E0092E88E /* JSDOMWindowProperties.h in Headers */, 33135 410BCF5626F0CD8C0040B124 /* RTCLocalSessionDescriptionInit.h in Headers */,33136 33138 65E0E9441133C89F00B4CB10 /* JSDOMWrapper.h in Headers */, 33137 33139 7C45C9D31E3FCBD700AAB558 /* JSDOMWrapperCache.h in Headers */, … … 34743 34745 313591081E7DDC7300F30630 /* RTCIceTransportPolicy.h in Headers */, 34744 34746 313591091E7DDC7300F30630 /* RTCIceTransportState.h in Headers */, 34747 410BCF5626F0CD8C0040B124 /* RTCLocalSessionDescriptionInit.h in Headers */, 34745 34748 41C14BC626DE6DE800685BF5 /* RTCNetworkManager.h in Headers */, 34746 34749 073794FE19F5864E00E5A045 /* RTCNotifiersMock.h in Headers */, … … 34815 34818 BC8AE34F12EA096A00EB3AE6 /* ScrollableArea.h in Headers */, 34816 34819 5D925B680F64D4DD00B847F0 /* ScrollAlignment.h in Headers */, 34820 0FA61B0E26F43213001AADB6 /* ScrollAnimation.h in Headers */, 34817 34821 CA3BF67E10D99BAE00E6CE53 /* ScrollAnimator.h in Headers */, 34818 34822 0F1774801378B772009DA76A /* ScrollAnimatorIOS.h in Headers */, -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp
r280171 r282697 62 62 #if ENABLE(SMOOTH_SCROLLING) 63 63 if (m_smoothAnimation) 64 m_smoothAnimation->s etCurrentPosition(scrollingNode().currentScrollPosition());64 m_smoothAnimation->stop(); 65 65 #endif 66 66 } … … 70 70 #if ENABLE(SMOOTH_SCROLLING) 71 71 if (m_smoothAnimation) 72 m_smoothAnimation->update VisibleLengths();72 m_smoothAnimation->updateScrollExtents(); 73 73 #endif 74 74 } … … 80 80 return; 81 81 82 m_kineticAnimation = makeUnique<ScrollAnimationKinetic>( 83 [this]() -> ScrollExtents { 84 return { IntPoint(minimumScrollPosition()), IntPoint(maximumScrollPosition()), IntSize(scrollableAreaSize()) }; 85 }, 86 [this](FloatPoint&& position) { 87 #if ENABLE(SMOOTH_SCROLLING) 88 if (m_smoothAnimation) 89 m_smoothAnimation->setCurrentPosition(position); 90 #endif 91 auto updateScope = createUpdateScope(); 92 scrollingNode().scrollTo(position); 93 }); 82 m_kineticAnimation = makeUnique<ScrollAnimationKinetic>(*this); 94 83 } 95 84 #endif … … 101 90 return; 102 91 103 m_smoothAnimation = makeUnique<ScrollAnimationSmooth>( 104 [this]() -> ScrollExtents { 105 return { IntPoint(minimumScrollPosition()), IntPoint(maximumScrollPosition()), IntSize(scrollableAreaSize()) }; 106 }, 107 currentScrollPosition(), 108 [this](FloatPoint&& position) { 109 auto updateScope = createUpdateScope(); 110 scrollingNode().scrollTo(position); 111 }, 112 [] { }); 92 m_smoothAnimation = makeUnique<ScrollAnimationSmooth>(*this); 113 93 } 114 94 #endif … … 126 106 m_kineticAnimation->stop(); 127 107 if (wheelEvent.isEndOfNonMomentumScroll()) { 128 m_kineticAnimation->start (currentScrollPosition(), m_kineticAnimation->computeVelocity(), canHaveHorizontalScrollbar, canHaveVerticalScrollbar);108 m_kineticAnimation->startAnimatedScrollWithInitialVelocity(currentScrollPosition(), m_kineticAnimation->computeVelocity(), canHaveHorizontalScrollbar, canHaveVerticalScrollbar); 129 109 m_kineticAnimation->clearScrollHistory(); 130 110 return WheelEventHandlingResult::handled(); 131 111 } 132 112 if (wheelEvent.isTransitioningToMomentumScroll()) { 133 m_kineticAnimation->start (currentScrollPosition(), wheelEvent.swipeVelocity(), canHaveHorizontalScrollbar, canHaveVerticalScrollbar);113 m_kineticAnimation->startAnimatedScrollWithInitialVelocity(currentScrollPosition(), wheelEvent.swipeVelocity(), canHaveHorizontalScrollbar, canHaveVerticalScrollbar); 134 114 m_kineticAnimation->clearScrollHistory(); 135 115 return WheelEventHandlingResult::handled(); … … 183 163 if (m_scrollAnimatorEnabled && !wheelEvent.hasPreciseScrollingDeltas()) { 184 164 ensureScrollAnimationSmooth(); 185 m_smoothAnimation->s croll(HorizontalScrollbar, ScrollByPixel, 1, deltaX);186 m_smoothAnimation->s croll(VerticalScrollbar, ScrollByPixel, 1, deltaY);165 m_smoothAnimation->startAnimatedScroll(HorizontalScrollbar, ScrollByPixel, currentScrollPosition(), 1, deltaX); 166 m_smoothAnimation->startAnimatedScroll(VerticalScrollbar, ScrollByPixel, currentScrollPosition(), 1, deltaY); 187 167 return WheelEventHandlingResult::handled(); 188 168 } … … 217 197 } 218 198 199 void ScrollingTreeScrollingNodeDelegateNicosia::scrollAnimationDidUpdate(ScrollAnimation& animation, const FloatPoint& position) 200 { 201 #if ENABLE(SMOOTH_SCROLLING) 202 if (&animation == m_kineticAnimation.get()) { 203 if (m_smoothAnimation) 204 m_smoothAnimation->stop(); 205 } 206 #endif 207 auto updateScope = createUpdateScope(); 208 scrollingNode().scrollTo(position); 209 } 210 211 void ScrollingTreeScrollingNodeDelegateNicosia::scrollAnimationDidEnd(ScrollAnimation&) 212 { 213 } 214 215 ScrollExtents ScrollingTreeScrollingNodeDelegateNicosia::scrollExtentsForAnimation(ScrollAnimation&) 216 { 217 return { 218 IntPoint(minimumScrollPosition()), 219 IntPoint(maximumScrollPosition()), 220 IntSize(scrollableAreaSize()) 221 }; 222 } 223 219 224 } // namespace WebCore 220 225 -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h
r274495 r282697 32 32 33 33 #include "NicosiaPlatformLayer.h" 34 #include "ScrollAnimation.h" 34 35 #include "ScrollingStateOverflowScrollingNode.h" 35 36 #include "ThreadedScrollingTree.h" … … 45 46 namespace WebCore { 46 47 47 class ScrollingTreeScrollingNodeDelegateNicosia : public ScrollingTreeScrollingNodeDelegate {48 class ScrollingTreeScrollingNodeDelegateNicosia : public ScrollingTreeScrollingNodeDelegate, public ScrollAnimationClient { 48 49 public: 49 50 explicit ScrollingTreeScrollingNodeDelegateNicosia(ScrollingTreeScrollingNode&, bool scrollAnimatorEnabled); … … 67 68 #endif 68 69 70 // ScrollAnimationClient 71 void scrollAnimationDidUpdate(ScrollAnimation&, const FloatPoint& currentPosition) final; 72 void scrollAnimationDidEnd(ScrollAnimation&) final; 73 ScrollExtents scrollExtentsForAnimation(ScrollAnimation&) final; 74 69 75 #if ENABLE(KINETIC_SCROLLING) 70 76 std::unique_ptr<ScrollAnimationKinetic> m_kineticAnimation; 71 77 #endif 72 78 #if ENABLE(SMOOTH_SCROLLING) 73 std::unique_ptr<ScrollAnimation > m_smoothAnimation;79 std::unique_ptr<ScrollAnimationSmooth> m_smoothAnimation; 74 80 #endif 75 81 }; -
trunk/Source/WebCore/platform/ScrollAnimation.h
r268522 r282697 1 1 /* 2 2 * Copyright (C) 2016 Igalia S.L. 3 * Copyright (C) 2021 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 24 25 */ 25 26 26 #ifndef ScrollAnimation_h 27 #define ScrollAnimation_h 27 #pragma once 28 28 29 29 #include "ScrollTypes.h" 30 #include <wtf/FastMalloc.h> 30 31 31 32 namespace WebCore { 32 33 33 34 class FloatPoint; 34 class ScrollableArea; 35 enum class ScrollClamping : bool; 35 class ScrollAnimation; 36 36 37 37 struct ScrollExtents { … … 41 41 }; 42 42 43 class ScrollAnimationClient { 44 public: 45 virtual ~ScrollAnimationClient() = default; 46 47 virtual void scrollAnimationDidUpdate(ScrollAnimation&, const FloatPoint& currentPosition) = 0; 48 virtual void scrollAnimationDidEnd(ScrollAnimation&) = 0; 49 virtual ScrollExtents scrollExtentsForAnimation(ScrollAnimation&) = 0; 50 }; 51 43 52 class ScrollAnimation { 44 53 WTF_MAKE_FAST_ALLOCATED; 45 54 public: 46 virtual ~ScrollAnimation() { }; 47 virtual bool scroll(ScrollbarOrientation, ScrollGranularity, float /* step */, float /* multiplier */) { return true; }; 48 virtual void scroll(const FloatPoint&) { }; 55 ScrollAnimation(ScrollAnimationClient& client) 56 : m_client(client) 57 { } 58 virtual ~ScrollAnimation() = default; 59 60 virtual bool retargetActiveAnimation(const FloatPoint& newDestination) = 0; 49 61 virtual void stop() = 0; 50 virtual void updateVisibleLengths() { }; 51 virtual void setCurrentPosition(const FloatPoint&) { }; 62 virtual bool isActive() const = 0; 63 virtual void updateScrollExtents() { }; 64 65 // FIXME: No-op. Need to use this instead of subclasses having timers. 52 66 virtual void serviceAnimation() { }; 53 virtual bool isActive() const = 0; 67 68 protected: 69 ScrollAnimationClient& m_client; 54 70 }; 55 71 56 72 } // namespace WebCore 57 58 #endif // ScrollAnimation_h -
trunk/Source/WebCore/platform/ScrollAnimationKinetic.cpp
r278253 r282697 1 1 /* 2 2 * Copyright (C) 2016 Igalia S.L. 3 * Copyright (C) 2021 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 113 114 } 114 115 115 ScrollAnimationKinetic::ScrollAnimationKinetic(ScrollExtentsCallback&& scrollExtentsFunction, NotifyPositionChangedCallback&& notifyPositionChangedFunction) 116 : m_scrollExtentsFunction(WTFMove(scrollExtentsFunction)) 117 , m_notifyPositionChangedFunction(WTFMove(notifyPositionChangedFunction)) 116 ScrollAnimationKinetic::ScrollAnimationKinetic(ScrollAnimationClient& client) 117 : ScrollAnimation(client) 118 118 , m_animationTimer(RunLoop::current(), this, &ScrollAnimationKinetic::animationTimerFired) 119 119 { … … 164 164 accumDelta += FloatPoint(scrollEvent.deltaX(), scrollEvent.deltaY()); 165 165 166 // FIXME: It's odd that computeVelocity() has the side effect of clearing history. 166 167 m_scrollHistory.clear(); 167 168 … … 169 170 } 170 171 171 void ScrollAnimationKinetic::start(const FloatPoint& initialPosition, const FloatPoint& velocity, bool mayHScroll, bool mayVScroll)172 bool ScrollAnimationKinetic::startAnimatedScrollWithInitialVelocity(const FloatPoint& initialPosition, const FloatPoint& velocity, bool mayHScroll, bool mayVScroll) 172 173 { 173 174 stop(); … … 177 178 m_horizontalData = std::nullopt; 178 179 m_verticalData = std::nullopt; 179 return ;180 return false; 180 181 } 181 182 182 183 auto delta = deltaToNextFrame(); 183 auto extents = m_ scrollExtentsFunction();184 auto extents = m_client.scrollExtentsForAnimation(*this); 184 185 185 186 auto accumulateVelocity = [&](double velocity, std::optional<PerAxisData> axisData) -> double { … … 215 216 m_startTime = MonotonicTime::now() - tickTime / 2.; 216 217 animationTimerFired(); 218 return true; 219 } 220 221 bool ScrollAnimationKinetic::retargetActiveAnimation(const FloatPoint&) 222 { 223 if (!isActive()) 224 return false; 225 226 // FIXME: Implement retargeting. 227 return false; 217 228 } 218 229 … … 234 245 double y = m_verticalData ? m_verticalData.value().position() : m_position.y(); 235 246 m_position = FloatPoint(x, y); 236 m_ notifyPositionChangedFunction(FloatPoint(m_position));247 m_client.scrollAnimationDidUpdate(*this, FloatPoint(m_position)); 237 248 } 238 249 -
trunk/Source/WebCore/platform/ScrollAnimationKinetic.h
r278340 r282697 1 1 /* 2 2 * Copyright (C) 2016 Igalia S.L. 3 * Copyright (C) 2021 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 58 59 59 60 public: 60 using ScrollExtentsCallback = WTF::Function<ScrollExtents(void)>;61 using NotifyPositionChangedCallback = WTF::Function<void(FloatPoint&&)>;61 ScrollAnimationKinetic(ScrollAnimationClient&); 62 virtual ~ScrollAnimationKinetic(); 62 63 63 ScrollAnimationKinetic(ScrollExtentsCallback&&, NotifyPositionChangedCallback&&); 64 virtual ~ScrollAnimationKinetic(); 64 bool startAnimatedScrollWithInitialVelocity(const FloatPoint& initialPosition, const FloatPoint& velocity, bool mayHScroll, bool mayVScroll); 65 66 bool retargetActiveAnimation(const FloatPoint& newDestination) final; 67 void stop() final; 68 bool isActive() const final; 65 69 66 70 void appendToScrollHistory(const PlatformWheelEvent&); 67 71 void clearScrollHistory(); 72 68 73 FloatPoint computeVelocity(); 69 70 void start(const FloatPoint& initialPosition, const FloatPoint& velocity, bool mayHScroll, bool mayVScroll);71 void stop() override;72 bool isActive() const override;73 74 74 75 private: 75 76 void animationTimerFired(); 76 77 Seconds deltaToNextFrame(); 77 78 ScrollExtentsCallback m_scrollExtentsFunction;79 NotifyPositionChangedCallback m_notifyPositionChangedFunction;80 78 81 79 std::optional<PerAxisData> m_horizontalData; -
trunk/Source/WebCore/platform/ScrollAnimationSmooth.cpp
r280515 r282697 1 1 /* 2 2 * Copyright (C) 2016 Igalia S.L. 3 * Copyright (C) 2015 Apple Inc. All rights reserved.3 * Copyright (C) 2015-2021 Apple Inc. All rights reserved. 4 4 * Copyright (c) 2011, Google Inc. All rights reserved. 5 5 * … … 43 43 static const double smoothFactorForProgrammaticScroll = 1; 44 44 45 ScrollAnimationSmooth::PerAxisData::PerAxisData(ScrollbarOrientation orientation, const FloatPoint& position, ScrollExtentsCallback& extentsCallback) 46 { 47 auto extents = extentsCallback(); 48 switch (orientation) { 49 case HorizontalScrollbar: 50 currentPosition = position.x(); 51 visibleLength = extents.visibleSize.width(); 52 break; 53 case VerticalScrollbar: 54 currentPosition = position.y(); 55 visibleLength = extents.visibleSize.height(); 56 break; 57 } 58 59 desiredPosition = currentPosition; 60 } 61 62 ScrollAnimationSmooth::ScrollAnimationSmooth(ScrollExtentsCallback&& scrollExtentsFunction, const FloatPoint& position, NotifyPositionChangedCallback&& notifyPositionChangedFunction, NotifyAnimationStoppedCallback&& notifyAnimationStoppedFunction) 63 : m_scrollExtentsFunction(WTFMove(scrollExtentsFunction)) 64 , m_notifyPositionChangedFunction(WTFMove(notifyPositionChangedFunction)) 65 , m_notifyAnimationStoppedFunction(WTFMove(notifyAnimationStoppedFunction)) 66 , m_horizontalData(HorizontalScrollbar, position, m_scrollExtentsFunction) 67 , m_verticalData(VerticalScrollbar, position, m_scrollExtentsFunction) 45 ScrollAnimationSmooth::ScrollAnimationSmooth(ScrollAnimationClient& client) 46 : ScrollAnimation(client) 68 47 , m_animationTimer(RunLoop::current(), this, &ScrollAnimationSmooth::animationTimerFired) 69 48 { … … 73 52 } 74 53 75 bool ScrollAnimationSmooth::scroll(ScrollbarOrientation orientation, ScrollGranularity granularity, float step, float multiplier) 54 ScrollAnimationSmooth::~ScrollAnimationSmooth() = default; 55 56 bool ScrollAnimationSmooth::startAnimatedScroll(ScrollbarOrientation orientation, ScrollGranularity granularity, const FloatPoint& fromPosition, float step, float multiplier) 76 57 { 77 58 float minScrollPosition; 78 59 float maxScrollPosition; 79 auto extents = m_scrollExtentsFunction(); 60 auto extents = m_client.scrollExtentsForAnimation(*this); 61 initializeAxesData(extents, fromPosition); 62 80 63 if (orientation == HorizontalScrollbar) { 81 64 minScrollPosition = extents.minimumScrollPosition.x(); … … 94 77 } 95 78 96 void ScrollAnimationSmooth::scroll(const FloatPoint& position) 97 { 98 ScrollGranularity granularity = ScrollByPage; 99 auto extents = m_scrollExtentsFunction(); 100 bool needToScroll = updatePerAxisData(m_horizontalData, granularity, position.x(), extents.minimumScrollPosition.x(), extents.maximumScrollPosition.x(), smoothFactorForProgrammaticScroll); 79 bool ScrollAnimationSmooth::startAnimatedScrollToDestination(const FloatPoint& fromPosition, const FloatPoint& destinationPosition) 80 { 81 auto extents = m_client.scrollExtentsForAnimation(*this); 82 initializeAxesData(extents, fromPosition); 83 84 return startOrRetargetAnimation(extents, destinationPosition); 85 } 86 87 bool ScrollAnimationSmooth::retargetActiveAnimation(const FloatPoint& newDestination) 88 { 89 if (!isActive()) 90 return false; 91 92 auto extents = m_client.scrollExtentsForAnimation(*this); 93 return startOrRetargetAnimation(extents, newDestination); 94 } 95 96 bool ScrollAnimationSmooth::startOrRetargetAnimation(const ScrollExtents& extents, const FloatPoint& destinationPosition) 97 { 98 auto granularity = ScrollByPage; 99 bool needToScroll = updatePerAxisData(m_horizontalData, granularity, destinationPosition.x(), extents.minimumScrollPosition.x(), extents.maximumScrollPosition.x(), smoothFactorForProgrammaticScroll); 101 100 needToScroll |= 102 updatePerAxisData(m_verticalData, granularity, position.y(), extents.minimumScrollPosition.y(), extents.maximumScrollPosition.y(), smoothFactorForProgrammaticScroll);101 updatePerAxisData(m_verticalData, granularity, destinationPosition.y(), extents.minimumScrollPosition.y(), extents.maximumScrollPosition.y(), smoothFactorForProgrammaticScroll); 103 102 if (needToScroll && !isActive()) { 104 m_startTime = m_ horizontalData.startTime;103 m_startTime = m_verticalData.startTime; 105 104 animationTimerFired(); 106 105 } 107 }; 106 return needToScroll; 107 } 108 108 109 109 void ScrollAnimationSmooth::stop() 110 110 { 111 111 m_animationTimer.stop(); 112 m_ notifyAnimationStoppedFunction();113 } 114 115 void ScrollAnimationSmooth::update VisibleLengths()116 { 117 auto extents = m_ scrollExtentsFunction();112 m_client.scrollAnimationDidEnd(*this); 113 } 114 115 void ScrollAnimationSmooth::updateScrollExtents() 116 { 117 auto extents = m_client.scrollExtentsForAnimation(*this); 118 118 m_horizontalData.visibleLength = extents.visibleSize.width(); 119 119 m_verticalData.visibleLength = extents.visibleSize.height(); 120 120 } 121 121 122 void ScrollAnimationSmooth::setCurrentPosition(const FloatPoint& position) 123 { 124 stop(); 125 m_horizontalData = PerAxisData(position.x(), m_horizontalData.visibleLength); 126 m_verticalData = PerAxisData(position.y(), m_verticalData.visibleLength); 127 } 128 129 ScrollAnimationSmooth::~ScrollAnimationSmooth() = default; 122 void ScrollAnimationSmooth::initializeAxesData(const ScrollExtents& extents, const FloatPoint& startPosition) 123 { 124 m_horizontalData = PerAxisData(startPosition.x(), extents.visibleSize.width()); 125 m_verticalData = PerAxisData(startPosition.y(), extents.visibleSize.height()); 126 } 130 127 131 128 static inline double curveAt(ScrollAnimationSmooth::Curve curve, double t) … … 249 246 } 250 247 251 static inline void getAnimationParametersForGranularity(ScrollGranularity granularity, Seconds& animation Time, Seconds& repeatMinimumSustainTime, Seconds& attackTime, Seconds& releaseTime, ScrollAnimationSmooth::Curve& coastTimeCurve, Seconds& maximumCoastTime)248 static inline void getAnimationParametersForGranularity(ScrollGranularity granularity, Seconds& animationDuration, Seconds& repeatMinimumSustainTime, Seconds& attackDuration, Seconds& releaseDuration, ScrollAnimationSmooth::Curve& coastTimeCurve, Seconds& maximumCoastTime) 252 249 { 253 250 switch (granularity) { 254 251 case ScrollByDocument: 255 animation Time= tickTime * 10;252 animationDuration = tickTime * 10; 256 253 repeatMinimumSustainTime = tickTime * 10; 257 attack Time= tickTime * 10;258 release Time= tickTime * 10;254 attackDuration = tickTime * 10; 255 releaseDuration = tickTime * 10; 259 256 coastTimeCurve = ScrollAnimationSmooth::Curve::Linear; 260 257 maximumCoastTime = 1_s; 261 258 break; 262 259 case ScrollByLine: 263 animation Time= tickTime * 10;260 animationDuration = tickTime * 10; 264 261 repeatMinimumSustainTime = tickTime * 7; 265 attack Time= tickTime * 3;266 release Time= tickTime * 3;262 attackDuration = tickTime * 3; 263 releaseDuration = tickTime * 3; 267 264 coastTimeCurve = ScrollAnimationSmooth::Curve::Linear; 268 265 maximumCoastTime = 1_s; 269 266 break; 270 267 case ScrollByPage: 271 animation Time= tickTime * 15;268 animationDuration = tickTime * 15; 272 269 repeatMinimumSustainTime = tickTime * 10; 273 attack Time= tickTime * 5;274 release Time= tickTime * 5;270 attackDuration = tickTime * 5; 271 releaseDuration = tickTime * 5; 275 272 coastTimeCurve = ScrollAnimationSmooth::Curve::Linear; 276 273 maximumCoastTime = 1_s; 277 274 break; 278 275 case ScrollByPixel: 279 animation Time= tickTime * 11;276 animationDuration = tickTime * 11; 280 277 repeatMinimumSustainTime = tickTime * 2; 281 attack Time= tickTime * 3;282 release Time= tickTime * 3;278 attackDuration = tickTime * 3; 279 releaseDuration = tickTime * 3; 283 280 coastTimeCurve = ScrollAnimationSmooth::Curve::Quadratic; 284 281 maximumCoastTime = 1250_ms; … … 300 297 return false; 301 298 302 Seconds animation Time, repeatMinimumSustainTime, attackTime, releaseTime, maximumCoastTime;299 Seconds animationDuration, repeatMinimumSustainTime, attackDuration, releaseDuration, maximumCoastTime; 303 300 Curve coastTimeCurve; 304 getAnimationParametersForGranularity(granularity, animation Time, repeatMinimumSustainTime, attackTime, releaseTime, coastTimeCurve, maximumCoastTime);305 306 animation Time*= smoothFactor;301 getAnimationParametersForGranularity(granularity, animationDuration, repeatMinimumSustainTime, attackDuration, releaseDuration, coastTimeCurve, maximumCoastTime); 302 303 animationDuration *= smoothFactor; 307 304 repeatMinimumSustainTime *= smoothFactor; 308 attack Time*= smoothFactor;309 release Time*= smoothFactor;305 attackDuration *= smoothFactor; 306 releaseDuration *= smoothFactor; 310 307 maximumCoastTime *= smoothFactor; 311 308 312 309 data.desiredPosition = newPosition; 313 310 if (!data.startTime) 314 data.attack Time = attackTime;315 data.animation Time = animationTime;316 data.release Time = releaseTime;311 data.attackDuration = attackDuration; 312 data.animationDuration = animationDuration; 313 data.releaseDuration = releaseDuration; 317 314 318 315 // Prioritize our way out of over constraint. 319 if (data.attack Time + data.releaseTime > data.animationTime) {320 if (data.release Time > data.animationTime)321 data.release Time = data.animationTime;322 data.attack Time = data.animationTime - data.releaseTime;316 if (data.attackDuration + data.releaseDuration > data.animationDuration) { 317 if (data.releaseDuration > data.animationDuration) 318 data.releaseDuration = data.animationDuration; 319 data.attackDuration = data.animationDuration - data.releaseDuration; 323 320 } 324 321 … … 334 331 double attackAreaLeft = 0; 335 332 Seconds deltaTime = data.lastAnimationTime - data.startTime; 336 Seconds attackTimeLeft = std::max(0_s, data.attack Time- deltaTime);337 Seconds timeLeft = data.animation Time- deltaTime;338 Seconds minTimeLeft = data.release Time + std::min(repeatMinimumSustainTime, data.animationTime - data.releaseTime- attackTimeLeft);333 Seconds attackTimeLeft = std::max(0_s, data.attackDuration - deltaTime); 334 Seconds timeLeft = data.animationDuration - deltaTime; 335 Seconds minTimeLeft = data.releaseDuration + std::min(repeatMinimumSustainTime, data.animationDuration - data.releaseDuration - attackTimeLeft); 339 336 if (timeLeft < minTimeLeft) { 340 data.animation Time= deltaTime + minTimeLeft;337 data.animationDuration = deltaTime + minTimeLeft; 341 338 timeLeft = minTimeLeft; 342 339 } 343 340 344 if (maximumCoastTime > (repeatMinimumSustainTime + release Time)) {341 if (maximumCoastTime > (repeatMinimumSustainTime + releaseDuration)) { 345 342 double targetMaxCoastVelocity = data.visibleLength * .25 * frameRate; 346 343 // This needs to be as minimal as possible while not being intrusive to page up/down. … … 355 352 356 353 if (Seconds additionalTime = std::max(0_s, coastMinTimeLeft - minTimeLeft)) { 357 Seconds additionalReleaseTime = std::min(additionalTime, additionalTime * (release Time / (releaseTime+ repeatMinimumSustainTime)));358 data.release Time = releaseTime+ additionalReleaseTime;359 data.animation Time= deltaTime + coastMinTimeLeft;354 Seconds additionalReleaseTime = std::min(additionalTime, additionalTime * (releaseDuration / (releaseDuration + repeatMinimumSustainTime))); 355 data.releaseDuration = releaseDuration + additionalReleaseTime; 356 data.animationDuration = deltaTime + coastMinTimeLeft; 360 357 timeLeft = coastMinTimeLeft; 361 358 } … … 363 360 } 364 361 365 Seconds releaseTimeLeft = std::min(timeLeft, data.release Time);362 Seconds releaseTimeLeft = std::min(timeLeft, data.releaseDuration); 366 363 Seconds sustainTimeLeft = std::max(0_s, timeLeft - releaseTimeLeft - attackTimeLeft); 367 364 if (attackTimeLeft) { 368 double attackSpot = deltaTime / data.attack Time;369 attackAreaLeft = attackArea(Curve::Cubic, attackSpot, 1) * data.attack Time.value();370 } 371 372 double releaseSpot = (data.release Time - releaseTimeLeft) / data.releaseTime;373 double releaseAreaLeft = releaseArea(Curve::Cubic, releaseSpot, 1) * data.release Time.value();365 double attackSpot = deltaTime / data.attackDuration; 366 attackAreaLeft = attackArea(Curve::Cubic, attackSpot, 1) * data.attackDuration.value(); 367 } 368 369 double releaseSpot = (data.releaseDuration - releaseTimeLeft) / data.releaseDuration; 370 double releaseAreaLeft = releaseArea(Curve::Cubic, releaseSpot, 1) * data.releaseDuration.value(); 374 371 375 372 data.desiredVelocity = remainingDelta / (attackAreaLeft + sustainTimeLeft.value() + releaseAreaLeft); … … 378 375 data.attackPosition = data.startPosition + data.desiredVelocity * attackAreaLeft; 379 376 else 380 data.attackPosition = data.releasePosition - (data.animation Time - data.releaseTime - data.attackTime).value() * data.desiredVelocity;377 data.attackPosition = data.releasePosition - (data.animationDuration - data.releaseDuration - data.attackDuration).value() * data.desiredVelocity; 381 378 382 379 if (sustainTimeLeft) { … … 402 399 double newPosition = data.currentPosition; 403 400 404 if (deltaTime > data.animation Time) {401 if (deltaTime > data.animationDuration) { 405 402 data = PerAxisData(data.desiredPosition, data.visibleLength); 406 403 return false; 407 404 } 408 if (deltaTime < data.attack Time)409 newPosition = attackCurve(Curve::Cubic, deltaTime.value(), data.attack Time.value(), data.startPosition, data.attackPosition);410 else if (deltaTime < (data.animation Time - data.releaseTime))411 newPosition = data.attackPosition + (deltaTime - data.attack Time).value() * data.desiredVelocity;405 if (deltaTime < data.attackDuration) 406 newPosition = attackCurve(Curve::Cubic, deltaTime.value(), data.attackDuration.value(), data.startPosition, data.attackPosition); 407 else if (deltaTime < (data.animationDuration - data.releaseDuration)) 408 newPosition = data.attackPosition + (deltaTime - data.attackDuration).value() * data.desiredVelocity; 412 409 else { 413 410 // release is based on targeting the exact final position. 414 Seconds releaseDeltaT = deltaTime - (data.animation Time - data.releaseTime);415 newPosition = releaseCurve(Curve::Cubic, releaseDeltaT.value(), data.release Time.value(), data.releasePosition, data.desiredPosition);411 Seconds releaseDeltaT = deltaTime - (data.animationDuration - data.releaseDuration); 412 newPosition = releaseCurve(Curve::Cubic, releaseDeltaT.value(), data.releaseDuration.value(), data.releasePosition, data.desiredPosition); 416 413 } 417 414 … … 438 435 if (continueAnimation) 439 436 startNextTimer(std::max(minimumTimerInterval, deltaToNextFrame)); 440 else 441 m_notifyAnimationStoppedFunction();442 443 m_notifyPositionChangedFunction(FloatPoint(m_horizontalData.currentPosition, m_verticalData.currentPosition));437 438 m_client.scrollAnimationDidUpdate(*this, { m_horizontalData.currentPosition, m_verticalData.currentPosition }); 439 if (!continueAnimation) 440 m_client.scrollAnimationDidEnd(*this); 444 441 } 445 442 -
trunk/Source/WebCore/platform/ScrollAnimationSmooth.h
r280515 r282697 1 1 /* 2 2 * Copyright (C) 2016 Igalia S.L. 3 * Copyright (C) 2021 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 33 34 34 35 class FloatPoint; 35 class ScrollableArea;36 36 enum class ScrollClamping : bool; 37 37 38 38 class ScrollAnimationSmooth final: public ScrollAnimation { 39 39 public: 40 using ScrollExtentsCallback = WTF::Function<ScrollExtents(void)>; 41 using NotifyPositionChangedCallback = WTF::Function<void(FloatPoint&&)>; 42 using NotifyAnimationStoppedCallback = WTF::Function<void(void)>; 43 44 ScrollAnimationSmooth(ScrollExtentsCallback&&, const FloatPoint& position, NotifyPositionChangedCallback&&, NotifyAnimationStoppedCallback&&); 40 ScrollAnimationSmooth(ScrollAnimationClient&); 45 41 virtual ~ScrollAnimationSmooth(); 46 42 … … 53 49 }; 54 50 51 bool startAnimatedScroll(ScrollbarOrientation, ScrollGranularity, const FloatPoint& fromPosition, float step, float multiplier); 52 bool startAnimatedScrollToDestination(const FloatPoint& fromPosition, const FloatPoint& destinationPosition); 53 54 bool retargetActiveAnimation(const FloatPoint& newDestination) final; 55 void stop() final; 56 void updateScrollExtents() final; 57 bool isActive() const final; 58 55 59 private: 56 bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier) override;57 void scroll(const FloatPoint&) override;58 void stop() override;59 void updateVisibleLengths() override;60 void setCurrentPosition(const FloatPoint&) override;61 bool isActive() const override;62 63 60 struct PerAxisData { 64 PerAxisData() = delete; 65 66 PerAxisData(ScrollbarOrientation, const FloatPoint& position, ScrollExtentsCallback&); 67 61 PerAxisData() = default; 68 62 PerAxisData(float position, int length) 69 63 : currentPosition(position) … … 83 77 double startVelocity { 0 }; 84 78 85 Seconds animation Time;79 Seconds animationDuration; 86 80 MonotonicTime lastAnimationTime; 87 81 88 82 double attackPosition { 0 }; 89 Seconds attack Time;83 Seconds attackDuration; 90 84 Curve attackCurve { Curve::Quadratic }; 91 85 92 86 double releasePosition { 0 }; 93 Seconds release Time;87 Seconds releaseDuration; 94 88 Curve releaseCurve { Curve::Quadratic }; 95 89 … … 97 91 }; 98 92 93 bool startOrRetargetAnimation(const ScrollExtents&, const FloatPoint& destination); 94 99 95 bool updatePerAxisData(PerAxisData&, ScrollGranularity, float newPosition, float minScrollPosition, float maxScrollPosition, double smoothFactor = 1); 100 96 bool animateScroll(PerAxisData&, MonotonicTime currentTime); 97 98 void initializeAxesData(const ScrollExtents&, const FloatPoint& startPosition); 101 99 102 100 void requestAnimationTimerFired(); … … 104 102 void animationTimerFired(); 105 103 106 ScrollExtentsCallback m_scrollExtentsFunction;107 NotifyPositionChangedCallback m_notifyPositionChangedFunction;108 NotifyAnimationStoppedCallback m_notifyAnimationStoppedFunction;109 110 104 PerAxisData m_horizontalData; 111 105 PerAxisData m_verticalData; 112 106 113 107 MonotonicTime m_startTime; 108 // FIXME: Should not have timer here, and instead use serviceAnimation(). 114 109 RunLoop::Timer<ScrollAnimationSmooth> m_animationTimer; 115 110 }; -
trunk/Source/WebCore/platform/ScrollAnimator.cpp
r282480 r282697 55 55 , m_scrollController(*this) 56 56 , m_scrollControllerAnimationTimer(*this, &ScrollAnimator::scrollControllerAnimationTimerFired) 57 , m_scrollAnimation(makeUnique<ScrollAnimationSmooth>( 58 [this]() -> ScrollExtents { 59 return { m_scrollableArea.minimumScrollPosition(), m_scrollableArea.maximumScrollPosition(), m_scrollableArea.visibleSize() }; 60 }, 61 m_currentPosition, 62 [this](FloatPoint&& position) { 63 FloatSize delta = position - m_currentPosition; 64 m_currentPosition = WTFMove(position); 65 notifyPositionChanged(delta); 66 updateActiveScrollSnapIndexForOffset(); 67 }, 68 [this] { 69 m_scrollableArea.setScrollBehaviorStatus(ScrollBehaviorStatus::NotInAnimation); 70 })) 57 , m_scrollAnimation(makeUnique<ScrollAnimationSmooth>(*this)) 71 58 , m_keyboardScrollingAnimator(makeUnique<KeyboardScrollingAnimator>(*this, m_scrollController)) 72 59 { … … 100 87 101 88 #if ENABLE(SMOOTH_SCROLLING) && !PLATFORM(IOS_FAMILY) 102 if (m_scrollableArea.scrollAnimatorEnabled() && !behavior.contains(ScrollBehavior::NeverAnimate)) { 103 if (!m_scrollAnimation->isActive()) 104 m_scrollAnimation->setCurrentPosition(m_currentPosition); 105 return m_scrollAnimation->scroll(orientation, granularity, step, multiplier); 106 } 89 if (m_scrollableArea.scrollAnimatorEnabled() && !behavior.contains(ScrollBehavior::NeverAnimate)) 90 return m_scrollAnimation->startAnimatedScroll(orientation, granularity, m_currentPosition, step, multiplier); 107 91 #endif 108 92 … … 125 109 return false; 126 110 127 m_scrollAnimation->s etCurrentPosition(adjustedPosition);111 m_scrollAnimation->stop(); 128 112 m_currentPosition = adjustedPosition; 129 113 notifyPositionChanged(adjustedPosition - currentPosition); … … 143 127 return false; 144 128 145 m_scrollAnimation->setCurrentPosition(m_currentPosition); 146 m_scrollAnimation->scroll(newPosition); 129 m_scrollAnimation->startAnimatedScrollToDestination(m_currentPosition, newPosition); 147 130 scrollableArea().setScrollBehaviorStatus(ScrollBehaviorStatus::InNonNativeAnimation); 148 131 return true; … … 153 136 ASSERT(scrollableArea().currentScrollBehaviorStatus() == ScrollBehaviorStatus::InNonNativeAnimation); 154 137 ASSERT(m_scrollAnimation->isActive()); 155 m_scrollAnimation-> scroll(newPosition);138 m_scrollAnimation->retargetActiveAnimation(newPosition); 156 139 } 157 140 … … 376 359 void ScrollAnimator::contentsResized() const 377 360 { 378 m_scrollAnimation->update VisibleLengths();361 m_scrollAnimation->updateScrollExtents(); 379 362 } 380 363 381 364 void ScrollAnimator::willEndLiveResize() 382 365 { 383 m_scrollAnimation->update VisibleLengths();366 m_scrollAnimation->updateScrollExtents(); 384 367 } 385 368 386 369 void ScrollAnimator::didAddVerticalScrollbar(Scrollbar*) 387 370 { 388 m_scrollAnimation->update VisibleLengths();371 m_scrollAnimation->updateScrollExtents(); 389 372 } 390 373 391 374 void ScrollAnimator::didAddHorizontalScrollbar(Scrollbar*) 392 375 { 393 m_scrollAnimation->update VisibleLengths();376 m_scrollAnimation->updateScrollExtents(); 394 377 } 395 378 … … 423 406 } 424 407 408 void ScrollAnimator::scrollAnimationDidUpdate(ScrollAnimation&, const FloatPoint& position) 409 { 410 FloatSize delta = position - m_currentPosition; 411 m_currentPosition = position; 412 notifyPositionChanged(delta); 413 updateActiveScrollSnapIndexForOffset(); 414 } 415 416 void ScrollAnimator::scrollAnimationDidEnd(ScrollAnimation&) 417 { 418 m_scrollableArea.setScrollBehaviorStatus(ScrollBehaviorStatus::NotInAnimation); 419 } 420 421 ScrollExtents ScrollAnimator::scrollExtentsForAnimation(ScrollAnimation&) 422 { 423 return { 424 m_scrollableArea.minimumScrollPosition(), 425 m_scrollableArea.maximumScrollPosition(), 426 m_scrollableArea.visibleSize() 427 }; 428 } 429 425 430 426 431 } // namespace WebCore -
trunk/Source/WebCore/platform/ScrollAnimator.h
r282480 r282697 34 34 #include "FloatPoint.h" 35 35 #include "PlatformWheelEvent.h" 36 #include "ScrollAnimation.h" 36 37 #include "ScrollingEffectsController.h" 37 38 #include "Timer.h" … … 45 46 class KeyboardScrollingAnimator; 46 47 class PlatformTouchEvent; 47 class ScrollAnimation ;48 class ScrollAnimationSmooth; 48 49 class ScrollableArea; 49 50 class Scrollbar; … … 52 53 class ScrollingEffectsControllerTimer; 53 54 54 class ScrollAnimator : private ScrollingEffectsControllerClient {55 class ScrollAnimator : private ScrollingEffectsControllerClient, public ScrollAnimationClient { 55 56 WTF_MAKE_FAST_ALLOCATED; 56 57 public: … … 134 135 virtual String verticalScrollbarStateForTesting() const { return emptyString(); } 135 136 137 // ScrollAnimationClient 138 void scrollAnimationDidUpdate(ScrollAnimation&, const FloatPoint& currentPosition) override; 139 void scrollAnimationDidEnd(ScrollAnimation&) override; 140 ScrollExtents scrollExtentsForAnimation(ScrollAnimation&) override; 141 136 142 void setWheelEventTestMonitor(RefPtr<WheelEventTestMonitor>&& testMonitor) { m_wheelEventTestMonitor = testMonitor; } 137 143 … … 180 186 FloatPoint m_currentPosition; 181 187 182 std::unique_ptr<ScrollAnimation > m_scrollAnimation;188 std::unique_ptr<ScrollAnimationSmooth> m_scrollAnimation; 183 189 std::unique_ptr<KeyboardScrollingAnimator> m_keyboardScrollingAnimator; 184 190 }; -
trunk/Source/WebCore/platform/generic/ScrollAnimatorGeneric.cpp
r277539 r282697 49 49 ScrollAnimatorGeneric::ScrollAnimatorGeneric(ScrollableArea& scrollableArea) 50 50 : ScrollAnimator(scrollableArea) 51 , m_kineticAnimation(makeUnique<ScrollAnimationKinetic>(*this)) 51 52 , m_overlayScrollbarAnimationTimer(*this, &ScrollAnimatorGeneric::overlayScrollbarAnimationTimerFired) 52 53 { 53 m_kineticAnimation = makeUnique<ScrollAnimationKinetic>(54 [this]() -> ScrollExtents {55 return { m_scrollableArea.minimumScrollPosition(), m_scrollableArea.maximumScrollPosition(), m_scrollableArea.visibleSize() };56 },57 [this](FloatPoint&& position) {58 m_scrollAnimation->setCurrentPosition(position);59 updatePosition(WTFMove(position));60 });61 54 } 62 55 … … 77 70 78 71 if (event.isEndOfNonMomentumScroll()) { 79 m_kineticAnimation->start (m_currentPosition, m_kineticAnimation->computeVelocity(), m_scrollableArea.horizontalScrollbar(), m_scrollableArea.verticalScrollbar());72 m_kineticAnimation->startAnimatedScrollWithInitialVelocity(m_currentPosition, m_kineticAnimation->computeVelocity(), m_scrollableArea.horizontalScrollbar(), m_scrollableArea.verticalScrollbar()); 80 73 return true; 81 74 } 82 75 if (event.isTransitioningToMomentumScroll()) { 83 76 m_kineticAnimation->clearScrollHistory(); 84 m_kineticAnimation->start (m_currentPosition, event.swipeVelocity(), m_scrollableArea.horizontalScrollbar(), m_scrollableArea.verticalScrollbar());77 m_kineticAnimation->startAnimatedScrollWithInitialVelocity(m_currentPosition, event.swipeVelocity(), m_scrollableArea.horizontalScrollbar(), m_scrollableArea.verticalScrollbar()); 85 78 return true; 86 79 } … … 90 83 } 91 84 92 void ScrollAnimatorGeneric::updatePosition( FloatPoint&& position)85 void ScrollAnimatorGeneric::updatePosition(const FloatPoint& position) 93 86 { 94 87 FloatSize delta = position - m_currentPosition; 95 m_currentPosition = WTFMove(position);88 m_currentPosition = position; 96 89 notifyPositionChanged(delta); 97 90 updateActiveScrollSnapIndexForOffset(); … … 289 282 } 290 283 284 // FIXME: Can we just use the base class implementation? 285 void ScrollAnimatorGeneric::scrollAnimationDidUpdate(ScrollAnimation& animation, const FloatPoint& position) 286 { 287 if (&animation == m_kineticAnimation.get()) { 288 // FIXME: Clarify how animations interact. There should never be more than one active at a time. 289 m_scrollAnimation->stop(); 290 updatePosition(position); 291 return; 292 } 293 294 ScrollAnimator::scrollAnimationDidUpdate(animation, position); 295 } 296 291 297 } // namespace WebCore 292 298 -
trunk/Source/WebCore/platform/generic/ScrollAnimatorGeneric.h
r276299 r282697 62 62 void lockOverlayScrollbarStateToHidden(bool) override; 63 63 64 void updatePosition(FloatPoint&&); 64 // ScrollAnimationClient 65 void scrollAnimationDidUpdate(ScrollAnimation&, const FloatPoint& currentPosition) override; 66 67 void updatePosition(const FloatPoint&); 65 68 66 69 void overlayScrollbarAnimationTimerFired();
Note:
See TracChangeset
for help on using the changeset viewer.