Title: [285161] trunk/Source/WebCore
Revision
285161
Author
cl...@igalia.com
Date
2021-11-02 08:59:13 -0700 (Tue, 02 Nov 2021)

Log Message

[GTK][WPE] Use the display refresh to drive scrolling animations (async scroll)
https://bugs.webkit.org/show_bug.cgi?id=232432

Reviewed by Simon Fraser.

Implement missing API in nicosia async scroll path to have scroll
animations driven by the display refresh instead of a 60Hz timer.

No new tests, covered by existing tests.

* page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp:
(WebCore::ScrollingCoordinatorNicosia::didCompleteRenderingUpdate):
(WebCore::ScrollingCoordinatorNicosia::hasNodeWithAnimatedScrollChanged):
* page/scrolling/nicosia/ScrollingCoordinatorNicosia.h:
* page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.cpp:
(WebCore::ScrollingTreeFrameScrollingNodeNicosia::serviceScrollAnimation):
* page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.h:
* page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.cpp:
(WebCore::ScrollingTreeOverflowScrollingNodeNicosia::serviceScrollAnimation):
* page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.h:
* page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp:
(WebCore::ScrollingTreeScrollingNodeDelegateNicosia::startAnimationCallback):
(WebCore::ScrollingTreeScrollingNodeDelegateNicosia::stopAnimationCallback):
(WebCore::ScrollingTreeScrollingNodeDelegateNicosia::serviceScrollAnimation):
(WebCore::ScrollingTreeScrollingNodeDelegateNicosia::animationTimerFired): Deleted.
* page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285160 => 285161)


--- trunk/Source/WebCore/ChangeLog	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/ChangeLog	2021-11-02 15:59:13 UTC (rev 285161)
@@ -1,3 +1,32 @@
+2021-11-02  Chris Lord  <cl...@igalia.com>
+
+        [GTK][WPE] Use the display refresh to drive scrolling animations (async scroll)
+        https://bugs.webkit.org/show_bug.cgi?id=232432
+
+        Reviewed by Simon Fraser.
+
+        Implement missing API in nicosia async scroll path to have scroll
+        animations driven by the display refresh instead of a 60Hz timer.
+
+        No new tests, covered by existing tests.
+
+        * page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp:
+        (WebCore::ScrollingCoordinatorNicosia::didCompleteRenderingUpdate):
+        (WebCore::ScrollingCoordinatorNicosia::hasNodeWithAnimatedScrollChanged):
+        * page/scrolling/nicosia/ScrollingCoordinatorNicosia.h:
+        * page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.cpp:
+        (WebCore::ScrollingTreeFrameScrollingNodeNicosia::serviceScrollAnimation):
+        * page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.h:
+        * page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.cpp:
+        (WebCore::ScrollingTreeOverflowScrollingNodeNicosia::serviceScrollAnimation):
+        * page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.h:
+        * page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp:
+        (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::startAnimationCallback):
+        (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::stopAnimationCallback):
+        (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::serviceScrollAnimation):
+        (WebCore::ScrollingTreeScrollingNodeDelegateNicosia::animationTimerFired): Deleted.
+        * page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h:
+
 2021-11-02  Alan Bujtas  <za...@apple.com>
 
         [LFC][IFC] Line should keep track of whether the content needs visual reordering

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp	2021-11-02 15:59:13 UTC (rev 285161)
@@ -102,6 +102,22 @@
     synchronizeStateFromScrollingTree();
 }
 
