Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1527)

Unified Diff: content/browser/renderer_host/render_widget_host_input_event_router.cc

Issue 2034213002: Reland: Fix touchpad gesture routing to renderers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed DCHECK's Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698