| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/render_widget_host_input_event_router.h" | 5 #include "content/browser/renderer_host/render_widget_host_input_event_router.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 | 10 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 void TransformEventTouchPositions(blink::WebTouchEvent* event, | 24 void TransformEventTouchPositions(blink::WebTouchEvent* event, |
| 25 const gfx::Vector2d& delta) { | 25 const gfx::Vector2d& delta) { |
| 26 for (unsigned i = 0; i < event->touchesLength; ++i) { | 26 for (unsigned i = 0; i < event->touchesLength; ++i) { |
| 27 event->touches[i].position.x += delta.x(); | 27 event->touches[i].position.x += delta.x(); |
| 28 event->touches[i].position.y += delta.y(); | 28 event->touches[i].position.y += delta.y(); |
| 29 } | 29 } |
| 30 } | 30 } |
| 31 | 31 |
| 32 blink::WebGestureEvent DummyGestureScrollUpdate() { | 32 blink::WebGestureEvent DummyGestureScrollUpdate(double timeStampSeconds) { |
| 33 blink::WebGestureEvent dummy_gesture_scroll_update; | 33 return blink::WebGestureEvent(blink::WebInputEvent::GestureScrollUpdate, |
| 34 dummy_gesture_scroll_update.type = blink::WebInputEvent::GestureScrollUpdate; | 34 blink::WebInputEvent::NoModifiers, |
| 35 return dummy_gesture_scroll_update; | 35 timeStampSeconds); |
| 36 } | 36 } |
| 37 | 37 |
| 38 } // anonymous namespace | 38 } // anonymous namespace |
| 39 | 39 |
| 40 namespace content { | 40 namespace content { |
| 41 | 41 |
| 42 void RenderWidgetHostInputEventRouter::OnRenderWidgetHostViewBaseDestroyed( | 42 void RenderWidgetHostInputEventRouter::OnRenderWidgetHostViewBaseDestroyed( |
| 43 RenderWidgetHostViewBase* view) { | 43 RenderWidgetHostViewBase* view) { |
| 44 view->RemoveObserver(this); | 44 view->RemoveObserver(this); |
| 45 | 45 |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 // of the touch sequence, though this could be wrong; a better approach | 330 // of the touch sequence, though this could be wrong; a better approach |
| 331 // might be to always transform each point to the |touch_target_.target| | 331 // might be to always transform each point to the |touch_target_.target| |
| 332 // for the duration of the sequence. | 332 // for the duration of the sequence. |
| 333 touch_target_.delta = transformed_point - original_point; | 333 touch_target_.delta = transformed_point - original_point; |
| 334 touchscreen_gesture_target_queue_.push_back(touch_target_); | 334 touchscreen_gesture_target_queue_.push_back(touch_target_); |
| 335 | 335 |
| 336 if (!touch_target_.target) | 336 if (!touch_target_.target) |
| 337 return; | 337 return; |
| 338 | 338 |
| 339 if (touch_target_.target == bubbling_gesture_scroll_target_.target) { | 339 if (touch_target_.target == bubbling_gesture_scroll_target_.target) { |
| 340 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, | 340 SendGestureScrollEnd( |
| 341 DummyGestureScrollUpdate()); | 341 bubbling_gesture_scroll_target_.target, |
| 342 DummyGestureScrollUpdate(event->timeStampSeconds)); |
| 342 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); | 343 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); |
| 343 } | 344 } |
| 344 } | 345 } |
| 345 | 346 |
| 346 if (touch_target_.target) { | 347 if (touch_target_.target) { |
| 347 TransformEventTouchPositions(event, touch_target_.delta); | 348 TransformEventTouchPositions(event, touch_target_.delta); |
| 348 touch_target_.target->ProcessTouchEvent(*event, latency); | 349 touch_target_.target->ProcessTouchEvent(*event, latency); |
| 349 } | 350 } |
| 350 break; | 351 break; |
| 351 } | 352 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 entered_views.back() == exited_views.back()) { | 446 entered_views.back() == exited_views.back()) { |
| 446 common_ancestor = entered_views.back(); | 447 common_ancestor = entered_views.back(); |
| 447 entered_views.pop_back(); | 448 entered_views.pop_back(); |
| 448 exited_views.pop_back(); | 449 exited_views.pop_back(); |
| 449 } | 450 } |
| 450 | 451 |
| 451 gfx::Point transformed_point; | 452 gfx::Point transformed_point; |
| 452 // Send MouseLeaves. | 453 // Send MouseLeaves. |
| 453 for (auto view : exited_views) { | 454 for (auto view : exited_views) { |
| 454 blink::WebMouseEvent mouse_leave(*event); | 455 blink::WebMouseEvent mouse_leave(*event); |
| 455 mouse_leave.type = blink::WebInputEvent::MouseLeave; | 456 mouse_leave.setType(blink::WebInputEvent::MouseLeave); |
| 456 // There is a chance of a race if the last target has recently created a | 457 // There is a chance of a race if the last target has recently created a |
| 457 // new compositor surface. The SurfaceID for that might not have | 458 // new compositor surface. The SurfaceID for that might not have |
| 458 // propagated to its embedding surface, which makes it impossible to | 459 // propagated to its embedding surface, which makes it impossible to |
| 459 // compute the transformation for it | 460 // compute the transformation for it |
| 460 if (!root_view->TransformPointToCoordSpaceForView( | 461 if (!root_view->TransformPointToCoordSpaceForView( |
| 461 gfx::Point(event->x, event->y), view, &transformed_point)) | 462 gfx::Point(event->x, event->y), view, &transformed_point)) |
| 462 transformed_point = gfx::Point(); | 463 transformed_point = gfx::Point(); |
| 463 mouse_leave.x = transformed_point.x(); | 464 mouse_leave.x = transformed_point.x(); |
| 464 mouse_leave.y = transformed_point.y(); | 465 mouse_leave.y = transformed_point.y(); |
| 465 view->ProcessMouseEvent(mouse_leave, ui::LatencyInfo()); | 466 view->ProcessMouseEvent(mouse_leave, ui::LatencyInfo()); |
| 466 } | 467 } |
| 467 | 468 |
| 468 // The ancestor might need to trigger MouseOut handlers. | 469 // The ancestor might need to trigger MouseOut handlers. |
| 469 if (common_ancestor && common_ancestor != target) { | 470 if (common_ancestor && common_ancestor != target) { |
| 470 blink::WebMouseEvent mouse_move(*event); | 471 blink::WebMouseEvent mouse_move(*event); |
| 471 mouse_move.type = blink::WebInputEvent::MouseMove; | 472 mouse_move.setType(blink::WebInputEvent::MouseMove); |
| 472 if (!root_view->TransformPointToCoordSpaceForView( | 473 if (!root_view->TransformPointToCoordSpaceForView( |
| 473 gfx::Point(event->x, event->y), common_ancestor, | 474 gfx::Point(event->x, event->y), common_ancestor, |
| 474 &transformed_point)) | 475 &transformed_point)) |
| 475 transformed_point = gfx::Point(); | 476 transformed_point = gfx::Point(); |
| 476 mouse_move.x = transformed_point.x(); | 477 mouse_move.x = transformed_point.x(); |
| 477 mouse_move.y = transformed_point.y(); | 478 mouse_move.y = transformed_point.y(); |
| 478 common_ancestor->ProcessMouseEvent(mouse_move, ui::LatencyInfo()); | 479 common_ancestor->ProcessMouseEvent(mouse_move, ui::LatencyInfo()); |
| 479 } | 480 } |
| 480 | 481 |
| 481 // Send MouseMoves to trigger MouseEnter handlers. | 482 // Send MouseMoves to trigger MouseEnter handlers. |
| 482 for (auto view : entered_views) { | 483 for (auto view : entered_views) { |
| 483 if (view == target) | 484 if (view == target) |
| 484 continue; | 485 continue; |
| 485 blink::WebMouseEvent mouse_enter(*event); | 486 blink::WebMouseEvent mouse_enter(*event); |
| 486 mouse_enter.type = blink::WebInputEvent::MouseMove; | 487 mouse_enter.setType(blink::WebInputEvent::MouseMove); |
| 487 if (!root_view->TransformPointToCoordSpaceForView( | 488 if (!root_view->TransformPointToCoordSpaceForView( |
| 488 gfx::Point(event->x, event->y), view, &transformed_point)) | 489 gfx::Point(event->x, event->y), view, &transformed_point)) |
| 489 transformed_point = gfx::Point(); | 490 transformed_point = gfx::Point(); |
| 490 mouse_enter.x = transformed_point.x(); | 491 mouse_enter.x = transformed_point.x(); |
| 491 mouse_enter.y = transformed_point.y(); | 492 mouse_enter.y = transformed_point.y(); |
| 492 view->ProcessMouseEvent(mouse_enter, ui::LatencyInfo()); | 493 view->ProcessMouseEvent(mouse_enter, ui::LatencyInfo()); |
| 493 } | 494 } |
| 494 | 495 |
| 495 last_mouse_move_target_ = target; | 496 last_mouse_move_target_ = target; |
| 496 last_mouse_move_root_view_ = root_view; | 497 last_mouse_move_root_view_ = root_view; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 SendGestureScrollBegin(target_view, event); | 566 SendGestureScrollBegin(target_view, event); |
| 566 target_view->ProcessGestureEvent(event, latency_info); | 567 target_view->ProcessGestureEvent(event, latency_info); |
| 567 } | 568 } |
| 568 | 569 |
| 569 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( | 570 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( |
| 570 RenderWidgetHostViewBase* view, | 571 RenderWidgetHostViewBase* view, |
| 571 const blink::WebGestureEvent& event) { | 572 const blink::WebGestureEvent& event) { |
| 572 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 573 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
| 573 event.type == blink::WebInputEvent::GesturePinchBegin); | 574 event.type == blink::WebInputEvent::GesturePinchBegin); |
| 574 blink::WebGestureEvent scroll_begin(event); | 575 blink::WebGestureEvent scroll_begin(event); |
| 575 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; | 576 scroll_begin.setType(blink::WebInputEvent::GestureScrollBegin); |
| 576 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; | 577 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; |
| 577 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; | 578 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; |
| 578 scroll_begin.data.scrollBegin.deltaHintUnits = | 579 scroll_begin.data.scrollBegin.deltaHintUnits = |
| 579 event.data.scrollUpdate.deltaUnits; | 580 event.data.scrollUpdate.deltaUnits; |
| 580 view->ProcessGestureEvent( | 581 view->ProcessGestureEvent( |
| 581 scroll_begin, | 582 scroll_begin, |
| 582 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); | 583 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
| 583 } | 584 } |
| 584 | 585 |
| 585 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( | 586 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( |
| 586 RenderWidgetHostViewBase* view, | 587 RenderWidgetHostViewBase* view, |
| 587 const blink::WebGestureEvent& event) { | 588 const blink::WebGestureEvent& event) { |
| 588 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 589 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
| 589 event.type == blink::WebInputEvent::GesturePinchEnd); | 590 event.type == blink::WebInputEvent::GesturePinchEnd); |
| 590 blink::WebGestureEvent scroll_end(event); | 591 blink::WebGestureEvent scroll_end(event); |
| 591 scroll_end.type = blink::WebInputEvent::GestureScrollEnd; | 592 scroll_end.setType(blink::WebInputEvent::GestureScrollEnd); |
| 592 scroll_end.timeStampSeconds = | 593 scroll_end.setTimeStampSeconds( |
| 593 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 594 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF()); |
| 594 scroll_end.data.scrollEnd.inertialPhase = | 595 scroll_end.data.scrollEnd.inertialPhase = |
| 595 event.data.scrollUpdate.inertialPhase; | 596 event.data.scrollUpdate.inertialPhase; |
| 596 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; | 597 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; |
| 597 view->ProcessGestureEvent( | 598 view->ProcessGestureEvent( |
| 598 scroll_end, | 599 scroll_end, |
| 599 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); | 600 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
| 600 } | 601 } |
| 601 | 602 |
| 602 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( | 603 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( |
| 603 RenderWidgetHostViewBase* target_view) { | 604 RenderWidgetHostViewBase* target_view) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 } | 721 } |
| 721 | 722 |
| 722 touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front(); | 723 touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front(); |
| 723 touchscreen_gesture_target_queue_.pop_front(); | 724 touchscreen_gesture_target_queue_.pop_front(); |
| 724 | 725 |
| 725 // Abort any scroll bubbling in progress to avoid double entry. | 726 // Abort any scroll bubbling in progress to avoid double entry. |
| 726 if (touchscreen_gesture_target_.target && | 727 if (touchscreen_gesture_target_.target && |
| 727 touchscreen_gesture_target_.target == | 728 touchscreen_gesture_target_.target == |
| 728 bubbling_gesture_scroll_target_.target) { | 729 bubbling_gesture_scroll_target_.target) { |
| 729 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, | 730 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, |
| 730 DummyGestureScrollUpdate()); | 731 DummyGestureScrollUpdate(event->timeStampSeconds)); |
| 731 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); | 732 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); |
| 732 } | 733 } |
| 733 } | 734 } |
| 734 | 735 |
| 735 if (!touchscreen_gesture_target_.target) | 736 if (!touchscreen_gesture_target_.target) |
| 736 return; | 737 return; |
| 737 | 738 |
| 738 // TODO(mohsen): Add tests to check event location. | 739 // TODO(mohsen): Add tests to check event location. |
| 739 event->x += touchscreen_gesture_target_.delta.x(); | 740 event->x += touchscreen_gesture_target_.delta.x(); |
| 740 event->y += touchscreen_gesture_target_.delta.y(); | 741 event->y += touchscreen_gesture_target_.delta.y(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 758 // touchpad gesture sequence, though this could be wrong; a better approach | 759 // touchpad gesture sequence, though this could be wrong; a better approach |
| 759 // might be to always transform each point to the | 760 // might be to always transform each point to the |
| 760 // |touchpad_gesture_target_.target| for the duration of the sequence. | 761 // |touchpad_gesture_target_.target| for the duration of the sequence. |
| 761 touchpad_gesture_target_.delta = transformed_point - original_point; | 762 touchpad_gesture_target_.delta = transformed_point - original_point; |
| 762 | 763 |
| 763 // Abort any scroll bubbling in progress to avoid double entry. | 764 // Abort any scroll bubbling in progress to avoid double entry. |
| 764 if (touchpad_gesture_target_.target && | 765 if (touchpad_gesture_target_.target && |
| 765 touchpad_gesture_target_.target == | 766 touchpad_gesture_target_.target == |
| 766 bubbling_gesture_scroll_target_.target) { | 767 bubbling_gesture_scroll_target_.target) { |
| 767 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, | 768 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, |
| 768 DummyGestureScrollUpdate()); | 769 DummyGestureScrollUpdate(event->timeStampSeconds)); |
| 769 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); | 770 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); |
| 770 } | 771 } |
| 771 } | 772 } |
| 772 | 773 |
| 773 if (!touchpad_gesture_target_.target) | 774 if (!touchpad_gesture_target_.target) |
| 774 return; | 775 return; |
| 775 | 776 |
| 776 // TODO(mohsen): Add tests to check event location. | 777 // TODO(mohsen): Add tests to check event location. |
| 777 event->x += touchpad_gesture_target_.delta.x(); | 778 event->x += touchpad_gesture_target_.delta.x(); |
| 778 event->y += touchpad_gesture_target_.delta.y(); | 779 event->y += touchpad_gesture_target_.delta.y(); |
| 779 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); | 780 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); |
| 780 } | 781 } |
| 781 | 782 |
| 782 } // namespace content | 783 } // namespace content |
| OLD | NEW |