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 "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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |