Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(866)

Side by Side Diff: content/browser/renderer_host/render_widget_host_input_event_router.cc

Issue 2317253005: SourceEventType added to LatencyInfo (Closed)
Patch Set: Added a fake return to the end of EventTypeToLatencySourceEventType, for compilers that don't know … Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698