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

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

Issue 2393783005: re-land the "SourceEventType added to LatencyInfo." (Closed)
Patch Set: Created 4 years, 2 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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698