[GTK] Back/Forward gesture interferes with scrolling
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 25 Apr 2019 16:59:04 +0000 (16:59 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 25 Apr 2019 16:59:04 +0000 (16:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=197168

Patch by Alexander Mikhaylenko <exalm7659@gmail.com> on 2019-04-25
Reviewed by Michael Catanzaro.

When the gesture is released with 0 velocity close to an edge of the webview,
the finishing animation is way too long, and in some cases it can look like the
gesture is already over, when it's still animating. By scrolling vertically while
that happens, it's possible to reset animation over and over again.

To reduce the duration in this case, instead of using maximum possible duration
(400ms), introduce a base velocity and use it for calculating the duration if
the actual velocity, relative to the end point, is equal to or less than 0.

* UIProcess/gtk/ViewGestureControllerGtk.cpp:
(WebKit::ViewGestureController::SwipeProgressTracker::startAnimation):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244649 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/gtk/ViewGestureControllerGtk.cpp

index 71a8022..bfe4309 100644 (file)
@@ -1,5 +1,24 @@
 2019-04-25  Alexander Mikhaylenko  <exalm7659@gmail.com>
 
+        [GTK] Back/Forward gesture interferes with scrolling
+        https://bugs.webkit.org/show_bug.cgi?id=197168
+
+        Reviewed by Michael Catanzaro.
+
+        When the gesture is released with 0 velocity close to an edge of the webview,
+        the finishing animation is way too long, and in some cases it can look like the
+        gesture is already over, when it's still animating. By scrolling vertically while
+        that happens, it's possible to reset animation over and over again.
+
+        To reduce the duration in this case, instead of using maximum possible duration
+        (400ms), introduce a base velocity and use it for calculating the duration if
+        the actual velocity, relative to the end point, is equal to or less than 0.
+
+        * UIProcess/gtk/ViewGestureControllerGtk.cpp:
+        (WebKit::ViewGestureController::SwipeProgressTracker::startAnimation):
+
+2019-04-25  Alexander Mikhaylenko  <exalm7659@gmail.com>
+
         [GTK] Back/forward gesture snapshot always times out
         https://bugs.webkit.org/show_bug.cgi?id=197233
 
index 484fbe5..6584c34 100644 (file)
@@ -34,6 +34,7 @@ using namespace WebCore;
 
 static const Seconds swipeMinAnimationDuration = 100_ms;
 static const Seconds swipeMaxAnimationDuration = 400_ms;
+static const double swipeAnimationBaseVelocity = 0.002;
 
 // This is derivative of the easing function at t=0
 static const double swipeAnimationDurationMultiplier = 3;
@@ -213,11 +214,12 @@ void ViewGestureController::SwipeProgressTracker::startAnimation()
     else
         m_endProgress = m_viewGestureController.isPhysicallySwipingLeft(m_direction) ? 1 : -1;
 
-    Seconds duration = swipeMaxAnimationDuration;
-    if ((m_endProgress - m_progress) * m_velocity > 0) {
-        duration = Seconds::fromMilliseconds(std::abs((m_progress - m_endProgress) / m_velocity * swipeAnimationDurationMultiplier));
-        duration = clampTo<WTF::Seconds>(duration, swipeMinAnimationDuration, swipeMaxAnimationDuration);
-    }
+    double velocity = swipeAnimationBaseVelocity;
+    if ((m_endProgress - m_progress) * m_velocity > 0)
+        velocity = m_velocity;
+
+    Seconds duration = Seconds::fromMilliseconds(std::abs((m_progress - m_endProgress) / velocity * swipeAnimationDurationMultiplier));
+    duration = clampTo<Seconds>(duration, swipeMinAnimationDuration, swipeMaxAnimationDuration);
 
     GtkWidget* widget = m_webPageProxy.viewWidget();
     m_startTime = Seconds::fromMicroseconds(gdk_frame_clock_get_frame_time(gtk_widget_get_frame_clock(widget)));