Changeset 109151 in webkit


Ignore:
Timestamp:
Feb 28, 2012 2:26:24 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Slow content causes choppy scrolling
https://bugs.webkit.org/show_bug.cgi?id=79403

Patch by Dave Moore <davemoore@chromium.org> on 2012-02-28
Reviewed by James Robinson.

This code helps make scrolling (via wheel or pad) less choppy
when the content takes a long time to respond to the fake mouse moves
generated during scrolls.

  • page/EventHandler.cpp:

(WebCore):
(MaximumDurationTracker):
(WebCore::MaximumDurationTracker::MaximumDurationTracker):
(WebCore::MaximumDurationTracker::~MaximumDurationTracker):
(WebCore::EventHandler::EventHandler):
(WebCore::EventHandler::clear):
(WebCore::EventHandler::mouseMoved):
(WebCore::EventHandler::dispatchFakeMouseMoveEventSoon):
(WebCore::EventHandler::dispatchFakeMouseMoveEventSoonInQuad):

  • page/EventHandler.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r109149 r109151  
     12012-02-28  Dave Moore  <davemoore@chromium.org>
     2
     3        Slow content causes choppy scrolling
     4        https://bugs.webkit.org/show_bug.cgi?id=79403
     5
     6        Reviewed by James Robinson.
     7
     8        This code helps make scrolling (via wheel or pad) less choppy
     9        when the content takes a long time to respond to the fake mouse moves
     10        generated during scrolls.
     11
     12
     13 * page/EventHandler.cpp:
     14        (WebCore):
     15        (MaximumDurationTracker):
     16        (WebCore::MaximumDurationTracker::MaximumDurationTracker):
     17        (WebCore::MaximumDurationTracker::~MaximumDurationTracker):
     18        (WebCore::EventHandler::EventHandler):
     19        (WebCore::EventHandler::clear):
     20        (WebCore::EventHandler::mouseMoved):
     21        (WebCore::EventHandler::dispatchFakeMouseMoveEventSoon):
     22        (WebCore::EventHandler::dispatchFakeMouseMoveEventSoonInQuad):
     23        * page/EventHandler.h:
     24
    1252012-02-28  Andreas Kling  <awesomekling@apple.com>
    226
  • trunk/Source/WebCore/page/EventHandler.cpp

    r108793 r109151  
    127127const double autoscrollInterval = 0.05;
    128128
    129 const double fakeMouseMoveInterval = 0.1;
     129// The amount of time to wait before sending a fake mouse event, triggered
     130// during a scroll. The short interval is used if the content responds to the mouse events quickly enough,
     131// otherwise the long interval is used.
     132const double fakeMouseMoveShortInterval = 0.1;
     133const double fakeMouseMoveLongInterval = 0.250;
    130134
    131135enum NoCursorChangeType { NoCursorChange };
     
    142146    bool m_isCursorChange;
    143147    Cursor m_cursor;
     148};
     149
     150class MaximumDurationTracker {
     151public:
     152    explicit MaximumDurationTracker(double *maxDuration)
     153        : m_maxDuration(maxDuration)
     154        , m_start(monotonicallyIncreasingTime())
     155    {
     156    }
     157
     158    ~MaximumDurationTracker()
     159    {
     160        *m_maxDuration = max(*m_maxDuration, monotonicallyIncreasingTime() - m_start);
     161    }
     162
     163private:
     164    double* m_maxDuration;
     165    double m_start;
    144166};
    145167
     
    290312    , m_touchPressed(false)
    291313#endif
     314    , m_maxMouseMovedDuration(0)
    292315{
    293316}
     
    336359    m_originatingTouchPointTargets.clear();
    337360#endif
     361    m_maxMouseMovedDuration = 0;
    338362}
    339363
     
    16361660bool EventHandler::mouseMoved(const PlatformMouseEvent& event)
    16371661{
     1662    MaximumDurationTracker maxDurationTracker(&m_maxMouseMovedDuration);
    16381663    RefPtr<FrameView> protector(m_frame->view());
     1664
    16391665
    16401666#if ENABLE(TOUCH_EVENTS)
     
    25002526        return;
    25012527
    2502     if (!m_fakeMouseMoveEventTimer.isActive())
    2503         m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveInterval);
     2528    // If the content has ever taken longer than fakeMouseMoveShortInterval we
     2529    // reschedule the timer and use a longer time. This will cause the content
     2530    // to receive these moves only after the user is done scrolling, reducing
     2531    // pauses during the scroll.
     2532    if (m_maxMouseMovedDuration > fakeMouseMoveShortInterval) {
     2533        if (m_fakeMouseMoveEventTimer.isActive())
     2534            m_fakeMouseMoveEventTimer.stop();
     2535        m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveLongInterval);
     2536    } else {
     2537        if (!m_fakeMouseMoveEventTimer.isActive())
     2538            m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveShortInterval);
     2539    }
    25042540}
    25052541
     
    25102546        return;
    25112547
    2512     if (m_mousePressed || !quad.containsPoint(view->windowToContents(m_currentMousePosition)))
     2548    if (!quad.containsPoint(view->windowToContents(m_currentMousePosition)))
    25132549        return;
    25142550
    2515     if (!m_fakeMouseMoveEventTimer.isActive())
    2516         m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveInterval);
     2551    dispatchFakeMouseMoveEventSoon();
    25172552}
    25182553
  • trunk/Source/WebCore/page/EventHandler.h

    r108793 r109151  
    432432    bool m_touchPressed;
    433433#endif
     434    double m_maxMouseMovedDuration;
    434435};
    435436
Note: See TracChangeset for help on using the changeset viewer.