Changeset 92002 in webkit


Ignore:
Timestamp:
Jul 29, 2011 12:11:49 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Scroll animation refinements.
https://bugs.webkit.org/show_bug.cgi?id=65154

Patch by Scott Byer <scottbyer@chromium.org> on 2011-07-29
Reviewed by Adam Barth.

Fix scroll animation bugs when scrolling to the ends of a document. Smooth over slow event repeat rates
better. Fix tests to allow for unit testing of scrolling up and not just down.

Source/WebCore:

Additional unit tests added to ScrollAnimatorNoneTest:
ScrollQuadraticSmoothed, ScrollLotsQuadraticSmoothed, ScrollDownToBumper, ScrollUpToBumper

  • platform/ScrollAnimatorNone.cpp:

(WebCore::ScrollAnimatorNone::Parameters::Parameters):
(WebCore::ScrollAnimatorNone::PerAxisData::updateDataFromParameters):
(WebCore::ScrollAnimatorNone::scroll):

  • platform/ScrollAnimatorNone.h:

Source/WebKit/chromium:

Additional unit tests added to ScrollAnimatorNoneTest:
ScrollQuadraticSmoothed, ScrollLotsQuadraticSmoothed, ScrollDownToBumper, ScrollUpToBumper

  • tests/ScrollAnimatorNoneTest.cpp:

(ScrollAnimatorNoneTest::reset):
(ScrollAnimatorNoneTest::updateDataFromParameters):
(ScrollAnimatorNoneTest::animateScroll):
(ScrollAnimatorNoneTest::checkDesiredPosition):
(ScrollAnimatorNoneTest::checkSoftLanding):

