Index: Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp |
=================================================================== |
--- Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp (revision 112613) |
+++ Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp (working copy) |
@@ -268,9 +268,12 @@ |
switch (scrollStatus) { |
case CCInputHandlerClient::ScrollStarted: { |
TRACE_EVENT_INSTANT0("cc", "WebCompositorInputHandlerImpl::handleGestureFling::started"); |
- OwnPtr<PlatformGestureCurve> flingCurve = TouchpadFlingPlatformGestureCurve::create(FloatPoint(-gestureEvent.deltaX, -gestureEvent.deltaY)); |
+ OwnPtr<PlatformGestureCurve> flingCurve = TouchpadFlingPlatformGestureCurve::create(FloatPoint(gestureEvent.deltaX, gestureEvent.deltaY)); |
m_wheelFlingAnimation = CCActiveGestureAnimation::create(PlatformGestureToCCGestureAdapter::create(flingCurve.release()), this); |
- m_wheelFlingPoint = IntPoint(gestureEvent.x, gestureEvent.y); |
+ m_wheelFlingParameters.delta = WebFloatPoint(gestureEvent.deltaX, gestureEvent.deltaY); |
+ m_wheelFlingParameters.point = WebPoint(gestureEvent.x, gestureEvent.y); |
+ m_wheelFlingParameters.globalPoint = WebPoint(gestureEvent.globalX, gestureEvent.globalY); |
+ m_wheelFlingParameters.modifiers = gestureEvent.modifiers; |
m_inputHandlerClient->scheduleAnimation(); |
return DidHandle; |
} |
@@ -299,11 +302,14 @@ |
if (!m_wheelFlingAnimation) |
return; |
+ if (!m_wheelFlingParameters.startTime) |
+ m_wheelFlingParameters.startTime = monotonicTime; |
+ |
if (m_wheelFlingAnimation->animate(monotonicTime)) |
m_inputHandlerClient->scheduleAnimation(); |
else { |
TRACE_EVENT_INSTANT0("cc", "WebCompositorInputHandlerImpl::animate::flingOver"); |
- m_wheelFlingAnimation.clear(); |
+ cancelCurrentFling(); |
} |
} |
@@ -312,6 +318,7 @@ |
bool hadFlingAnimation = m_wheelFlingAnimation; |
TRACE_EVENT_INSTANT1("cc", "WebCompositorInputHandlerImpl::cancelCurrentFling", "hadFlingAnimation", hadFlingAnimation); |
m_wheelFlingAnimation.clear(); |
+ m_wheelFlingParameters = WebActiveWheelFlingParameters(); |
return hadFlingAnimation; |
} |
@@ -321,30 +328,35 @@ |
return; |
TRACE_EVENT2("cc", "WebCompositorInputHandlerImpl::scrollBy", "x", increment.x(), "y", increment.y()); |
+ WebMouseWheelEvent syntheticWheel; |
+ syntheticWheel.type = WebInputEvent::MouseWheel; |
+ syntheticWheel.deltaX = increment.x(); |
+ syntheticWheel.deltaY = increment.y(); |
+ syntheticWheel.hasPreciseScrollingDeltas = true; |
+ syntheticWheel.x = m_wheelFlingParameters.point.x; |
+ syntheticWheel.y = m_wheelFlingParameters.point.y; |
+ syntheticWheel.globalX = m_wheelFlingParameters.globalPoint.x; |
+ syntheticWheel.globalY = m_wheelFlingParameters.globalPoint.y; |
+ syntheticWheel.modifiers = m_wheelFlingParameters.modifiers; |
- WebMouseWheelEvent event; |
- event.type = WebInputEvent::MouseWheel; |
- event.deltaX = -increment.x(); |
- event.deltaY = -increment.y(); |
- event.hasPreciseScrollingDeltas = true; |
- event.x = m_wheelFlingPoint.x(); |
- event.y = m_wheelFlingPoint.y(); |
- |
- WebCompositorInputHandlerImpl::EventDisposition disposition = handleInputEventInternal(event); |
+ WebCompositorInputHandlerImpl::EventDisposition disposition = handleInputEventInternal(syntheticWheel); |
switch (disposition) { |
case DidHandle: |
+ m_wheelFlingParameters.cumulativeScroll.width += increment.x(); |
+ m_wheelFlingParameters.cumulativeScroll.height += increment.y(); |
case DropEvent: |
break; |
case DidNotHandle: |
TRACE_EVENT_INSTANT0("cc", "WebCompositorInputHandlerImpl::scrollBy::AbortFling"); |
- // FIXME: If we got a DidNotHandle, that means we need to deliver wheels on the main thread. |
+ // If we got a DidNotHandle, that means we need to deliver wheels on the main thread. |
// In this case we need to schedule a commit and transfer the fling curve over to the main |
// thread and run the rest of the wheels from there. |
// This can happen when flinging a page that contains a scrollable subarea that we can't |
// scroll on the thread if the fling starts outside the subarea but then is flung "under" the |
// pointer. |
- // For now, just abort the fling. |
+ m_client->transferActiveWheelFlingAnimation(m_wheelFlingParameters); |
cancelCurrentFling(); |
+ break; |
} |
} |