Changeset 109151 in webkit
- Timestamp:
- Feb 28, 2012 2:26:24 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r109149 r109151 1 2012-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 1 25 2012-02-28 Andreas Kling <awesomekling@apple.com> 2 26 -
trunk/Source/WebCore/page/EventHandler.cpp
r108793 r109151 127 127 const double autoscrollInterval = 0.05; 128 128 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. 132 const double fakeMouseMoveShortInterval = 0.1; 133 const double fakeMouseMoveLongInterval = 0.250; 130 134 131 135 enum NoCursorChangeType { NoCursorChange }; … … 142 146 bool m_isCursorChange; 143 147 Cursor m_cursor; 148 }; 149 150 class MaximumDurationTracker { 151 public: 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 163 private: 164 double* m_maxDuration; 165 double m_start; 144 166 }; 145 167 … … 290 312 , m_touchPressed(false) 291 313 #endif 314 , m_maxMouseMovedDuration(0) 292 315 { 293 316 } … … 336 359 m_originatingTouchPointTargets.clear(); 337 360 #endif 361 m_maxMouseMovedDuration = 0; 338 362 } 339 363 … … 1636 1660 bool EventHandler::mouseMoved(const PlatformMouseEvent& event) 1637 1661 { 1662 MaximumDurationTracker maxDurationTracker(&m_maxMouseMovedDuration); 1638 1663 RefPtr<FrameView> protector(m_frame->view()); 1664 1639 1665 1640 1666 #if ENABLE(TOUCH_EVENTS) … … 2500 2526 return; 2501 2527 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 } 2504 2540 } 2505 2541 … … 2510 2546 return; 2511 2547 2512 if ( m_mousePressed ||!quad.containsPoint(view->windowToContents(m_currentMousePosition)))2548 if (!quad.containsPoint(view->windowToContents(m_currentMousePosition))) 2513 2549 return; 2514 2550 2515 if (!m_fakeMouseMoveEventTimer.isActive()) 2516 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveInterval); 2551 dispatchFakeMouseMoveEventSoon(); 2517 2552 } 2518 2553 -
trunk/Source/WebCore/page/EventHandler.h
r108793 r109151 432 432 bool m_touchPressed; 433 433 #endif 434 double m_maxMouseMovedDuration; 434 435 }; 435 436
Note: See TracChangeset
for help on using the changeset viewer.