| 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;
|
| }
|
| }
|
|
|
|
|