Index: content/renderer/gpu/input_handler_proxy.cc |
diff --git a/content/renderer/gpu/input_handler_proxy.cc b/content/renderer/gpu/input_handler_proxy.cc |
index 77dd0f0af8472559f704120c5ad6618f4c2ec418..7dcf656bbd2569c7a6d75851c6a0d751c6b8c00c 100644 |
--- a/content/renderer/gpu/input_handler_proxy.cc |
+++ b/content/renderer/gpu/input_handler_proxy.cc |
@@ -8,7 +8,7 @@ |
#include "base/logging.h" |
#include "base/metrics/histogram.h" |
#include "content/renderer/gpu/input_handler_proxy_client.h" |
-#include "third_party/WebKit/public/platform/Platform.h" |
+#include "third_party/WebKit/public/platform/WebFloatSize.h" |
#include "third_party/WebKit/public/web/WebInputEvent.h" |
#include "ui/events/latency_info.h" |
@@ -60,10 +60,7 @@ InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler) |
expect_pinch_update_end_(false), |
#endif |
gesture_scroll_on_impl_thread_(false), |
- gesture_pinch_on_impl_thread_(false), |
- fling_may_be_active_on_main_thread_(false), |
- fling_overscrolled_horizontally_(false), |
- fling_overscrolled_vertically_(false) { |
+ gesture_pinch_on_impl_thread_(false) { |
input_handler_->BindToClient(this); |
} |
@@ -208,22 +205,15 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( |
gfx::Point(gesture_event.x, gesture_event.y)); |
return DID_HANDLE; |
} else if (event.type == WebInputEvent::GestureFlingStart) { |
- const WebGestureEvent& gesture_event = |
- *static_cast<const WebGestureEvent*>(&event); |
- return HandleGestureFling(gesture_event); |
+ NOTREACHED(); |
} else if (event.type == WebInputEvent::GestureFlingCancel) { |
- if (CancelCurrentFling()) |
- return DID_HANDLE; |
- else if (!fling_may_be_active_on_main_thread_) |
- return DROP_EVENT; |
+ NOTREACHED(); |
} else if (event.type == WebInputEvent::TouchStart) { |
const WebTouchEvent& touch_event = |
*static_cast<const WebTouchEvent*>(&event); |
if (!input_handler_->HaveTouchEventHandlersAt(touch_event.touches[0] |
.position)) |
return DROP_EVENT; |
- } else if (WebInputEvent::isKeyboardEventType(event.type)) { |
- CancelCurrentFling(); |
} else if (event.type == WebInputEvent::MouseMove) { |
const WebMouseEvent& mouse_event = |
*static_cast<const WebMouseEvent*>(&event); |
@@ -234,229 +224,12 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( |
return DID_NOT_HANDLE; |
} |
-InputHandlerProxy::EventDisposition |
-InputHandlerProxy::HandleGestureFling( |
- const WebGestureEvent& gesture_event) { |
- cc::InputHandler::ScrollStatus scroll_status; |
- |
- if (gesture_event.sourceDevice == WebGestureEvent::Touchpad) { |
- scroll_status = input_handler_->ScrollBegin( |
- gfx::Point(gesture_event.x, gesture_event.y), |
- cc::InputHandler::NonBubblingGesture); |
- } else { |
- if (!gesture_scroll_on_impl_thread_) |
- scroll_status = cc::InputHandler::ScrollOnMainThread; |
- else |
- scroll_status = input_handler_->FlingScrollBegin(); |
- } |
- |
-#ifndef NDEBUG |
- expect_scroll_update_end_ = false; |
-#endif |
- |
- switch (scroll_status) { |
- case cc::InputHandler::ScrollStarted: { |
- if (gesture_event.sourceDevice == WebGestureEvent::Touchpad) |
- input_handler_->ScrollEnd(); |
- |
- fling_curve_.reset(client_->CreateFlingAnimationCurve( |
- gesture_event.sourceDevice, |
- WebFloatPoint(gesture_event.data.flingStart.velocityX, |
- gesture_event.data.flingStart.velocityY), |
- WebKit::WebSize())); |
- fling_overscrolled_horizontally_ = false; |
- fling_overscrolled_vertically_ = false; |
- TRACE_EVENT_ASYNC_BEGIN0( |
- "renderer", |
- "InputHandlerProxy::HandleGestureFling::started", |
- this); |
- fling_parameters_.delta = |
- WebFloatPoint(gesture_event.data.flingStart.velocityX, |
- gesture_event.data.flingStart.velocityY); |
- fling_parameters_.point = WebPoint(gesture_event.x, gesture_event.y); |
- fling_parameters_.globalPoint = |
- WebPoint(gesture_event.globalX, gesture_event.globalY); |
- fling_parameters_.modifiers = gesture_event.modifiers; |
- fling_parameters_.sourceDevice = gesture_event.sourceDevice; |
- input_handler_->ScheduleAnimation(); |
- return DID_HANDLE; |
- } |
- case cc::InputHandler::ScrollOnMainThread: { |
- TRACE_EVENT_INSTANT0("renderer", |
- "InputHandlerProxy::HandleGestureFling::" |
- "scroll_on_main_thread", |
- TRACE_EVENT_SCOPE_THREAD); |
- fling_may_be_active_on_main_thread_ = true; |
- return DID_NOT_HANDLE; |
- } |
- case cc::InputHandler::ScrollIgnored: { |
- TRACE_EVENT_INSTANT0( |
- "renderer", |
- "InputHandlerProxy::HandleGestureFling::ignored", |
- TRACE_EVENT_SCOPE_THREAD); |
- if (gesture_event.sourceDevice == WebGestureEvent::Touchpad) { |
- // We still pass the curve to the main thread if there's nothing |
- // scrollable, in case something |
- // registers a handler before the curve is over. |
- return DID_NOT_HANDLE; |
- } |
- return DROP_EVENT; |
- } |
- } |
- return DID_NOT_HANDLE; |
-} |
- |
void InputHandlerProxy::Animate(base::TimeTicks time) { |
- if (!fling_curve_) |
- return; |
- |
- double monotonic_time_sec = (time - base::TimeTicks()).InSecondsF(); |
- if (!fling_parameters_.startTime) { |
- fling_parameters_.startTime = monotonic_time_sec; |
- input_handler_->ScheduleAnimation(); |
- return; |
- } |
- |
- if (fling_curve_->apply(monotonic_time_sec - fling_parameters_.startTime, |
- this)) { |
- input_handler_->ScheduleAnimation(); |
- } else { |
- TRACE_EVENT_INSTANT0("renderer", |
- "InputHandlerProxy::animate::flingOver", |
- TRACE_EVENT_SCOPE_THREAD); |
- CancelCurrentFling(); |
- } |
-} |
- |
-void InputHandlerProxy::MainThreadHasStoppedFlinging() { |
- fling_may_be_active_on_main_thread_ = false; |
} |
void InputHandlerProxy::DidOverscroll(const cc::DidOverscrollParams& params) { |
DCHECK(client_); |
- if (fling_curve_) { |
- static const int kFlingOverscrollThreshold = 1; |
- fling_overscrolled_horizontally_ |= |
- std::abs(params.accumulated_overscroll.x()) >= |
- kFlingOverscrollThreshold; |
- fling_overscrolled_vertically_ |= |
- std::abs(params.accumulated_overscroll.y()) >= |
- kFlingOverscrollThreshold; |
- } |
- |
client_->DidOverscroll(params); |
} |
-bool InputHandlerProxy::CancelCurrentFling() { |
- bool had_fling_animation = fling_curve_; |
- if (had_fling_animation && |
- fling_parameters_.sourceDevice == WebGestureEvent::Touchscreen) { |
- input_handler_->ScrollEnd(); |
- TRACE_EVENT_ASYNC_END0( |
- "renderer", |
- "InputHandlerProxy::HandleGestureFling::started", |
- this); |
- } |
- |
- TRACE_EVENT_INSTANT1("renderer", |
- "InputHandlerProxy::CancelCurrentFling", |
- TRACE_EVENT_SCOPE_THREAD, |
- "had_fling_animation", |
- had_fling_animation); |
- fling_curve_.reset(); |
- gesture_scroll_on_impl_thread_ = false; |
- fling_parameters_ = WebKit::WebActiveWheelFlingParameters(); |
- return had_fling_animation; |
-} |
- |
-bool InputHandlerProxy::TouchpadFlingScroll( |
- const WebFloatSize& increment) { |
- WebMouseWheelEvent synthetic_wheel; |
- synthetic_wheel.type = WebInputEvent::MouseWheel; |
- synthetic_wheel.deltaX = increment.width; |
- synthetic_wheel.deltaY = increment.height; |
- synthetic_wheel.hasPreciseScrollingDeltas = true; |
- synthetic_wheel.x = fling_parameters_.point.x; |
- synthetic_wheel.y = fling_parameters_.point.y; |
- synthetic_wheel.globalX = fling_parameters_.globalPoint.x; |
- synthetic_wheel.globalY = fling_parameters_.globalPoint.y; |
- synthetic_wheel.modifiers = fling_parameters_.modifiers; |
- |
- InputHandlerProxy::EventDisposition disposition = |
- HandleInputEvent(synthetic_wheel); |
- switch (disposition) { |
- case DID_HANDLE: |
- return true; |
- case DROP_EVENT: |
- break; |
- case DID_NOT_HANDLE: |
- TRACE_EVENT_INSTANT0("renderer", |
- "InputHandlerProxy::scrollBy::AbortFling", |
- TRACE_EVENT_SCOPE_THREAD); |
- // If we got a DID_NOT_HANDLE, 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. |
- client_->TransferActiveWheelFlingAnimation(fling_parameters_); |
- fling_may_be_active_on_main_thread_ = true; |
- CancelCurrentFling(); |
- break; |
- } |
- |
- return false; |
-} |
- |
-static gfx::Vector2dF ToClientScrollIncrement(const WebFloatSize& increment) { |
- return gfx::Vector2dF(-increment.width, -increment.height); |
-} |
- |
-void InputHandlerProxy::scrollBy(const WebFloatSize& increment) { |
- WebFloatSize clipped_increment; |
- if (!fling_overscrolled_horizontally_) |
- clipped_increment.width = increment.width; |
- if (!fling_overscrolled_vertically_) |
- clipped_increment.height = increment.height; |
- |
- if (clipped_increment == WebFloatSize()) |
- return; |
- |
- TRACE_EVENT2("renderer", |
- "InputHandlerProxy::scrollBy", |
- "x", |
- clipped_increment.width, |
- "y", |
- clipped_increment.height); |
- |
- bool did_scroll = false; |
- |
- switch (fling_parameters_.sourceDevice) { |
- case WebGestureEvent::Touchpad: |
- did_scroll = TouchpadFlingScroll(clipped_increment); |
- break; |
- case WebGestureEvent::Touchscreen: |
- clipped_increment = ToClientScrollIncrement(clipped_increment); |
- did_scroll = input_handler_->ScrollBy(fling_parameters_.point, |
- clipped_increment); |
- break; |
- } |
- |
- if (did_scroll) { |
- fling_parameters_.cumulativeScroll.width += clipped_increment.width; |
- fling_parameters_.cumulativeScroll.height += clipped_increment.height; |
- } |
-} |
- |
-void InputHandlerProxy::notifyCurrentFlingVelocity( |
- const WebFloatSize& velocity) { |
- TRACE_EVENT2("renderer", |
- "InputHandlerProxy::notifyCurrentFlingVelocity", |
- "vx", |
- velocity.width, |
- "vy", |
- velocity.height); |
- input_handler_->NotifyCurrentFlingVelocity(ToClientScrollIncrement(velocity)); |
-} |
- |
} // namespace content |