Title: [90303] trunk/Source
Revision
90303
Author
[email protected]
Date
2011-07-01 17:26:38 -0700 (Fri, 01 Jul 2011)

Log Message

2011-07-01  Scott Byer  <[email protected]>

        Reviewed by Adam Barth.

        Smooth scrolling fixes
        https://bugs.webkit.org/show_bug.cgi?id=63770

        Tests: Chromium webkit_unit_tests ScrollAnimatorNoneTest.ScrollWheelTrace and .LinuxTrackPadTrace

        Fix issues found in manual testing; distill the traces into unit tests. Fix the issues the tests exposed in the
        scroll animation code.

        * platform/ScrollAnimatorNone.cpp:
        (WebCore::ScrollAnimatorNone::PerAxisData::updateDataFromParameters):
        (WebCore::ScrollAnimatorNone::scroll):
2011-07-01  Scott Byer  <[email protected]>

        Reviewed by Adam Barth.

        Smooth scrolling fixes
        https://bugs.webkit.org/show_bug.cgi?id=63770

        Fix issues found in manual testing; distill the traces into unit tests. Fix the issues the tests exposed in the
        scroll animation code.

        * tests/ScrollAnimatorNoneTest.cpp:
        (ScrollAnimatorNoneTest::updateDataFromParameters):
        (TEST_F):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (90302 => 90303)


--- trunk/Source/WebCore/ChangeLog	2011-07-02 00:16:52 UTC (rev 90302)
+++ trunk/Source/WebCore/ChangeLog	2011-07-02 00:26:38 UTC (rev 90303)
@@ -1,3 +1,19 @@
+2011-07-01  Scott Byer  <[email protected]>
+
+        Reviewed by Adam Barth.
+
+        Smooth scrolling fixes
+        https://bugs.webkit.org/show_bug.cgi?id=63770
+
+        Tests: Chromium webkit_unit_tests ScrollAnimatorNoneTest.ScrollWheelTrace and .LinuxTrackPadTrace
+
+        Fix issues found in manual testing; distill the traces into unit tests. Fix the issues the tests exposed in the
+        scroll animation code.
+
+        * platform/ScrollAnimatorNone.cpp:
+        (WebCore::ScrollAnimatorNone::PerAxisData::updateDataFromParameters):
+        (WebCore::ScrollAnimatorNone::scroll):
+
 2011-07-01  Levi Weintraub  <[email protected]>
 
         Switch primary virtual layout functions to new layout types

Modified: trunk/Source/WebCore/platform/ScrollAnimatorNone.cpp (90302 => 90303)


--- trunk/Source/WebCore/platform/ScrollAnimatorNone.cpp	2011-07-02 00:16:52 UTC (rev 90302)
+++ trunk/Source/WebCore/platform/ScrollAnimatorNone.cpp	2011-07-02 00:26:38 UTC (rev 90303)
@@ -221,10 +221,10 @@
     if (attackAreaLeft)
         m_attackPosition = m_startPosition + m_desiredVelocity * attackAreaLeft;
     else
-        m_attackPosition = *m_currentPosition;
+        m_attackPosition = m_releasePosition - (m_animationTime - m_releaseTime - m_attackTime) * m_desiredVelocity;
 
     if (sustainTimeLeft) {
-        double roundOff = m_releasePosition - (m_attackPosition + m_desiredVelocity * sustainTimeLeft);
+        double roundOff = m_releasePosition - ((attackAreaLeft ? m_attackPosition : *m_currentPosition) + m_desiredVelocity * sustainTimeLeft);
         m_desiredVelocity += roundOff / sustainTimeLeft;
     }
 
@@ -289,14 +289,13 @@
     case ScrollByDocument:
         break;
     case ScrollByLine:
