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