| 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 |