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 |
11 #include "cc/quads/surface_draw_quad.h" | 11 #include "cc/quads/surface_draw_quad.h" |
12 #include "cc/surfaces/surface_id_allocator.h" | 12 #include "cc/surfaces/surface_id_allocator.h" |
13 #include "cc/surfaces/surface_manager.h" | 13 #include "cc/surfaces/surface_manager.h" |
14 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" | 14 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" |
15 #include "content/browser/renderer_host/render_widget_host_impl.h" | 15 #include "content/browser/renderer_host/render_widget_host_impl.h" |
16 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 16 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
17 #include "content/common/frame_messages.h" | 17 #include "content/common/frame_messages.h" |
18 #include "third_party/WebKit/public/web/WebInputEvent.h" | 18 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 19 #include "ui/events/blink/web_input_event_traits.h" |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 void TransformEventTouchPositions(blink::WebTouchEvent* event, | 23 void TransformEventTouchPositions(blink::WebTouchEvent* event, |
23 const gfx::Vector2d& delta) { | 24 const gfx::Vector2d& delta) { |
24 for (unsigned i = 0; i < event->touchesLength; ++i) { | 25 for (unsigned i = 0; i < event->touchesLength; ++i) { |
25 event->touches[i].position.x += delta.x(); | 26 event->touches[i].position.x += delta.x(); |
26 event->touches[i].position.y += delta.y(); | 27 event->touches[i].position.y += delta.y(); |
27 } | 28 } |
28 } | 29 } |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 // it likely means the RenderWidgetHostView has been destroyed but its | 164 // it likely means the RenderWidgetHostView has been destroyed but its |
164 // parent frame has not sent a new compositor frame since that happened. | 165 // parent frame has not sent a new compositor frame since that happened. |
165 if (iter == owner_map_.end()) | 166 if (iter == owner_map_.end()) |
166 return root_view; | 167 return root_view; |
167 | 168 |
168 return iter->second; | 169 return iter->second; |
169 } | 170 } |
170 | 171 |
171 void RenderWidgetHostInputEventRouter::RouteMouseEvent( | 172 void RenderWidgetHostInputEventRouter::RouteMouseEvent( |
172 RenderWidgetHostViewBase* root_view, | 173 RenderWidgetHostViewBase* root_view, |
173 blink::WebMouseEvent* event) { | 174 blink::WebMouseEvent* event, |
| 175 const ui::LatencyInfo& latency) { |
174 RenderWidgetHostViewBase* target; | 176 RenderWidgetHostViewBase* target; |
175 gfx::Point transformed_point; | 177 gfx::Point transformed_point; |
176 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | | 178 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | |
177 blink::WebInputEvent::MiddleButtonDown | | 179 blink::WebInputEvent::MiddleButtonDown | |
178 blink::WebInputEvent::RightButtonDown; | 180 blink::WebInputEvent::RightButtonDown; |
179 if (mouse_capture_target_.target && | 181 if (mouse_capture_target_.target && |
180 event->type != blink::WebInputEvent::MouseDown && | 182 event->type != blink::WebInputEvent::MouseDown && |
181 (event->type == blink::WebInputEvent::MouseUp || | 183 (event->type == blink::WebInputEvent::MouseUp || |
182 event->modifiers & mouse_button_modifiers)) { | 184 event->modifiers & mouse_button_modifiers)) { |
183 target = mouse_capture_target_.target; | 185 target = mouse_capture_target_.target; |
(...skipping 15 matching lines...) Expand all Loading... |
199 // SendMouseEnterOrLeaveEvents is called with the original event | 201 // SendMouseEnterOrLeaveEvents is called with the original event |
200 // coordinates, which are transformed independently for each view that will | 202 // coordinates, which are transformed independently for each view that will |
201 // receive an event. | 203 // receive an event. |
202 if ((event->type == blink::WebInputEvent::MouseLeave || | 204 if ((event->type == blink::WebInputEvent::MouseLeave || |
203 event->type == blink::WebInputEvent::MouseMove) && | 205 event->type == blink::WebInputEvent::MouseMove) && |
204 target != last_mouse_move_target_) | 206 target != last_mouse_move_target_) |
205 SendMouseEnterOrLeaveEvents(event, target, root_view); | 207 SendMouseEnterOrLeaveEvents(event, target, root_view); |
206 | 208 |
207 event->x = transformed_point.x(); | 209 event->x = transformed_point.x(); |
208 event->y = transformed_point.y(); | 210 event->y = transformed_point.y(); |
209 // TODO(wjmaclean): Initialize latency info correctly for OOPIFs. | 211 target->ProcessMouseEvent(*event, latency); |
210 // https://crbug.com/613628 | |
211 ui::LatencyInfo latency_info; | |
212 target->ProcessMouseEvent(*event, latency_info); | |
213 } | 212 } |
214 | 213 |
215 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( | 214 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( |
216 RenderWidgetHostViewBase* root_view, | 215 RenderWidgetHostViewBase* root_view, |
217 blink::WebMouseWheelEvent* event) { | 216 blink::WebMouseWheelEvent* event, |
| 217 const ui::LatencyInfo& latency) { |
218 gfx::Point transformed_point; | 218 gfx::Point transformed_point; |
219 RenderWidgetHostViewBase* target = FindEventTarget( | 219 RenderWidgetHostViewBase* target = FindEventTarget( |
220 root_view, gfx::Point(event->x, event->y), &transformed_point); | 220 root_view, gfx::Point(event->x, event->y), &transformed_point); |
221 if (!target) | 221 if (!target) |
222 return; | 222 return; |
223 | 223 |
224 event->x = transformed_point.x(); | 224 event->x = transformed_point.x(); |
225 event->y = transformed_point.y(); | 225 event->y = transformed_point.y(); |
226 // TODO(wjmaclean): Initialize latency info correctly for OOPIFs. | 226 target->ProcessMouseWheelEvent(*event, latency); |
227 // https://crbug.com/613628 | |
228 ui::LatencyInfo latency_info; | |
229 target->ProcessMouseWheelEvent(*event, latency_info); | |
230 } | 227 } |
231 | 228 |
232 void RenderWidgetHostInputEventRouter::RouteGestureEvent( | 229 void RenderWidgetHostInputEventRouter::RouteGestureEvent( |
233 RenderWidgetHostViewBase* root_view, | 230 RenderWidgetHostViewBase* root_view, |
234 blink::WebGestureEvent* event, | 231 blink::WebGestureEvent* event, |
235 const ui::LatencyInfo& latency) { | 232 const ui::LatencyInfo& latency) { |
236 switch (event->sourceDevice) { | 233 switch (event->sourceDevice) { |
237 case blink::WebGestureDeviceUninitialized: | 234 case blink::WebGestureDeviceUninitialized: |
238 NOTREACHED() << "Uninitialized device type is not allowed"; | 235 NOTREACHED() << "Uninitialized device type is not allowed"; |
239 break; | 236 break; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 // difficult to resolve until this is changed to do all scroll targeting, | 456 // difficult to resolve until this is changed to do all scroll targeting, |
460 // including bubbling, based on GestureScrollBegin. | 457 // including bubbling, based on GestureScrollBegin. |
461 DCHECK(target_view); | 458 DCHECK(target_view); |
462 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 459 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
463 event.type == blink::WebInputEvent::GestureScrollEnd); | 460 event.type == blink::WebInputEvent::GestureScrollEnd); |
464 // DCHECK_XNOR the current and original bubble targets. Both should be set | 461 // DCHECK_XNOR the current and original bubble targets. Both should be set |
465 // if a bubbling gesture scroll is in progress. | 462 // if a bubbling gesture scroll is in progress. |
466 DCHECK(!first_bubbling_scroll_target_.target == | 463 DCHECK(!first_bubbling_scroll_target_.target == |
467 !bubbling_gesture_scroll_target_.target); | 464 !bubbling_gesture_scroll_target_.target); |
468 | 465 |
| 466 ui::LatencyInfo latency_info = |
| 467 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); |
| 468 |
469 // If target_view is already set up for bubbled scrolls, we forward | 469 // If target_view is already set up for bubbled scrolls, we forward |
470 // the event to the current scroll target without further consideration. | 470 // the event to the current scroll target without further consideration. |
471 if (target_view == first_bubbling_scroll_target_.target) { | 471 if (target_view == first_bubbling_scroll_target_.target) { |
472 bubbling_gesture_scroll_target_.target->ProcessGestureEvent( | 472 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, |
473 event, ui::LatencyInfo()); | 473 latency_info); |
474 if (event.type == blink::WebInputEvent::GestureScrollEnd) { | 474 if (event.type == blink::WebInputEvent::GestureScrollEnd) { |
475 first_bubbling_scroll_target_.target = nullptr; | 475 first_bubbling_scroll_target_.target = nullptr; |
476 bubbling_gesture_scroll_target_.target = nullptr; | 476 bubbling_gesture_scroll_target_.target = nullptr; |
477 } | 477 } |
478 return; | 478 return; |
479 } | 479 } |
480 | 480 |
481 // Disregard GestureScrollEnd events going to non-current targets. | 481 // Disregard GestureScrollEnd events going to non-current targets. |
482 // These should only happen on ACKs of synthesized GSE events that are | 482 // These should only happen on ACKs of synthesized GSE events that are |
483 // sent from SendGestureScrollEnd calls, and are not relevant here. | 483 // sent from SendGestureScrollEnd calls, and are not relevant here. |
484 if (event.type == blink::WebInputEvent::GestureScrollEnd) | 484 if (event.type == blink::WebInputEvent::GestureScrollEnd) |
485 return; | 485 return; |
486 | 486 |
487 // This is a special case to catch races where multiple GestureScrollUpdates | 487 // This is a special case to catch races where multiple GestureScrollUpdates |
488 // have been sent to a renderer before the first one was ACKed, and the ACK | 488 // have been sent to a renderer before the first one was ACKed, and the ACK |
489 // caused a bubble retarget. In this case they all get forwarded. | 489 // caused a bubble retarget. In this case they all get forwarded. |
490 if (target_view == bubbling_gesture_scroll_target_.target) { | 490 if (target_view == bubbling_gesture_scroll_target_.target) { |
491 bubbling_gesture_scroll_target_.target->ProcessGestureEvent( | 491 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, |
492 event, ui::LatencyInfo()); | 492 latency_info); |
493 return; | 493 return; |
494 } | 494 } |
495 | 495 |
496 // If target_view has unrelated gesture events in progress, do | 496 // If target_view has unrelated gesture events in progress, do |
497 // not proceed. This could cause confusion between independent | 497 // not proceed. This could cause confusion between independent |
498 // scrolls. | 498 // scrolls. |
499 if (target_view == touchscreen_gesture_target_.target || | 499 if (target_view == touchscreen_gesture_target_.target || |
500 target_view == touchpad_gesture_target_.target || | 500 target_view == touchpad_gesture_target_.target || |
501 target_view == touch_target_.target) | 501 target_view == touch_target_.target) |
502 return; | 502 return; |
503 | 503 |
504 // This accounts for bubbling through nested OOPIFs. A gesture scroll has | 504 // This accounts for bubbling through nested OOPIFs. A gesture scroll has |
505 // been bubbled but the target has sent back a gesture scroll event ack with | 505 // been bubbled but the target has sent back a gesture scroll event ack with |
506 // unused scroll delta, and so another level of bubbling is needed. This | 506 // unused scroll delta, and so another level of bubbling is needed. This |
507 // requires a GestureScrollEnd be sent to the last view, which will no | 507 // requires a GestureScrollEnd be sent to the last view, which will no |
508 // longer be the scroll target. | 508 // longer be the scroll target. |
509 if (bubbling_gesture_scroll_target_.target) | 509 if (bubbling_gesture_scroll_target_.target) |
510 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event); | 510 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event); |
511 else | 511 else |
512 first_bubbling_scroll_target_.target = target_view; | 512 first_bubbling_scroll_target_.target = target_view; |
513 | 513 |
514 bubbling_gesture_scroll_target_.target = target_view; | 514 bubbling_gesture_scroll_target_.target = target_view; |
515 | 515 |
516 SendGestureScrollBegin(target_view, event); | 516 SendGestureScrollBegin(target_view, event); |
517 target_view->ProcessGestureEvent(event, ui::LatencyInfo()); | 517 target_view->ProcessGestureEvent(event, latency_info); |
518 } | 518 } |
519 | 519 |
520 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( | 520 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( |
521 RenderWidgetHostViewBase* view, | 521 RenderWidgetHostViewBase* view, |
522 const blink::WebGestureEvent& event) { | 522 const blink::WebGestureEvent& event) { |
523 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 523 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
524 event.type == blink::WebInputEvent::GesturePinchBegin); | 524 event.type == blink::WebInputEvent::GesturePinchBegin); |
525 blink::WebGestureEvent scroll_begin(event); | 525 blink::WebGestureEvent scroll_begin(event); |
526 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; | 526 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; |
527 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; | 527 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; |
528 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; | 528 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; |
529 scroll_begin.data.scrollBegin.deltaHintUnits = | 529 scroll_begin.data.scrollBegin.deltaHintUnits = |
530 event.data.scrollUpdate.deltaUnits; | 530 event.data.scrollUpdate.deltaUnits; |
531 view->ProcessGestureEvent(scroll_begin, ui::LatencyInfo()); | 531 view->ProcessGestureEvent( |
| 532 scroll_begin, |
| 533 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
532 } | 534 } |
533 | 535 |
534 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( | 536 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( |
535 RenderWidgetHostViewBase* view, | 537 RenderWidgetHostViewBase* view, |
536 const blink::WebGestureEvent& event) { | 538 const blink::WebGestureEvent& event) { |
537 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 539 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
538 event.type == blink::WebInputEvent::GesturePinchEnd); | 540 event.type == blink::WebInputEvent::GesturePinchEnd); |
539 blink::WebGestureEvent scroll_end(event); | 541 blink::WebGestureEvent scroll_end(event); |
540 scroll_end.type = blink::WebInputEvent::GestureScrollEnd; | 542 scroll_end.type = blink::WebInputEvent::GestureScrollEnd; |
541 scroll_end.timeStampSeconds = | 543 scroll_end.timeStampSeconds = |
542 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 544 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
543 scroll_end.data.scrollEnd.inertialPhase = | 545 scroll_end.data.scrollEnd.inertialPhase = |
544 event.data.scrollUpdate.inertialPhase; | 546 event.data.scrollUpdate.inertialPhase; |
545 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; | 547 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; |
546 view->ProcessGestureEvent(scroll_end, ui::LatencyInfo()); | 548 view->ProcessGestureEvent( |
| 549 scroll_end, |
| 550 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
547 } | 551 } |
548 | 552 |
549 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( | 553 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( |
550 RenderWidgetHostViewBase* target_view) { | 554 RenderWidgetHostViewBase* target_view) { |
551 DCHECK(target_view); | 555 DCHECK(target_view); |
552 if (target_view == first_bubbling_scroll_target_.target) { | 556 if (target_view == first_bubbling_scroll_target_.target) { |
553 first_bubbling_scroll_target_.target = nullptr; | 557 first_bubbling_scroll_target_.target = nullptr; |
554 bubbling_gesture_scroll_target_.target = nullptr; | 558 bubbling_gesture_scroll_target_.target = nullptr; |
555 } | 559 } |
556 } | 560 } |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 if (!touchpad_gesture_target_.target) | 711 if (!touchpad_gesture_target_.target) |
708 return; | 712 return; |
709 | 713 |
710 // TODO(mohsen): Add tests to check event location. | 714 // TODO(mohsen): Add tests to check event location. |
711 event->x += touchpad_gesture_target_.delta.x(); | 715 event->x += touchpad_gesture_target_.delta.x(); |
712 event->y += touchpad_gesture_target_.delta.y(); | 716 event->y += touchpad_gesture_target_.delta.y(); |
713 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); | 717 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); |
714 } | 718 } |
715 | 719 |
716 } // namespace content | 720 } // namespace content |
OLD | NEW |