Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_input_event_router.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc |
| index e1d4f1c539ddf18143c28aba58ba97f8180f04c3..f660843f295560a04373cd070c38b2896f907678 100644 |
| --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc |
| +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc |
| @@ -48,14 +48,19 @@ void RenderWidgetHostInputEventRouter::OnRenderWidgetHostViewBaseDestroyed( |
| // If the target that's being destroyed is in the gesture target queue, we |
| // replace it with nullptr so that we maintain the 1:1 correspondence between |
| // queue entries and the touch sequences that underly them. |
| - for (size_t i = 0; i < gesture_target_queue_.size(); ++i) { |
| - if (gesture_target_queue_[i].target == view) |
| - gesture_target_queue_[i].target = nullptr; |
| + for (size_t i = 0; i < touchscreen_gesture_target_queue_.size(); ++i) { |
| + if (touchscreen_gesture_target_queue_[i].target == view) |
| + touchscreen_gesture_target_queue_[i].target = nullptr; |
| } |
| - if (view == gesture_target_) { |
| - gesture_target_ = nullptr; |
| - gesture_delta_ = gfx::Vector2d(); |
| + if (view == touchscreen_gesture_target_) { |
|
tdresser
2016/06/08 17:41:12
We should be able to clean this up once we switch
mohsen
2016/06/08 23:32:26
What sort of cleanup do you have in mind? I opted
|
| + touchscreen_gesture_target_ = nullptr; |
| + touchscreen_gesture_delta_ = gfx::Vector2d(); |
| + } |
| + |
| + if (view == touchpad_gesture_target_) { |
| + touchpad_gesture_target_ = nullptr; |
| + touchpad_gesture_delta_ = gfx::Vector2d(); |
| } |
| } |
| @@ -90,7 +95,8 @@ bool RenderWidgetHostInputEventRouter::HittestDelegate::AcceptHitTarget( |
| RenderWidgetHostInputEventRouter::RenderWidgetHostInputEventRouter() |
| : touch_target_(nullptr), |
| - gesture_target_(nullptr), |
| + touchscreen_gesture_target_(nullptr), |
| + touchpad_gesture_target_(nullptr), |
| active_touches_(0) {} |
| RenderWidgetHostInputEventRouter::~RenderWidgetHostInputEventRouter() { |
| @@ -165,34 +171,17 @@ void RenderWidgetHostInputEventRouter::RouteGestureEvent( |
| RenderWidgetHostViewBase* root_view, |
| blink::WebGestureEvent* event, |
| const ui::LatencyInfo& latency) { |
| - // We use GestureTapDown to detect the start of a gesture sequence since there |
| - // is no WebGestureEvent equivalent for ET_GESTURE_BEGIN. Note that this |
| - // means the GestureFlingCancel that always comes between ET_GESTURE_BEGIN and |
| - // GestureTapDown is sent to the previous target, in case it is still in a |
| - // fling. |
| - if (event->type == blink::WebInputEvent::GestureTapDown) { |
| - if (gesture_target_queue_.empty()) { |
| - LOG(ERROR) << "Gesture sequence start detected with no target available."; |
| - // Ignore this gesture sequence as no target is available. |
| - // TODO(wjmaclean): this only happens on Windows, and should not happen. |
| - // https://crbug.com/595422 |
| - gesture_target_ = nullptr; |
| - base::debug::DumpWithoutCrashing(); |
| - return; |
| - } |
| - |
| - const GestureTargetData& data = gesture_target_queue_.front(); |
| - gesture_target_ = data.target; |
| - gesture_delta_ = data.delta; |
| - gesture_target_queue_.pop_front(); |
| - } |
| - |
| - if (!gesture_target_) |
| - return; |
| - |
| - event->x += gesture_delta_.x(); |
| - event->y += gesture_delta_.y(); |
| - gesture_target_->ProcessGestureEvent(*event, latency); |
| + switch (event->sourceDevice) { |
| + case blink::WebGestureDeviceUninitialized: |
| + NOTREACHED() << "Uninitialized device type is not allowed"; |
| + break; |
| + case blink::WebGestureDeviceTouchpad: |
| + RouteTouchpadGestureEvent(root_view, event, latency); |
| + break; |
| + case blink::WebGestureDeviceTouchscreen: |
| + RouteTouchscreenGestureEvent(root_view, event, latency); |
| + break; |
| + }; |
| } |
| void RenderWidgetHostInputEventRouter::RouteTouchEvent( |
| @@ -217,7 +206,8 @@ void RenderWidgetHostInputEventRouter::RouteTouchEvent( |
| // might be to always transform each point to the touch_target_ |
| // for the duration of the sequence. |
| touch_delta_ = transformed_point - original_point; |
| - gesture_target_queue_.emplace_back(touch_target_, touch_delta_); |
| + touchscreen_gesture_target_queue_.emplace_back(touch_target_, |
| + touch_delta_); |
| if (!touch_target_) |
| return; |
| @@ -290,4 +280,66 @@ void RenderWidgetHostInputEventRouter::OnHittestData( |
| hittest_data_[params.surface_id] = data; |
| } |
| +void RenderWidgetHostInputEventRouter::RouteTouchscreenGestureEvent( |
| + RenderWidgetHostViewBase* root_view, |
| + blink::WebGestureEvent* event, |
| + const ui::LatencyInfo& latency) { |
| + DCHECK_EQ(blink::WebGestureDeviceTouchscreen, event->sourceDevice); |
| + |
| + // We use GestureTapDown to detect the start of a gesture sequence since there |
| + // is no WebGestureEvent equivalent for ET_GESTURE_BEGIN. Note that this |
| + // means the GestureFlingCancel that always comes between ET_GESTURE_BEGIN and |
| + // GestureTapDown is sent to the previous target, in case it is still in a |
| + // fling. |
| + if (event->type == blink::WebInputEvent::GestureTapDown) { |
| + if (touchscreen_gesture_target_queue_.empty()) { |
| + LOG(ERROR) << "Gesture sequence start detected with no target available."; |
| + // Ignore this gesture sequence as no target is available. |
| + // TODO(wjmaclean): this only happens on Windows, and should not happen. |
| + // https://crbug.com/595422 |
| + touchscreen_gesture_target_ = nullptr; |
| + base::debug::DumpWithoutCrashing(); |
| + return; |
| + } |
| + |
| + const TouchscreenGestureTargetData& data = |
| + touchscreen_gesture_target_queue_.front(); |
| + touchscreen_gesture_target_ = data.target; |
| + touchscreen_gesture_delta_ = data.delta; |
| + touchscreen_gesture_target_queue_.pop_front(); |
| + } |
| + |
| + if (!touchscreen_gesture_target_) |
| + return; |
| + |
| + event->x += touchscreen_gesture_delta_.x(); |
| + event->y += touchscreen_gesture_delta_.y(); |
| + touchscreen_gesture_target_->ProcessGestureEvent(*event, latency); |
| +} |
| + |
| +void RenderWidgetHostInputEventRouter::RouteTouchpadGestureEvent( |
| + RenderWidgetHostViewBase* root_view, |
| + blink::WebGestureEvent* event, |
| + const ui::LatencyInfo& latency) { |
| + DCHECK_EQ(blink::WebGestureDeviceTouchpad, event->sourceDevice); |
| + DCHECK(event->type == blink::WebInputEvent::GesturePinchBegin || |
| + event->type == blink::WebInputEvent::GesturePinchUpdate || |
| + event->type == blink::WebInputEvent::GesturePinchEnd); |
| + |
| + if (event->type == blink::WebInputEvent::GesturePinchBegin) { |
| + gfx::Point transformed_point; |
| + gfx::Point original_point(event->x, event->y); |
| + touchpad_gesture_target_ = |
| + FindEventTarget(root_view, original_point, &transformed_point); |
| + touchpad_gesture_delta_ = transformed_point - original_point; |
|
sadrul
2016/06/08 15:56:30
Add a TODO here like above for TouchStart that com
mohsen
2016/06/08 23:32:26
Done.
|
| + } |
| + |
| + if (!touchpad_gesture_target_) |
| + return; |
| + |
| + event->x += touchpad_gesture_delta_.x(); |
| + event->y += touchpad_gesture_delta_.y(); |
| + touchpad_gesture_target_->ProcessGestureEvent(*event, latency); |
| +} |
| + |
| } // namespace content |