Location:
trunk/Source
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r92000 r92002  
     12011-07-29  Scott Byer  <scottbyer@chromium.org>
     2
     3        Scroll animation refinements.
     4        https://bugs.webkit.org/show_bug.cgi?id=65154
     5
     6        Reviewed by Adam Barth.
     7
     8        Fix scroll animation bugs when scrolling to the ends of a document. Smooth over slow event repeat rates
     9        better. Fix tests to allow for unit testing of scrolling up and not just down.
     10
     11        Additional unit tests added to ScrollAnimatorNoneTest:
     12        ScrollQuadraticSmoothed, ScrollLotsQuadraticSmoothed, ScrollDownToBumper, ScrollUpToBumper
     13
     14        * platform/ScrollAnimatorNone.cpp:
     15        (WebCore::ScrollAnimatorNone::Parameters::Parameters):
     16        (WebCore::ScrollAnimatorNone::PerAxisData::updateDataFromParameters):
     17        (WebCore::ScrollAnimatorNone::scroll):
     18        * platform/ScrollAnimatorNone.h:
     19
    1202011-07-29  Samuel White  <samuel_white@apple.com>
    221
  • trunk/Source/WebCore/platform/ScrollAnimatorNone.cpp

    r90303 r92002  
    4545#include <wtf/PassOwnPtr.h>
    4646
     47using namespace std;
     48
    4749namespace WebCore {
    4850
     
    6466}
    6567
    66 ScrollAnimatorNone::Parameters::Parameters(bool isEnabled, double animationTime, Curve attackCurve, double attackTime, Curve releaseCurve, double releaseTime)
     68ScrollAnimatorNone::Parameters::Parameters(bool isEnabled, double animationTime, double repeatMinimumSustainTime, Curve attackCurve, double attackTime, Curve releaseCurve, double releaseTime)
    6769    : m_isEnabled(isEnabled)
    6870    , m_animationTime(animationTime)
     71    , m_repeatMinimumSustainTime(repeatMinimumSustainTime)
    6972    , m_attackCurve(attackCurve)
    7073    , m_attackTime(attackTime)
     
    160163bool ScrollAnimatorNone::PerAxisData::updateDataFromParameters(ScrollbarOrientation orientation, float step, float multiplier, float scrollableSize, double currentTime, Parameters* parameters)
    161164{
    162     m_animationTime = parameters->m_animationTime;
     165    if (parameters->m_animationTime > m_animationTime)
     166        m_animationTime = parameters->m_animationTime;
    163167    m_attackTime = parameters->m_attackTime;
    164168    m_releaseTime = parameters->m_releaseTime;
     
    175179    m_orientation = orientation;
    176180
    177     if (!m_desiredPosition)
     181    if (!m_startTime)
    178182        m_desiredPosition = *m_currentPosition;
    179183    float newPosition = m_desiredPosition + (step * multiplier);
    180184
    181185    if (newPosition < 0 || newPosition > scrollableSize)
    182         newPosition = std::max(std::min(newPosition, scrollableSize), 0.0f);
     186        newPosition = max(min(newPosition, scrollableSize), 0.0f);
    183187
    184188    if (newPosition == m_desiredPosition)
     
    200204
    201205    double deltaTime = m_lastAnimationTime - m_startTime;
     206    double attackTimeLeft = max(0., m_attackTime - deltaTime);
    202207    double timeLeft = m_animationTime - deltaTime;
    203     if (timeLeft < m_releaseTime) {
    204         m_animationTime = deltaTime + m_releaseTime;
    205         timeLeft = m_releaseTime;
    206     }
    207     double releaseTimeLeft = std::min(timeLeft, m_releaseTime);
    208     double attackTimeLeft = std::max(0., m_attackTime - deltaTime);
    209     double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
     208    double minTimeLeft = m_releaseTime + min(parameters->m_repeatMinimumSustainTime, m_animationTime - m_releaseTime - attackTimeLeft);
     209    if (timeLeft < minTimeLeft) {
     210        m_animationTime = deltaTime + minTimeLeft;
     211        timeLeft = minTimeLeft;
     212    }
     213
     214    double releaseTimeLeft = min(timeLeft, m_releaseTime);
     215    double sustainTimeLeft = max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
    210216
    211217    if (attackTimeLeft) {
     
    290296        break;
    291297    case ScrollByLine:
    292         parameters = Parameters(true, 10 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
     298        parameters = Parameters(true, 10 * kTickTime, 7 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
    293299        break;
    294300    case ScrollByPage:
    295         parameters = Parameters(true, 15 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime);
     301        parameters = Parameters(true, 15 * kTickTime, 10 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime);
    296302        break;
    297303    case ScrollByPixel:
    298         parameters = Parameters(true, 11 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
     304        parameters = Parameters(true, 11 * kTickTime, 2 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
    299305        break;
    300306    default:
  • trunk/Source/WebCore/platform/ScrollAnimatorNone.h

    r89305 r92002  
    6060    struct Parameters {
    6161        Parameters();
    62         Parameters(bool, double, Curve, double, Curve, double);
     62        Parameters(bool isEnabled, double animationTime, double repeatMinimumSustainTime, Curve attackCurve, double attackTime, Curve releaseCurve, double releaseTime);
    6363
    6464        // Note that the times can be overspecified such that releaseTime or releaseTime and attackTime are greater
     
    6767        bool m_isEnabled;
    6868        double m_animationTime;
     69        double m_repeatMinimumSustainTime;
    6970
    7071        Curve m_attackCurve;
  • trunk/Source/WebKit/chromium/ChangeLog

    r91975 r92002  
     12011-07-29  Scott Byer  <scottbyer@chromium.org>
     2
     3        Scroll animation refinements.
     4        https://bugs.webkit.org/show_bug.cgi?id=65154
     5
     6        Reviewed by Adam Barth.
     7
     8        Fix scroll animation bugs when scrolling to the ends of a document. Smooth over slow event repeat rates
     9        better. Fix tests to allow for unit testing of scrolling up and not just down.
     10
     11        Additional unit tests added to ScrollAnimatorNoneTest:
     12        ScrollQuadraticSmoothed, ScrollLotsQuadraticSmoothed, ScrollDownToBumper, ScrollUpToBumper
     13       
     14        * tests/ScrollAnimatorNoneTest.cpp:
     15        (ScrollAnimatorNoneTest::reset):
     16        (ScrollAnimatorNoneTest::updateDataFromParameters):
     17        (ScrollAnimatorNoneTest::animateScroll):
     18        (ScrollAnimatorNoneTest::checkDesiredPosition):
     19        (ScrollAnimatorNoneTest::checkSoftLanding):
     20
    1212011-07-28  Naoki Takano  <honten@chromium.org>
    222
  • trunk/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp

    r90303 r92002  
    177177    void curveTest(ScrollAnimatorNone::Curve);
    178178
     179    void checkDesiredPosition(float expectedPosition);
     180    void checkSoftLanding(float expectedPosition);
     181
    179182    static double kTickTime;
    180183    static double kAnimationTime;
     
    183186    float m_currentPosition;
    184187    MockScrollAnimatorNone m_mockScrollAnimatorNone;
     188    bool m_scrollingDown;
    185189    ScrollAnimatorNone::PerAxisData* m_data;
    186190};
     
    194198{
    195199    m_data->reset();
     200    m_scrollingDown = true;
    196201}
    197202
    198203bool ScrollAnimatorNoneTest::updateDataFromParameters(ScrollbarOrientation orientation, float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters* parameters)
    199204{
     205    m_scrollingDown = (step * multiplier > 0);
     206
    200207    double oldVelocity = m_data->m_currentVelocity;
    201208    double oldDesiredVelocity = m_data->m_desiredVelocity;
    202209    double oldTimeLeft = m_data->m_animationTime - (m_data->m_lastAnimationTime - m_data->m_startTime);
    203210    bool result = m_data->updateDataFromParameters(orientation, step, multiplier, scrollableSize, currentTime, parameters);
    204     EXPECT_LE(oldVelocity, m_data->m_currentVelocity);
     211    if (m_scrollingDown)
     212        EXPECT_LE(oldVelocity, m_data->m_currentVelocity);
     213    else
     214        EXPECT_GE(oldVelocity, m_data->m_currentVelocity);
    205215
    206216    double deltaTime = m_data->m_lastAnimationTime - m_data->m_startTime;
     
    213223    double allowedVelocityDecreaseFactor = 0.99 * oldTimeLeft / timeLeft;
    214224    allowedVelocityDecreaseFactor *= allowedVelocityDecreaseFactor;
    215     EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
    216 
    217     double expectedReleasePosition = std::max<double>(m_currentPosition, m_data->m_attackPosition) + sustainTimeLeft * m_data->m_desiredVelocity;
    218     EXPECT_DOUBLE_EQ(expectedReleasePosition, m_data->m_releasePosition);
     225    if (m_scrollingDown)
     226        EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
     227    else
     228        EXPECT_GE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
     229
     230    double startPosition = m_scrollingDown ? std::max<double>(m_currentPosition, m_data->m_attackPosition) : std::min<double>(m_currentPosition, m_data->m_attackPosition);
     231    double expectedReleasePosition = startPosition + sustainTimeLeft * m_data->m_desiredVelocity;
     232    if (result)
     233        EXPECT_DOUBLE_EQ(expectedReleasePosition, m_data->m_releasePosition);
     234    else
     235        EXPECT_NEAR(expectedReleasePosition, m_data->m_releasePosition, 1);
    219236
    220237    return result;
     
    235252    double distanceLeft = m_data->m_desiredPosition - *m_data->m_currentPosition;
    236253
    237     EXPECT_LE(0, m_data->m_currentVelocity);
    238     EXPECT_LE(oldPosition, *m_data->m_currentPosition);
    239     EXPECT_GE(m_data->m_desiredVelocity * 2, m_data->m_currentVelocity);
     254    if (m_scrollingDown) {
     255        EXPECT_LE(0, m_data->m_currentVelocity);
     256        EXPECT_LE(oldPosition, *m_data->m_currentPosition);
     257    } else {
     258        EXPECT_GE(0, m_data->m_currentVelocity);
     259        EXPECT_GE(oldPosition, *m_data->m_currentPosition);
     260    }
     261    EXPECT_GE(fabs(m_data->m_desiredVelocity) * 2, fabs(m_data->m_currentVelocity));
    240262    if (testEstimatedMaxVelocity)
    241         EXPECT_GE((distanceLeft / sustainTimeLeft) * 1.2, m_data->m_currentVelocity);
     263        EXPECT_GE(fabs(distanceLeft / sustainTimeLeft) * 1.2, fabs(m_data->m_currentVelocity));
    242264
    243265    return result;
     
    364386}
    365387
     388void ScrollAnimatorNoneTest::checkDesiredPosition(float expectedPosition)
     389{
     390    EXPECT_EQ(expectedPosition, m_data->m_desiredPosition);
     391}
     392
     393void ScrollAnimatorNoneTest::checkSoftLanding(float expectedPosition)
     394{
     395    EXPECT_EQ(expectedPosition, m_currentPosition);
     396    EXPECT_LE(m_data->m_desiredVelocity / 2, m_data->m_currentVelocity);
     397}
     398
    366399TEST_F(ScrollAnimatorNoneTest, CurveMathLinear)
    367400{
     
    386419TEST_F(ScrollAnimatorNoneTest, ScrollOnceLinear)
    387420{
    388     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime);
     421    ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime);
    389422
    390423    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    396429TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuadratic)
    397430{
    398     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     431    ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
    399432
    400433    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    406439TEST_F(ScrollAnimatorNoneTest, ScrollLongQuadratic)
    407440{
    408     ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     441    ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
    409442
    410443    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    416449TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticNoSustain)
    417450{
    418     ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime);
     451    ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime);
    419452
    420453    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    424457}
    425458
     459TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticSmoothed)
     460{
     461    ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime);
     462
     463    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     464    bool result = true;
     465    for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
     466        result = animateScroll(t);
     467}
     468
    426469TEST_F(ScrollAnimatorNoneTest, ScrollOnceCubic)
    427470{
    428     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime);
     471    ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime);
    429472
    430473    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    436479TEST_F(ScrollAnimatorNoneTest, ScrollOnceShort)
    437480{
    438     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime);
     481    ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime);
    439482
    440483    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    446489TEST_F(ScrollAnimatorNoneTest, ScrollTwiceQuadratic)
    447490{
    448     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     491    ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
    449492
    450493    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    477520TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadratic)
    478521{
    479     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     522    ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
    480523
    481524    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     
    496539}
    497540
     541TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadraticSmoothed)
     542{
     543    ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     544
     545    updateDataFromParameters(VerticalScrollbar, 1, 40, 1000, kStartTime, &parameters);
     546    bool result = true;
     547    double t;
     548    for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
     549        result = animateScroll(t);
     550
     551    for (int i = 0; i < 20; ++i) {
     552        t += kAnimationTime;
     553        result = result && animateScroll(t);
     554        result = result && updateDataFromParameters(VerticalScrollbar, 3, 40, 10000, t, &parameters);
     555    }
     556
     557    t += kAnimationTime;
     558    for (; result && t < kEndTime; t += kAnimationTime)
     559        result = result && animateScroll(t);
     560}
     561
    498562TEST_F(ScrollAnimatorNoneTest, ScrollWheelTrace)
    499563{
    500     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     564    ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
    501565
    502566    // Constructed from an actual scroll wheel trace that exhibited a glitch.
     
    520584}
    521585
     586TEST_F(ScrollAnimatorNoneTest, ScrollWheelTraceSmoothed)
     587{
     588    ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     589
     590    // Constructed from an actual scroll wheel trace that exhibited a glitch.
     591    bool result = updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.5781, &parameters);
     592    result = animateScroll(100.5933);
     593    result = result && animateScroll(100.6085);
     594    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.6485, &parameters);
     595    result = result && animateScroll(100.6515);
     596    result = result && animateScroll(100.6853);
     597    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.6863, &parameters);
     598    result = result && animateScroll(100.7005);
     599    result = result && animateScroll(100.7157);
     600    result = result && animateScroll(100.7312);
     601    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.7379, &parameters);
     602    result = result && animateScroll(100.7464);
     603    result = result && animateScroll(100.7617);
     604    result = result && animateScroll(100.7775);
     605    result = result && updateDataFromParameters(VerticalScrollbar, 1, 53.33, 1000, 100.7779, &parameters);
     606    for (double t = 100.7928; result && t < 200; t += 0.015)
     607        result = result && animateScroll(t);
     608}
     609
    522610TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTrace)
    523611{
    524     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     612    ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
    525613
    526614    bool result = updateDataFromParameters(VerticalScrollbar, 1.00, 60.00, 1000, 100.6863, &parameters);
     
    550638}
    551639
     640TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTraceSmoothed)
     641{
     642    ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     643
     644    bool result = updateDataFromParameters(VerticalScrollbar, 1.00, 60.00, 1000, 100.6863, &parameters);
     645    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.6897, &parameters);
     646    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7001, &parameters);
     647    result = result && animateScroll(100.7015);
     648    result = result && animateScroll(100.7169);
     649    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 40.00, 1000, 100.7179, &parameters);
     650    result = result && animateScroll(100.7322);
     651    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7332, &parameters);
     652    result = result && animateScroll(100.7491);
     653    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7519, &parameters);
     654    result = result && animateScroll(100.7676);
     655    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7698, &parameters);
     656    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.7830, &parameters);
     657    result = result && animateScroll(100.7834);
     658    result = result && animateScroll(100.7997);
     659    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8019, &parameters);
     660    result = result && animateScroll(100.8154);
     661    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8241, &parameters);
     662    result = result && animateScroll(100.8335);
     663    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8465, &parameters);
     664    result = result && animateScroll(100.8513);
     665    result = result && updateDataFromParameters(VerticalScrollbar, 1.00, 20.00, 1000, 100.8623, &parameters);
     666    for (double t = 100.8674; result && t < 200; t += 0.015)
     667        result = result && animateScroll(t);
     668}
     669
     670TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumper)
     671{
     672    ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     673
     674    updateDataFromParameters(VerticalScrollbar, 1, 20, 200, kStartTime, &parameters);
     675    bool result = true;
     676    double t = kStartTime;
     677    for (int i = 0; i < 10; ++i) {
     678        t += kAnimationTime;
     679        result = result && animateScroll(t);
     680        updateDataFromParameters(VerticalScrollbar, 1, 20, 200, t, &parameters);
     681    }
     682    checkDesiredPosition(200);
     683
     684    t += kAnimationTime;
     685    for (; result && t < kEndTime; t += kAnimationTime)
     686        result = result && animateScroll(t);
     687    checkSoftLanding(200);
     688}
     689
     690
     691TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumper)
     692{
     693    ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime);
     694
     695    updateDataFromParameters(VerticalScrollbar, 1, -20, 200, kStartTime, &parameters);
     696    bool result = true;
     697    double t = kStartTime;
     698    for (int i = 0; i < 10; ++i) {
     699        t += kAnimationTime;
     700        result = result && animateScroll(t);
     701        updateDataFromParameters(VerticalScrollbar, 1, -20, 200, t, &parameters);
     702    }
     703    checkDesiredPosition(0);
     704
     705    t += kAnimationTime;
     706    for (; result && t < kEndTime; t += kAnimationTime)
     707        result = result && animateScroll(t);
     708    checkSoftLanding(0);
     709}
     710
    552711#endif // ENABLE(SMOOTH_SCROLLING)
Note: See TracChangeset for help on using the changeset viewer.