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

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

Issue 2317253005: SourceEventType added to LatencyInfo (Closed)
Patch Set: Changed the patch to only contain source event type plumbing. 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 "base/metrics/histogram_macros.h" 7 #include "base/metrics/histogram_macros.h"
8 #include "cc/quads/surface_draw_quad.h" 8 #include "cc/quads/surface_draw_quad.h"
9 #include "cc/surfaces/surface_id_allocator.h" 9 #include "cc/surfaces/surface_id_allocator.h"
10 #include "cc/surfaces/surface_manager.h" 10 #include "cc/surfaces/surface_manager.h"
11 #include "content/browser/renderer_host/render_widget_host_impl.h" 11 #include "content/browser/renderer_host/render_widget_host_impl.h"
12 #include "content/browser/renderer_host/render_widget_host_view_base.h" 12 #include "content/browser/renderer_host/render_widget_host_view_base.h"
13 #include "content/common/frame_messages.h" 13 #include "content/common/frame_messages.h"
14 #include "third_party/WebKit/public/web/WebInputEvent.h" 14 #include "third_party/WebKit/public/web/WebInputEvent.h"
15 #include "ui/events/blink/web_input_event_traits.h"
15 16
16 namespace { 17 namespace {
17 18
18 void TransformEventTouchPositions(blink::WebTouchEvent* event, 19 void TransformEventTouchPositions(blink::WebTouchEvent* event,
19 const gfx::Vector2d& delta) { 20 const gfx::Vector2d& delta) {
20 for (unsigned i = 0; i < event->touchesLength; ++i) { 21 for (unsigned i = 0; i < event->touchesLength; ++i) {
21 event->touches[i].position.x += delta.x(); 22 event->touches[i].position.x += delta.x();
22 event->touches[i].position.y += delta.y(); 23 event->touches[i].position.y += delta.y();
23 } 24 }
24 } 25 }
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 // it likely means the RenderWidgetHostView has been destroyed but its 134 // it likely means the RenderWidgetHostView has been destroyed but its
134 // parent frame has not sent a new compositor frame since that happened. 135 // parent frame has not sent a new compositor frame since that happened.
135 if (iter == owner_map_.end()) 136 if (iter == owner_map_.end())
136 return root_view; 137 return root_view;
137 138
138 return iter->second; 139 return iter->second;
139 } 140 }
140 141
141 void RenderWidgetHostInputEventRouter::RouteMouseEvent( 142 void RenderWidgetHostInputEventRouter::RouteMouseEvent(
142 RenderWidgetHostViewBase* root_view, 143 RenderWidgetHostViewBase* root_view,
143 blink::WebMouseEvent* event) { 144 blink::WebMouseEvent* event,
145 const ui::LatencyInfo& latency) {
144 gfx::Point transformed_point; 146 gfx::Point transformed_point;
145 RenderWidgetHostViewBase* target = FindEventTarget( 147 RenderWidgetHostViewBase* target = FindEventTarget(
146 root_view, gfx::Point(event->x, event->y), &transformed_point); 148 root_view, gfx::Point(event->x, event->y), &transformed_point);
147 if (!target) 149 if (!target)
148 return; 150 return;
149 151
150 event->x = transformed_point.x(); 152 event->x = transformed_point.x();
151 event->y = transformed_point.y(); 153 event->y = transformed_point.y();
152 // TODO(wjmaclean): Initialize latency info correctly for OOPIFs. 154 target->ProcessMouseEvent(*event, latency);
153 // https://crbug.com/613628
154 ui::LatencyInfo latency_info;
155 target->ProcessMouseEvent(*event, latency_info);
156 } 155 }
157 156
158 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( 157 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent(
159 RenderWidgetHostViewBase* root_view, 158 RenderWidgetHostViewBase* root_view,
160 blink::WebMouseWheelEvent* event) { 159 blink::WebMouseWheelEvent* event,
160 const ui::LatencyInfo& latency) {
161 gfx::Point transformed_point; 161 gfx::Point transformed_point;
162 RenderWidgetHostViewBase* target = FindEventTarget( 162 RenderWidgetHostViewBase* target = FindEventTarget(
163 root_view, gfx::Point(event->x, event->y), &transformed_point); 163 root_view, gfx::Point(event->x, event->y), &transformed_point);
164 if (!target) 164 if (!target)
165 return; 165 return;
166 166
167 event->x = transformed_point.x(); 167 event->x = transformed_point.x();
168 event->y = transformed_point.y(); 168 event->y = transformed_point.y();
169 // TODO(wjmaclean): Initialize latency info correctly for OOPIFs. 169 target->ProcessMouseWheelEvent(*event, latency);
170 // https://crbug.com/613628
171 ui::LatencyInfo latency_info;
172 target->ProcessMouseWheelEvent(*event, latency_info);
173 } 170 }
174 171
175 void RenderWidgetHostInputEventRouter::RouteGestureEvent( 172 void RenderWidgetHostInputEventRouter::RouteGestureEvent(
176 RenderWidgetHostViewBase* root_view, 173 RenderWidgetHostViewBase* root_view,
177 blink::WebGestureEvent* event, 174 blink::WebGestureEvent* event,
178 const ui::LatencyInfo& latency) { 175 const ui::LatencyInfo& latency) {
179 switch (event->sourceDevice) { 176 switch (event->sourceDevice) {
180 case blink::WebGestureDeviceUninitialized: 177 case blink::WebGestureDeviceUninitialized:
181 NOTREACHED() << "Uninitialized device type is not allowed"; 178 NOTREACHED() << "Uninitialized device type is not allowed";
182 break; 179 break;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 // difficult to resolve until this is changed to do all scroll targeting, 292 // difficult to resolve until this is changed to do all scroll targeting,
296 // including bubbling, based on GestureScrollBegin. 293 // including bubbling, based on GestureScrollBegin.
297 DCHECK(target_view); 294 DCHECK(target_view);
298 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || 295 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate ||
299 event.type == blink::WebInputEvent::GestureScrollEnd); 296 event.type == blink::WebInputEvent::GestureScrollEnd);
300 // DCHECK_XNOR the current and original bubble targets. Both should be set 297 // DCHECK_XNOR the current and original bubble targets. Both should be set
301 // if a bubbling gesture scroll is in progress. 298 // if a bubbling gesture scroll is in progress.
302 DCHECK(!first_bubbling_scroll_target_.target == 299 DCHECK(!first_bubbling_scroll_target_.target ==
303 !bubbling_gesture_scroll_target_.target); 300 !bubbling_gesture_scroll_target_.target);
304 301
302 ui::LatencyInfo latency_info =
303 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
304
305 // If target_view is already set up for bubbled scrolls, we forward 305 // If target_view is already set up for bubbled scrolls, we forward
306 // the event to the current scroll target without further consideration. 306 // the event to the current scroll target without further consideration.
307 if (target_view == first_bubbling_scroll_target_.target) { 307 if (target_view == first_bubbling_scroll_target_.target) {
308 bubbling_gesture_scroll_target_.target->ProcessGestureEvent( 308 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event,
309 event, ui::LatencyInfo()); 309 latency_info);
310 if (event.type == blink::WebInputEvent::GestureScrollEnd) { 310 if (event.type == blink::WebInputEvent::GestureScrollEnd) {
311 first_bubbling_scroll_target_.target = nullptr; 311 first_bubbling_scroll_target_.target = nullptr;
312 bubbling_gesture_scroll_target_.target = nullptr; 312 bubbling_gesture_scroll_target_.target = nullptr;
313 } 313 }
314 return; 314 return;
315 } 315 }
316 316
317 // Disregard GestureScrollEnd events going to non-current targets. 317 // Disregard GestureScrollEnd events going to non-current targets.
318 // These should only happen on ACKs of synthesized GSE events that are 318 // These should only happen on ACKs of synthesized GSE events that are
319 // sent from SendGestureScrollEnd calls, and are not relevant here. 319 // sent from SendGestureScrollEnd calls, and are not relevant here.
320 if (event.type == blink::WebInputEvent::GestureScrollEnd) 320 if (event.type == blink::WebInputEvent::GestureScrollEnd)
321 return; 321 return;
322 322
323 // This is a special case to catch races where multiple GestureScrollUpdates 323 // This is a special case to catch races where multiple GestureScrollUpdates
324 // have been sent to a renderer before the first one was ACKed, and the ACK 324 // have been sent to a renderer before the first one was ACKed, and the ACK
325 // caused a bubble retarget. In this case they all get forwarded. 325 // caused a bubble retarget. In this case they all get forwarded.
326 if (target_view == bubbling_gesture_scroll_target_.target) { 326 if (target_view == bubbling_gesture_scroll_target_.target) {
327 bubbling_gesture_scroll_target_.target->ProcessGestureEvent( 327 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event,
328 event, ui::LatencyInfo()); 328 latency_info);
329 return; 329 return;
330 } 330 }
331 331
332 // If target_view has unrelated gesture events in progress, do 332 // If target_view has unrelated gesture events in progress, do
333 // not proceed. This could cause confusion between independent 333 // not proceed. This could cause confusion between independent
334 // scrolls. 334 // scrolls.
335 if (target_view == touchscreen_gesture_target_.target || 335 if (target_view == touchscreen_gesture_target_.target ||
336 target_view == touchpad_gesture_target_.target || 336 target_view == touchpad_gesture_target_.target ||
337 target_view == touch_target_.target) 337 target_view == touch_target_.target)
338 return; 338 return;
339 339
340 // This accounts for bubbling through nested OOPIFs. A gesture scroll has 340 // This accounts for bubbling through nested OOPIFs. A gesture scroll has
341 // been bubbled but the target has sent back a gesture scroll event ack with 341 // been bubbled but the target has sent back a gesture scroll event ack with
342 // unused scroll delta, and so another level of bubbling is needed. This 342 // unused scroll delta, and so another level of bubbling is needed. This
343 // requires a GestureScrollEnd be sent to the last view, which will no 343 // requires a GestureScrollEnd be sent to the last view, which will no
344 // longer be the scroll target. 344 // longer be the scroll target.
345 if (bubbling_gesture_scroll_target_.target) 345 if (bubbling_gesture_scroll_target_.target)
346 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event); 346 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event);
347 else 347 else
348 first_bubbling_scroll_target_.target = target_view; 348 first_bubbling_scroll_target_.target = target_view;
349 349
350 bubbling_gesture_scroll_target_.target = target_view; 350 bubbling_gesture_scroll_target_.target = target_view;
351 351
352 SendGestureScrollBegin(target_view, event); 352 SendGestureScrollBegin(target_view, event);
353 target_view->ProcessGestureEvent(event, ui::LatencyInfo()); 353 target_view->ProcessGestureEvent(event, latency_info);
354 } 354 }
355 355
356 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( 356 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin(
357 RenderWidgetHostViewBase* view, 357 RenderWidgetHostViewBase* view,
358 const blink::WebGestureEvent& event) { 358 const blink::WebGestureEvent& event) {
359 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || 359 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate ||
360 event.type == blink::WebInputEvent::GesturePinchBegin); 360 event.type == blink::WebInputEvent::GesturePinchBegin);
361 blink::WebGestureEvent scroll_begin(event); 361 blink::WebGestureEvent scroll_begin(event);
362 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; 362 scroll_begin.type = blink::WebInputEvent::GestureScrollBegin;
363 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; 363 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX;
364 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; 364 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY;
365 scroll_begin.data.scrollBegin.deltaHintUnits = 365 scroll_begin.data.scrollBegin.deltaHintUnits =
366 event.data.scrollUpdate.deltaUnits; 366 event.data.scrollUpdate.deltaUnits;
367 view->ProcessGestureEvent(scroll_begin, ui::LatencyInfo()); 367 view->ProcessGestureEvent(
368 scroll_begin,
369 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event));
368 } 370 }
369 371
370 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( 372 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd(
371 RenderWidgetHostViewBase* view, 373 RenderWidgetHostViewBase* view,
372 const blink::WebGestureEvent& event) { 374 const blink::WebGestureEvent& event) {
373 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || 375 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate ||
374 event.type == blink::WebInputEvent::GesturePinchEnd); 376 event.type == blink::WebInputEvent::GesturePinchEnd);
375 blink::WebGestureEvent scroll_end(event); 377 blink::WebGestureEvent scroll_end(event);
376 scroll_end.type = blink::WebInputEvent::GestureScrollEnd; 378 scroll_end.type = blink::WebInputEvent::GestureScrollEnd;
377 scroll_end.timeStampSeconds = 379 scroll_end.timeStampSeconds =
378 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 380 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
379 scroll_end.data.scrollEnd.inertialPhase = 381 scroll_end.data.scrollEnd.inertialPhase =
380 event.data.scrollUpdate.inertialPhase; 382 event.data.scrollUpdate.inertialPhase;
381 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; 383 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits;
382 view->ProcessGestureEvent(scroll_end, ui::LatencyInfo()); 384 view->ProcessGestureEvent(
385 scroll_end,
386 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event));
383 } 387 }
384 388
385 void RenderWidgetHostInputEventRouter::CancelScrollBubbling( 389 void RenderWidgetHostInputEventRouter::CancelScrollBubbling(
386 RenderWidgetHostViewBase* target_view) { 390 RenderWidgetHostViewBase* target_view) {
387 DCHECK(target_view); 391 DCHECK(target_view);
388 if (target_view == first_bubbling_scroll_target_.target) { 392 if (target_view == first_bubbling_scroll_target_.target) {
389 first_bubbling_scroll_target_.target = nullptr; 393 first_bubbling_scroll_target_.target = nullptr;
390 bubbling_gesture_scroll_target_.target = nullptr; 394 bubbling_gesture_scroll_target_.target = nullptr;
391 } 395 }
392 } 396 }
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 if (!touchpad_gesture_target_.target) 547 if (!touchpad_gesture_target_.target)
544 return; 548 return;
545 549
546 // TODO(mohsen): Add tests to check event location. 550 // TODO(mohsen): Add tests to check event location.
547 event->x += touchpad_gesture_target_.delta.x(); 551 event->x += touchpad_gesture_target_.delta.x();
548 event->y += touchpad_gesture_target_.delta.y(); 552 event->y += touchpad_gesture_target_.delta.y();
549 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); 553 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency);
550 } 554 }
551 555
552 } // namespace content 556 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698