| 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 de66e0f23a33fe4807c20178ff641653f23fb6ec..e1d4f1c539ddf18143c28aba58ba97f8180f04c3 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
|
| @@ -39,24 +39,24 @@
|
| }
|
| }
|
|
|
| - if (view == touch_target_.target) {
|
| - touch_target_.target = nullptr;
|
| + if (view == touch_target_) {
|
| + touch_target_ = nullptr;
|
| + touch_delta_ = gfx::Vector2d();
|
| active_touches_ = 0;
|
| }
|
|
|
| // 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 < touchscreen_gesture_target_queue_.size(); ++i) {
|
| - if (touchscreen_gesture_target_queue_[i].target == view)
|
| - touchscreen_gesture_target_queue_[i].target = nullptr;
|
| - }
|
| -
|
| - if (view == touchscreen_gesture_target_.target)
|
| - touchscreen_gesture_target_.target = nullptr;
|
| -
|
| - if (view == touchpad_gesture_target_.target)
|
| - touchpad_gesture_target_.target = nullptr;
|
| + for (size_t i = 0; i < gesture_target_queue_.size(); ++i) {
|
| + if (gesture_target_queue_[i].target == view)
|
| + gesture_target_queue_[i].target = nullptr;
|
| + }
|
| +
|
| + if (view == gesture_target_) {
|
| + gesture_target_ = nullptr;
|
| + gesture_delta_ = gfx::Vector2d();
|
| + }
|
| }
|
|
|
| void RenderWidgetHostInputEventRouter::ClearAllObserverRegistrations() {
|
| @@ -89,7 +89,9 @@
|
| }
|
|
|
| RenderWidgetHostInputEventRouter::RenderWidgetHostInputEventRouter()
|
| - : active_touches_(0) {}
|
| + : touch_target_(nullptr),
|
| + gesture_target_(nullptr),
|
| + active_touches_(0) {}
|
|
|
| RenderWidgetHostInputEventRouter::~RenderWidgetHostInputEventRouter() {
|
| // We may be destroyed before some of the owners in the map, so we must
|
| @@ -163,17 +165,34 @@
|
| RenderWidgetHostViewBase* root_view,
|
| blink::WebGestureEvent* event,
|
| const ui::LatencyInfo& 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;
|
| - };
|
| + // 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);
|
| }
|
|
|
| void RenderWidgetHostInputEventRouter::RouteTouchEvent(
|
| @@ -185,48 +204,50 @@
|
| if (!active_touches_) {
|
| // Since this is the first touch, it defines the target for the rest
|
| // of this sequence.
|
| - DCHECK(!touch_target_.target);
|
| + DCHECK(!touch_target_);
|
| gfx::Point transformed_point;
|
| gfx::Point original_point(event->touches[0].position.x,
|
| event->touches[0].position.y);
|
| - touch_target_.target =
|
| + touch_target_ =
|
| FindEventTarget(root_view, original_point, &transformed_point);
|
|
|
| // TODO(wjmaclean): Instead of just computing a delta, we should extract
|
| // the complete transform. We assume it doesn't change for the duration
|
| // of the touch sequence, though this could be wrong; a better approach
|
| - // might be to always transform each point to the |touch_target_.target|
|
| + // might be to always transform each point to the touch_target_
|
| // for the duration of the sequence.
|
| - touch_target_.delta = transformed_point - original_point;
|
| - touchscreen_gesture_target_queue_.push_back(touch_target_);
|
| -
|
| - if (!touch_target_.target)
|
| + touch_delta_ = transformed_point - original_point;
|
| + gesture_target_queue_.emplace_back(touch_target_, touch_delta_);
|
| +
|
| + if (!touch_target_)
|
| return;
|
| }
|
| ++active_touches_;
|
| - if (touch_target_.target) {
|
| - TransformEventTouchPositions(event, touch_target_.delta);
|
| - touch_target_.target->ProcessTouchEvent(*event, latency);
|
| + if (touch_target_) {
|
| + TransformEventTouchPositions(event, touch_delta_);
|
| + touch_target_->ProcessTouchEvent(*event, latency);
|
| }
|
| break;
|
| }
|
| case blink::WebInputEvent::TouchMove:
|
| - if (touch_target_.target) {
|
| - TransformEventTouchPositions(event, touch_target_.delta);
|
| - touch_target_.target->ProcessTouchEvent(*event, latency);
|
| + if (touch_target_) {
|
| + TransformEventTouchPositions(event, touch_delta_);
|
| + touch_target_->ProcessTouchEvent(*event, latency);
|
| }
|
| break;
|
| case blink::WebInputEvent::TouchEnd:
|
| case blink::WebInputEvent::TouchCancel:
|
| - if (!touch_target_.target)
|
| + if (!touch_target_)
|
| break;
|
|
|
| DCHECK(active_touches_);
|
| - TransformEventTouchPositions(event, touch_target_.delta);
|
| - touch_target_.target->ProcessTouchEvent(*event, latency);
|
| + TransformEventTouchPositions(event, touch_delta_);
|
| + touch_target_->ProcessTouchEvent(*event, latency);
|
| --active_touches_;
|
| - if (!active_touches_)
|
| - touch_target_.target = nullptr;
|
| + if (!active_touches_) {
|
| + touch_target_ = nullptr;
|
| + touch_delta_ = gfx::Vector2d();
|
| + }
|
| break;
|
| default:
|
| NOTREACHED();
|
| @@ -269,70 +290,4 @@
|
| 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_.target = nullptr;
|
| - base::debug::DumpWithoutCrashing();
|
| - return;
|
| - }
|
| -
|
| - touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front();
|
| - touchscreen_gesture_target_queue_.pop_front();
|
| - }
|
| -
|
| - if (!touchscreen_gesture_target_.target)
|
| - return;
|
| -
|
| - // TODO(mohsen): Add tests to check event location.
|
| - event->x += touchscreen_gesture_target_.delta.x();
|
| - event->y += touchscreen_gesture_target_.delta.y();
|
| - touchscreen_gesture_target_.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_.target =
|
| - FindEventTarget(root_view, original_point, &transformed_point);
|
| - // TODO(mohsen): Instead of just computing a delta, we should extract the
|
| - // complete transform. We assume it doesn't change for the duration of the
|
| - // touchpad gesture sequence, though this could be wrong; a better approach
|
| - // might be to always transform each point to the
|
| - // |touchpad_gesture_target_.target| for the duration of the sequence.
|
| - touchpad_gesture_target_.delta = transformed_point - original_point;
|
| - }
|
| -
|
| - if (!touchpad_gesture_target_.target)
|
| - return;
|
| -
|
| - // TODO(mohsen): Add tests to check event location.
|
| - event->x += touchpad_gesture_target_.delta.x();
|
| - event->y += touchpad_gesture_target_.delta.y();
|
| - touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency);
|
| -}
|
| -
|
| } // namespace content
|
|
|