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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 // it likely means the RenderWidgetHostView has been destroyed but its | 163 // it likely means the RenderWidgetHostView has been destroyed but its |
163 // parent frame has not sent a new compositor frame since that happened. | 164 // parent frame has not sent a new compositor frame since that happened. |
164 if (iter == owner_map_.end()) | 165 if (iter == owner_map_.end()) |
165 return root_view; | 166 return root_view; |
166 | 167 |
167 return iter->second; | 168 return iter->second; |
168 } | 169 } |
169 | 170 |
170 void RenderWidgetHostInputEventRouter::RouteMouseEvent( | 171 void RenderWidgetHostInputEventRouter::RouteMouseEvent( |
171 RenderWidgetHostViewBase* root_view, | 172 RenderWidgetHostViewBase* root_view, |
172 blink::WebMouseEvent* event) { | 173 blink::WebMouseEvent* event, |
| 174 const ui::LatencyInfo& latency) { |
173 RenderWidgetHostViewBase* target; | 175 RenderWidgetHostViewBase* target; |
174 gfx::Point transformed_point; | 176 gfx::Point transformed_point; |
175 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | | 177 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | |
176 blink::WebInputEvent::MiddleButtonDown | | 178 blink::WebInputEvent::MiddleButtonDown | |
177 blink::WebInputEvent::RightButtonDown; | 179 blink::WebInputEvent::RightButtonDown; |
178 if (mouse_capture_target_.target && | 180 if (mouse_capture_target_.target && |
179 event->type != blink::WebInputEvent::MouseDown && | 181 event->type != blink::WebInputEvent::MouseDown && |
180 (event->type == blink::WebInputEvent::MouseUp || | 182 (event->type == blink::WebInputEvent::MouseUp || |
181 event->modifiers & mouse_button_modifiers)) { | 183 event->modifiers & mouse_button_modifiers)) { |
182 target = mouse_capture_target_.target; | 184 target = mouse_capture_target_.target; |
(...skipping 24 matching lines...) Expand all Loading... |
207 // SendMouseEnterOrLeaveEvents is called with the original event | 209 // SendMouseEnterOrLeaveEvents is called with the original event |
208 // coordinates, which are transformed independently for each view that will | 210 // coordinates, which are transformed independently for each view that will |
209 // receive an event. | 211 // receive an event. |
210 if ((event->type == blink::WebInputEvent::MouseLeave || | 212 if ((event->type == blink::WebInputEvent::MouseLeave || |
211 event->type == blink::WebInputEvent::MouseMove) && | 213 event->type == blink::WebInputEvent::MouseMove) && |
212 target != last_mouse_move_target_) | 214 target != last_mouse_move_target_) |
213 SendMouseEnterOrLeaveEvents(event, target, root_view); | 215 SendMouseEnterOrLeaveEvents(event, target, root_view); |
214 | 216 |
215 event->x = transformed_point.x(); | 217 event->x = transformed_point.x(); |
216 event->y = transformed_point.y(); | 218 event->y = transformed_point.y(); |
217 // TODO(wjmaclean): Initialize latency info correctly for OOPIFs. | 219 target->ProcessMouseEvent(*event, latency); |
218 // https://crbug.com/613628 | |
219 ui::LatencyInfo latency_info; | |
220 target->ProcessMouseEvent(*event, latency_info); | |
221 } | 220 } |
222 | 221 |
223 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( | 222 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( |
224 RenderWidgetHostViewBase* root_view, | 223 RenderWidgetHostViewBase* root_view, |
225 blink::WebMouseWheelEvent* event) { | 224 blink::WebMouseWheelEvent* event, |
| 225 const ui::LatencyInfo& latency) { |
226 gfx::Point transformed_point; | 226 gfx::Point transformed_point; |
227 RenderWidgetHostViewBase* target = FindEventTarget( | 227 RenderWidgetHostViewBase* target = FindEventTarget( |
228 root_view, gfx::Point(event->x, event->y), &transformed_point); | 228 root_view, gfx::Point(event->x, event->y), &transformed_point); |
229 if (!target) | 229 if (!target) |
230 return; | 230 return; |
231 | 231 |
232 event->x = transformed_point.x(); | 232 event->x = transformed_point.x(); |
233 event->y = transformed_point.y(); | 233 event->y = transformed_point.y(); |
234 // TODO(wjmaclean): Initialize latency info correctly for OOPIFs. | 234 target->ProcessMouseWheelEvent(*event, latency); |
235 // https://crbug.com/613628 | |
236 ui::LatencyInfo latency_info; | |
237 target->ProcessMouseWheelEvent(*event, latency_info); | |
238 } | 235 } |
239 | 236 |
240 void RenderWidgetHostInputEventRouter::RouteGestureEvent( | 237 void RenderWidgetHostInputEventRouter::RouteGestureEvent( |
241 RenderWidgetHostViewBase* root_view, | 238 RenderWidgetHostViewBase* root_view, |
242 blink::WebGestureEvent* event, | 239 blink::WebGestureEvent* event, |
243 const ui::LatencyInfo& latency) { | 240 const ui::LatencyInfo& latency) { |
244 switch (event->sourceDevice) { | 241 switch (event->sourceDevice) { |
245 case blink::WebGestureDeviceUninitialized: | 242 case blink::WebGestureDeviceUninitialized: |
246 NOTREACHED() << "Uninitialized device type is not allowed"; | 243 NOTREACHED() << "Uninitialized device type is not allowed"; |
247 break; | 244 break; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 // difficult to resolve until this is changed to do all scroll targeting, | 464 // difficult to resolve until this is changed to do all scroll targeting, |
468 // including bubbling, based on GestureScrollBegin. | 465 // including bubbling, based on GestureScrollBegin. |
469 DCHECK(target_view); | 466 DCHECK(target_view); |
470 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 467 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
471 event.type == blink::WebInputEvent::GestureScrollEnd); | 468 event.type == blink::WebInputEvent::GestureScrollEnd); |
472 // DCHECK_XNOR the current and original bubble targets. Both should be set | 469 // DCHECK_XNOR the current and original bubble targets. Both should be set |
473 // if a bubbling gesture scroll is in progress. | 470 // if a bubbling gesture scroll is in progress. |
474 DCHECK(!first_bubbling_scroll_target_.target == | 471 DCHECK(!first_bubbling_scroll_target_.target == |
475 !bubbling_gesture_scroll_target_.target); | 472 !bubbling_gesture_scroll_target_.target); |
476 | 473 |
| 474 ui::LatencyInfo latency_info = |
| 475 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); |
| 476 |
477 // If target_view is already set up for bubbled scrolls, we forward | 477 // If target_view is already set up for bubbled scrolls, we forward |
478 // the event to the current scroll target without further consideration. | 478 // the event to the current scroll target without further consideration. |
479 if (target_view == first_bubbling_scroll_target_.target) { | 479 if (target_view == first_bubbling_scroll_target_.target) { |
480 bubbling_gesture_scroll_target_.target->ProcessGestureEvent( | 480 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, |
481 event, ui::LatencyInfo()); | 481 latency_info); |
482 if (event.type == blink::WebInputEvent::GestureScrollEnd) { | 482 if (event.type == blink::WebInputEvent::GestureScrollEnd) { |
483 first_bubbling_scroll_target_.target = nullptr; | 483 first_bubbling_scroll_target_.target = nullptr; |
484 bubbling_gesture_scroll_target_.target = nullptr; | 484 bubbling_gesture_scroll_target_.target = nullptr; |
485 } | 485 } |
486 return; | 486 return; |
487 } | 487 } |
488 | 488 |
489 // Disregard GestureScrollEnd events going to non-current targets. | 489 // Disregard GestureScrollEnd events going to non-current targets. |
490 // These should only happen on ACKs of synthesized GSE events that are | 490 // These should only happen on ACKs of synthesized GSE events that are |
491 // sent from SendGestureScrollEnd calls, and are not relevant here. | 491 // sent from SendGestureScrollEnd calls, and are not relevant here. |
492 if (event.type == blink::WebInputEvent::GestureScrollEnd) | 492 if (event.type == blink::WebInputEvent::GestureScrollEnd) |
493 return; | 493 return; |
494 | 494 |
495 // This is a special case to catch races where multiple GestureScrollUpdates | 495 // This is a special case to catch races where multiple GestureScrollUpdates |
496 // have been sent to a renderer before the first one was ACKed, and the ACK | 496 // have been sent to a renderer before the first one was ACKed, and the ACK |
497 // caused a bubble retarget. In this case they all get forwarded. | 497 // caused a bubble retarget. In this case they all get forwarded. |
498 if (target_view == bubbling_gesture_scroll_target_.target) { | 498 if (target_view == bubbling_gesture_scroll_target_.target) { |
499 bubbling_gesture_scroll_target_.target->ProcessGestureEvent( | 499 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, |
500 event, ui::LatencyInfo()); | 500 latency_info); |
501 return; | 501 return; |
502 } | 502 } |
503 | 503 |
504 // If target_view has unrelated gesture events in progress, do | 504 // If target_view has unrelated gesture events in progress, do |
505 // not proceed. This could cause confusion between independent | 505 // not proceed. This could cause confusion between independent |
506 // scrolls. | 506 // scrolls. |
507 if (target_view == touchscreen_gesture_target_.target || | 507 if (target_view == touchscreen_gesture_target_.target || |
508 target_view == touchpad_gesture_target_.target || | 508 target_view == touchpad_gesture_target_.target || |
509 target_view == touch_target_.target) | 509 target_view == touch_target_.target) |
510 return; | 510 return; |
511 | 511 |
512 // This accounts for bubbling through nested OOPIFs. A gesture scroll has | 512 // This accounts for bubbling through nested OOPIFs. A gesture scroll has |
513 // been bubbled but the target has sent back a gesture scroll event ack with | 513 // been bubbled but the target has sent back a gesture scroll event ack with |
514 // unused scroll delta, and so another level of bubbling is needed. This | 514 // unused scroll delta, and so another level of bubbling is needed. This |
515 // requires a GestureScrollEnd be sent to the last view, which will no | 515 // requires a GestureScrollEnd be sent to the last view, which will no |
516 // longer be the scroll target. | 516 // longer be the scroll target. |
517 if (bubbling_gesture_scroll_target_.target) | 517 if (bubbling_gesture_scroll_target_.target) |
518 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event); | 518 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event); |
519 else | 519 else |
520 first_bubbling_scroll_target_.target = target_view; | 520 first_bubbling_scroll_target_.target = target_view; |
521 | 521 |
522 bubbling_gesture_scroll_target_.target = target_view; | 522 bubbling_gesture_scroll_target_.target = target_view; |
523 | 523 |
524 SendGestureScrollBegin(target_view, event); | 524 SendGestureScrollBegin(target_view, event); |
525 target_view->ProcessGestureEvent(event, ui::LatencyInfo()); | 525 target_view->ProcessGestureEvent(event, latency_info); |
526 } | 526 } |
527 | 527 |
528 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( | 528 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( |
529 RenderWidgetHostViewBase* view, | 529 RenderWidgetHostViewBase* view, |
530 const blink::WebGestureEvent& event) { | 530 const blink::WebGestureEvent& event) { |
531 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 531 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
532 event.type == blink::WebInputEvent::GesturePinchBegin); | 532 event.type == blink::WebInputEvent::GesturePinchBegin); |
533 blink::WebGestureEvent scroll_begin(event); | 533 blink::WebGestureEvent scroll_begin(event); |
534 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; | 534 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; |
535 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; | 535 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; |
536 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; | 536 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; |
537 scroll_begin.data.scrollBegin.deltaHintUnits = | 537 scroll_begin.data.scrollBegin.deltaHintUnits = |
538 event.data.scrollUpdate.deltaUnits; | 538 event.data.scrollUpdate.deltaUnits; |
539 view->ProcessGestureEvent(scroll_begin, ui::LatencyInfo()); | 539 view->ProcessGestureEvent( |
| 540 scroll_begin, |
| 541 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
540 } | 542 } |
541 | 543 |
542 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( | 544 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( |
543 RenderWidgetHostViewBase* view, | 545 RenderWidgetHostViewBase* view, |
544 const blink::WebGestureEvent& event) { | 546 const blink::WebGestureEvent& event) { |
545 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 547 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || |
546 event.type == blink::WebInputEvent::GesturePinchEnd); | 548 event.type == blink::WebInputEvent::GesturePinchEnd); |
547 blink::WebGestureEvent scroll_end(event); | 549 blink::WebGestureEvent scroll_end(event); |
548 scroll_end.type = blink::WebInputEvent::GestureScrollEnd; | 550 scroll_end.type = blink::WebInputEvent::GestureScrollEnd; |
549 scroll_end.timeStampSeconds = | 551 scroll_end.timeStampSeconds = |
550 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 552 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
551 scroll_end.data.scrollEnd.inertialPhase = | 553 scroll_end.data.scrollEnd.inertialPhase = |
552 event.data.scrollUpdate.inertialPhase; | 554 event.data.scrollUpdate.inertialPhase; |
553 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; | 555 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; |
554 view->ProcessGestureEvent(scroll_end, ui::LatencyInfo()); | 556 view->ProcessGestureEvent( |
| 557 scroll_end, |
| 558 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
555 } | 559 } |
556 | 560 |
557 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( | 561 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( |
558 RenderWidgetHostViewBase* target_view) { | 562 RenderWidgetHostViewBase* target_view) { |
559 DCHECK(target_view); | 563 DCHECK(target_view); |
560 if (target_view == first_bubbling_scroll_target_.target) { | 564 if (target_view == first_bubbling_scroll_target_.target) { |
561 first_bubbling_scroll_target_.target = nullptr; | 565 first_bubbling_scroll_target_.target = nullptr; |
562 bubbling_gesture_scroll_target_.target = nullptr; | 566 bubbling_gesture_scroll_target_.target = nullptr; |
563 } | 567 } |
564 } | 568 } |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 if (!touchpad_gesture_target_.target) | 730 if (!touchpad_gesture_target_.target) |
727 return; | 731 return; |
728 | 732 |
729 // TODO(mohsen): Add tests to check event location. | 733 // TODO(mohsen): Add tests to check event location. |
730 event->x += touchpad_gesture_target_.delta.x(); | 734 event->x += touchpad_gesture_target_.delta.x(); |
731 event->y += touchpad_gesture_target_.delta.y(); | 735 event->y += touchpad_gesture_target_.delta.y(); |
732 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); | 736 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); |
733 } | 737 } |
734 | 738 |
735 } // namespace content | 739 } // namespace content |
OLD | NEW |