-        parameters = Parameters(true, 7 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
+        parameters = Parameters(true, 10 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
         break;
     case ScrollByPage:
         parameters = Parameters(true, 15 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime);
         break;
     case ScrollByPixel:
-        if (fabs(multiplier) > 20)
-            parameters = Parameters(true, 11 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
+        parameters = Parameters(true, 11 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
         break;
     default:
         break;

Modified: trunk/Source/WebKit/chromium/ChangeLog (90302 => 90303)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-07-02 00:16:52 UTC (rev 90302)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-07-02 00:26:38 UTC (rev 90303)
@@ -1,3 +1,17 @@
+2011-07-01  Scott Byer  <[email protected]>
+
+        Reviewed by Adam Barth.
+
+        Smooth scrolling fixes
+        https://bugs.webkit.org/show_bug.cgi?id=63770
+
+        Fix issues found in manual testing; distill the traces into unit tests. Fix the issues the tests exposed in the
+        scroll animation code.
+
+        * tests/ScrollAnimatorNoneTest.cpp:
+        (ScrollAnimatorNoneTest::updateDataFromParameters):
+        (TEST_F):
+
 2011-07-01  Hans Wennborg  <[email protected]>
 
         IndexedDB: make LevelDB the default back-end

Modified: trunk/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp (90302 => 90303)


--- trunk/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp	2011-07-02 00:16:52 UTC (rev 90302)
+++ trunk/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp	2011-07-02 00:26:38 UTC (rev 90303)
@@ -61,6 +61,7 @@
     MOCK_METHOD2(invalidateScrollbarRect, void(Scrollbar*, const IntRect&));
     MOCK_METHOD1(invalidateScrollCornerRect, void(const IntRect&));
     MOCK_METHOD1(setScrollOffsetFromAnimation, void(const IntPoint&));
+    MOCK_CONST_METHOD0(enclosingScrollableArea, ScrollableArea*());
 
     bool scrollAnimatorEnabled() const { return m_scrollAnimatorEnabled; }
     bool m_scrollAnimatorEnabled;
@@ -198,6 +199,7 @@
 {
     double oldVelocity = m_data->m_currentVelocity;
     double oldDesiredVelocity = m_data->m_desiredVelocity;
+    double oldTimeLeft = m_data->m_animationTime - (m_data->m_lastAnimationTime - m_data->m_startTime);
     bool result = m_data->updateDataFromParameters(orientation, step, multiplier, scrollableSize, currentTime, parameters);
     EXPECT_LE(oldVelocity, m_data->m_currentVelocity);
 
@@ -207,9 +209,12 @@
     double attackTimeLeft = std::max(0., m_data->m_attackTime - deltaTime);
     double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
 
-    EXPECT_LE(oldDesiredVelocity * 0.99, m_data->m_desiredVelocity);
+    // If we're getting near the finish, the desired velocity can decrease since the time left gets increased.
+    double allowedVelocityDecreaseFactor = 0.99 * oldTimeLeft / timeLeft;
+    allowedVelocityDecreaseFactor *= allowedVelocityDecreaseFactor;
+    EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
 
-    double expectedReleasePosition = m_data->m_attackPosition + sustainTimeLeft * m_data->m_desiredVelocity;
+    double expectedReleasePosition = std::max<double>(m_currentPosition, m_data->m_attackPosition) + sustainTimeLeft * m_data->m_desiredVelocity;
     EXPECT_DOUBLE_EQ(expectedReleasePosition, m_data->m_releasePosition);
 
     return result;
@@ -490,4 +495,58 @@
         result = result && animateScroll(t);
 }
 
+TEST_F(ScrollAnimatorNoneTest, ScrollWheelTrace)
+{
+    ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
+
+    // Constructed from an actual scroll wheel trace that exhibited a glitch.
+    bool result = updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.5781, &parameters);
+    result = animateScroll(100.5933);
+    result = result && animateScroll(100.6085);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.6485, &parameters);
+    result = result && animateScroll(100.6515);
+    result = result && animateScroll(100.6853);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.6863, &parameters);
+    result = result && animateScroll(100.7005);
+    result = result && animateScroll(100.7157);
+    result = result && animateScroll(100.7312);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.7379, &parameters);
+    result = result && animateScroll(100.7464);
+    result = result && animateScroll(100.7617);
+    result = result && animateScroll(100.7775);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.7779, &parameters);
+    for (double t = 100.7928; result && t < 200; t += 0.015)
+        result = result && animateScroll(t);
+}
+
+TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTrace)
+{
+    ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
+
+    bool result = updateDataFromParameters(VerticalScrollbar, 1.00, 60.00, 1000, 100.6863, &parameters);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.6897, &parameters);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7001, &parameters);
+    result = result && animateScroll(100.7015);
+    result = result && animateScroll(100.7169);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 40.00, 1000, 100.7179, &parameters);
+    result = result && animateScroll(100.7322);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7332, &parameters);
+    result = result && animateScroll(100.7491);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7519, &parameters);
+    result = result && animateScroll(100.7676);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7698, &parameters);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7830, &parameters);
+    result = result && animateScroll(100.7834);
+    result = result && animateScroll(100.7997);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8019, &parameters);
+    result = result && animateScroll(100.8154);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8241, &parameters);
+    result = result && animateScroll(100.8335);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8465, &parameters);
+    result = result && animateScroll(100.8513);
+    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8623, &parameters);
+    for (double t = 100.8674; result && t < 200; t += 0.015)
+        result = result && animateScroll(t);
+}
+
 #endif // ENABLE(SMOOTH_SCROLLING)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to