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 |