Index: Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp |
=================================================================== |
--- Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp (revision 92725) |
+++ Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp (working copy) |
@@ -176,12 +176,16 @@ |
void curveTestInner(ScrollAnimatorNone::Curve, double step, double time); |
void curveTest(ScrollAnimatorNone::Curve); |
+ void checkDesiredPosition(float expectedPosition); |
+ void checkSoftLanding(float expectedPosition); |
+ |
static double kTickTime; |
static double kAnimationTime; |
static double kStartTime; |
static double kEndTime; |
float m_currentPosition; |
MockScrollAnimatorNone m_mockScrollAnimatorNone; |
+ bool m_scrollingDown; |
ScrollAnimatorNone::PerAxisData* m_data; |
}; |
@@ -193,15 +197,21 @@ |
void ScrollAnimatorNoneTest::reset() |
{ |
m_data->reset(); |
+ m_scrollingDown = true; |
} |
bool ScrollAnimatorNoneTest::updateDataFromParameters(ScrollbarOrientation orientation, float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters* parameters) |
{ |
+ m_scrollingDown = (step * multiplier > 0); |
+ |
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); |
+ if (m_scrollingDown) |
+ EXPECT_LE(oldVelocity, m_data->m_currentVelocity); |
+ else |
+ EXPECT_GE(oldVelocity, m_data->m_currentVelocity); |
double deltaTime = m_data->m_lastAnimationTime - m_data->m_startTime; |
double timeLeft = m_data->m_animationTime - deltaTime; |
@@ -212,10 +222,17 @@ |
// 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); |
+ if (m_scrollingDown) |
+ EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity); |
+ else |
+ EXPECT_GE(oldDesiredVelocity * allowedVelocityDecreaseFactor, 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); |
+ double startPosition = m_scrollingDown ? std::max<double>(m_currentPosition, m_data->m_attackPosition) : std::min<double>(m_currentPosition, m_data->m_attackPosition); |
+ double expectedReleasePosition = startPosition + sustainTimeLeft * m_data->m_desiredVelocity; |
+ if (result) |
+ EXPECT_DOUBLE_EQ(expectedReleasePosition, m_data->m_releasePosition); |
+ else |
+ EXPECT_NEAR(expectedReleasePosition, m_data->m_releasePosition, 1); |
return result; |
} |
@@ -234,11 +251,16 @@ |
double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTimeLeft); |
double distanceLeft = m_data->m_desiredPosition - *m_data->m_currentPosition; |
- EXPECT_LE(0, m_data->m_currentVelocity); |
- EXPECT_LE(oldPosition, *m_data->m_currentPosition); |
- EXPECT_GE(m_data->m_desiredVelocity * 2, m_data->m_currentVelocity); |
+ if (m_scrollingDown) { |
+ EXPECT_LE(0, m_data->m_currentVelocity); |
+ EXPECT_LE(oldPosition, *m_data->m_currentPosition); |
+ } else { |
+ EXPECT_GE(0, m_data->m_currentVelocity); |
+ EXPECT_GE(oldPosition, *m_data->m_currentPosition); |
+ } |
+ EXPECT_GE(fabs(m_data->m_desiredVelocity) * 2, fabs(m_data->m_currentVelocity)); |
if (testEstimatedMaxVelocity) |
- EXPECT_GE((distanceLeft / sustainTimeLeft) * 1.2, m_data->m_currentVelocity); |
+ EXPECT_GE(fabs(distanceLeft / sustainTimeLeft) * 1.2, fabs(m_data->m_currentVelocity)); |
return result; |
} |
@@ -363,6 +385,17 @@ |
curveTestInner(curve, 0.25, 40); |
} |
+void ScrollAnimatorNoneTest::checkDesiredPosition(float expectedPosition) |
+{ |
+ EXPECT_EQ(expectedPosition, m_data->m_desiredPosition); |
+} |
+ |
+void ScrollAnimatorNoneTest::checkSoftLanding(float expectedPosition) |
+{ |
+ EXPECT_EQ(expectedPosition, m_currentPosition); |
+ EXPECT_LE(m_data->m_desiredVelocity / 2, m_data->m_currentVelocity); |
+} |
+ |
TEST_F(ScrollAnimatorNoneTest, CurveMathLinear) |
{ |
curveTest(ScrollAnimatorNone::Linear); |
@@ -385,7 +418,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollOnceLinear) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -395,7 +428,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuadratic) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -405,7 +438,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollLongQuadratic) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -415,7 +448,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticNoSustain) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -423,9 +456,19 @@ |
result = animateScroll(t); |
} |
+TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticSmoothed) |
+{ |
+ ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime); |
+ |
+ updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
+ bool result = true; |
+ for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime) |
+ result = animateScroll(t); |
+} |
+ |
TEST_F(ScrollAnimatorNoneTest, ScrollOnceCubic) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -435,7 +478,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollOnceShort) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -445,7 +488,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollTwiceQuadratic) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -476,7 +519,7 @@ |
TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadratic) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
bool result = true; |
@@ -495,9 +538,30 @@ |
result = result && animateScroll(t); |
} |
+TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadraticSmoothed) |
+{ |
+ ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ |
+ updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, ¶meters); |
+ bool result = true; |
+ double t; |
+ for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime) |
+ result = animateScroll(t); |
+ |
+ for (int i = 0; i < 20; ++i) { |
+ t += kAnimationTime; |
+ result = result && animateScroll(t); |
+ result = result && updateDataFromParameters(VerticalScrollbar, 3, 40, 10000, t, ¶meters); |
+ } |
+ |
+ t += kAnimationTime; |
+ for (; result && t < kEndTime; t += kAnimationTime) |
+ result = result && animateScroll(t); |
+} |
+ |
TEST_F(ScrollAnimatorNoneTest, ScrollWheelTrace) |
{ |
- ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, 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); |
@@ -519,9 +583,33 @@ |
result = result && animateScroll(t); |
} |
+TEST_F(ScrollAnimatorNoneTest, ScrollWheelTraceSmoothed) |
+{ |
+ ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * 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); |
+ ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, 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); |
@@ -549,4 +637,75 @@ |
result = result && animateScroll(t); |
} |
+TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTraceSmoothed) |
+{ |
+ ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * 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); |
+} |
+ |
+TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumper) |
+{ |
+ ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ |
+ updateDataFromParameters(VerticalScrollbar, 1, 20, 200, kStartTime, ¶meters); |
+ bool result = true; |
+ double t = kStartTime; |
+ for (int i = 0; i < 10; ++i) { |
+ t += kAnimationTime; |
+ result = result && animateScroll(t); |
+ updateDataFromParameters(VerticalScrollbar, 1, 20, 200, t, ¶meters); |
+ } |
+ checkDesiredPosition(200); |
+ |
+ t += kAnimationTime; |
+ for (; result && t < kEndTime; t += kAnimationTime) |
+ result = result && animateScroll(t); |
+ checkSoftLanding(200); |
+} |
+ |
+ |
+TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumper) |
+{ |
+ ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime); |
+ |
+ updateDataFromParameters(VerticalScrollbar, 1, -20, 200, kStartTime, ¶meters); |
+ bool result = true; |
+ double t = kStartTime; |
+ for (int i = 0; i < 10; ++i) { |
+ t += kAnimationTime; |
+ result = result && animateScroll(t); |
+ updateDataFromParameters(VerticalScrollbar, 1, -20, 200, t, ¶meters); |
+ } |
+ checkDesiredPosition(0); |
+ |
+ t += kAnimationTime; |
+ for (; result && t < kEndTime; t += kAnimationTime) |
+ result = result && animateScroll(t); |
+ checkSoftLanding(0); |
+} |
+ |
#endif // ENABLE(SMOOTH_SCROLLING) |