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/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, ¶meters);
+ result = animateScroll(100.5933);
+ result = result && animateScroll(100.6085);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.6485, ¶meters);
+ result = result && animateScroll(100.6515);
+ result = result && animateScroll(100.6853);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.6863, ¶meters);
+ 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, ¶meters);
+ 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, ¶meters);
+ 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, ¶meters);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.6897, ¶meters);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7001, ¶meters);
+ result = result && animateScroll(100.7015);
+ result = result && animateScroll(100.7169);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 40.00, 1000, 100.7179, ¶meters);
+ result = result && animateScroll(100.7322);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7332, ¶meters);
+ result = result && animateScroll(100.7491);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7519, ¶meters);
+ result = result && animateScroll(100.7676);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7698, ¶meters);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7830, ¶meters);
+ result = result && animateScroll(100.7834);
+ result = result && animateScroll(100.7997);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8019, ¶meters);
+ result = result && animateScroll(100.8154);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8241, ¶meters);
+ result = result && animateScroll(100.8335);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8465, ¶meters);
+ result = result && animateScroll(100.8513);
+ result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8623, ¶meters);
+ for (double t = 100.8674; result && t < 200; t += 0.015)
+ result = result && animateScroll(t);
+}
+
#endif // ENABLE(SMOOTH_SCROLLING)