+void ScrollingCoordinatorNicosia::didCompleteRenderingUpdate()
+{
+    downcast<ThreadedScrollingTree>(scrollingTree())->didCompleteRenderingUpdate();
+
+    // Scroll animations are driven by the display refresh, so make sure that we
+    // keep firing until they're complete.
+    if (scrollingTree()->hasNodeWithActiveScrollAnimations())
+        scheduleRenderingUpdate();
+}
+
+void ScrollingCoordinatorNicosia::hasNodeWithAnimatedScrollChanged(bool hasAnimatingNode)
+{
+    if (hasAnimatingNode)
+        scheduleRenderingUpdate();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(ASYNC_SCROLLING) && USE(NICOSIA)

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.h (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.h	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.h	2021-11-02 15:59:13 UTC (rev 285161)
@@ -51,6 +51,9 @@
     void scheduleTreeStateCommit() override;
 
     void willStartRenderingUpdate() final;
+    void didCompleteRenderingUpdate() final;
+
+    void hasNodeWithAnimatedScrollChanged(bool) final;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.cpp (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.cpp	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.cpp	2021-11-02 15:59:13 UTC (rev 285161)
@@ -116,6 +116,11 @@
     m_delegate.stopAnimatedScroll();
 }
 
+void ScrollingTreeFrameScrollingNodeNicosia::serviceScrollAnimation()
+{
+    m_delegate.serviceScrollAnimation();
+}
+
 FloatPoint ScrollingTreeFrameScrollingNodeNicosia::adjustedScrollPosition(const FloatPoint& position, ScrollClamping clamping) const
 {
     FloatPoint scrollPosition(roundf(position.x()), roundf(position.y()));

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.h (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.h	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.h	2021-11-02 15:59:13 UTC (rev 285161)
@@ -57,6 +57,7 @@
 
     bool startAnimatedScrollToPosition(FloatPoint) override;
     void stopAnimatedScroll() override;
+    void serviceScrollAnimation() final;
 
     WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent&, EventTargeting) override;
     FloatPoint adjustedScrollPosition(const FloatPoint&, ScrollClamping) const override;

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.cpp (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.cpp	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.cpp	2021-11-02 15:59:13 UTC (rev 285161)
@@ -99,6 +99,11 @@
     m_delegate.stopAnimatedScroll();
 }
 
+void ScrollingTreeOverflowScrollingNodeNicosia::serviceScrollAnimation()
+{
+    m_delegate.serviceScrollAnimation();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(ASYNC_SCROLLING) && USE(NICOSIA)

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.h (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.h	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.h	2021-11-02 15:59:13 UTC (rev 285161)
@@ -52,6 +52,7 @@
 
     bool startAnimatedScrollToPosition(FloatPoint) override;
     void stopAnimatedScroll() override;
+    void serviceScrollAnimation() final;
 
     ScrollingTreeScrollingNodeDelegateNicosia m_delegate;
 };

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.cpp	2021-11-02 15:59:13 UTC (rev 285161)
@@ -97,38 +97,19 @@
 
 void ScrollingTreeScrollingNodeDelegateNicosia::startAnimationCallback(ScrollingEffectsController&)
 {
-    if (!m_animationTimer) {
-        m_animationTimer = makeUnique<RunLoop::Timer<ScrollingTreeScrollingNodeDelegateNicosia>>(RunLoop::current(), this, &ScrollingTreeScrollingNodeDelegateNicosia::animationTimerFired);
-
-#if USE(GLIB_EVENT_LOOP)
-        m_animationTimer->setPriority(RunLoopSourcePriority::DisplayRefreshMonitorTimer);
-#endif
-    }
-
-    if (m_animationTimer->isActive())
-        return;
-
-    static constexpr double frameRate = 60;
-    static constexpr Seconds tickTime = 1_s / frameRate;
-    m_animationTimer->startRepeating(tickTime);
+    scrollingNode().setScrollAnimationInProgress(true);
 }
 
 void ScrollingTreeScrollingNodeDelegateNicosia::stopAnimationCallback(ScrollingEffectsController&)
 {
-    if (m_animationTimer)
-        m_animationTimer->stop();
+    scrollingNode().setScrollAnimationInProgress(false);
 }
 
-void ScrollingTreeScrollingNodeDelegateNicosia::animationTimerFired()
+void ScrollingTreeScrollingNodeDelegateNicosia::serviceScrollAnimation()
 {
     m_scrollController.animationCallback(MonotonicTime::now());
 }
 
-void ScrollingTreeScrollingNodeDelegateNicosia::serviceScrollAnimation()
-{
-    // FIXME: Instead of using m_animationTimer, drive animations via ThreadedScrollingTree::serviceScrollAnimations().
-}
-
 bool ScrollingTreeScrollingNodeDelegateNicosia::allowsHorizontalScrolling() const
 {
     return ScrollingTreeScrollingNodeDelegate::allowsHorizontalScrolling();

Modified: trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h (285160 => 285161)


--- trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h	2021-11-02 15:56:29 UTC (rev 285160)
+++ trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeScrollingNodeDelegateNicosia.h	2021-11-02 15:59:13 UTC (rev 285161)
@@ -55,8 +55,6 @@
     void serviceScrollAnimation() final;
 
 private:
-    void animationTimerFired();
-
     // ScrollingEffectsControllerClient.
     std::unique_ptr<ScrollingEffectsControllerTimer> createTimer(Function<void()>&&) final;
 
@@ -83,7 +81,6 @@
     bool scrollAnimationEnabled() const final { return m_scrollAnimatorEnabled; }
 
     ScrollingEffectsController m_scrollController;
-    std::unique_ptr<RunLoop::Timer<ScrollingTreeScrollingNodeDelegateNicosia>> m_animationTimer;
 
     bool m_scrollAnimatorEnabled { false };
 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to