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