| 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "cc/quads/surface_draw_quad.h" | 10 #include "cc/quads/surface_draw_quad.h" |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 gfx::Point transformed_point; | 175 gfx::Point transformed_point; |
| 176 | 176 |
| 177 // When the mouse is locked, directly route the events to the widget that | 177 // When the mouse is locked, directly route the events to the widget that |
| 178 // holds the lock and return. | 178 // holds the lock and return. |
| 179 if (root_view->IsMouseLocked()) { | 179 if (root_view->IsMouseLocked()) { |
| 180 target = RenderWidgetHostImpl::From(root_view->GetRenderWidgetHost()) | 180 target = RenderWidgetHostImpl::From(root_view->GetRenderWidgetHost()) |
| 181 ->delegate() | 181 ->delegate() |
| 182 ->GetMouseLockWidget() | 182 ->GetMouseLockWidget() |
| 183 ->GetView(); | 183 ->GetView(); |
| 184 if (!root_view->TransformPointToCoordSpaceForView( | 184 if (!root_view->TransformPointToCoordSpaceForView( |
| 185 gfx::Point(event->x, event->y), target, &transformed_point)) | 185 gfx::Point(event->position.x, event->position.y), target, |
| 186 &transformed_point)) |
| 186 return; | 187 return; |
| 187 | 188 |
| 188 event->x = transformed_point.x(); | 189 event->position.x = transformed_point.x(); |
| 189 event->y = transformed_point.y(); | 190 event->position.y = transformed_point.y(); |
| 190 target->ProcessMouseEvent(*event, latency); | 191 target->ProcessMouseEvent(*event, latency); |
| 191 return; | 192 return; |
| 192 } | 193 } |
| 193 | 194 |
| 194 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | | 195 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | |
| 195 blink::WebInputEvent::MiddleButtonDown | | 196 blink::WebInputEvent::MiddleButtonDown | |
| 196 blink::WebInputEvent::RightButtonDown; | 197 blink::WebInputEvent::RightButtonDown; |
| 197 if (mouse_capture_target_.target && | 198 if (mouse_capture_target_.target && |
| 198 event->type() != blink::WebInputEvent::MouseDown && | 199 event->type() != blink::WebInputEvent::MouseDown && |
| 199 (event->type() == blink::WebInputEvent::MouseUp || | 200 (event->type() == blink::WebInputEvent::MouseUp || |
| 200 event->modifiers() & mouse_button_modifiers)) { | 201 event->modifiers() & mouse_button_modifiers)) { |
| 201 target = mouse_capture_target_.target; | 202 target = mouse_capture_target_.target; |
| 202 if (!root_view->TransformPointToCoordSpaceForView( | 203 if (!root_view->TransformPointToCoordSpaceForView( |
| 203 gfx::Point(event->x, event->y), target, &transformed_point)) | 204 gfx::Point(event->position.x, event->position.y), target, |
| 205 &transformed_point)) |
| 204 return; | 206 return; |
| 205 if (event->type() == blink::WebInputEvent::MouseUp) | 207 if (event->type() == blink::WebInputEvent::MouseUp) |
| 206 mouse_capture_target_.target = nullptr; | 208 mouse_capture_target_.target = nullptr; |
| 207 } else { | 209 } else { |
| 208 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), | 210 target = FindEventTarget(root_view, |
| 211 gfx::Point(event->position.x, event->position.y), |
| 209 &transformed_point); | 212 &transformed_point); |
| 210 } | 213 } |
| 211 | 214 |
| 212 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse | 215 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse |
| 213 // events, so they have to go by the double-hop forwarding path through | 216 // events, so they have to go by the double-hop forwarding path through |
| 214 // the embedding renderer and then BrowserPluginGuest. | 217 // the embedding renderer and then BrowserPluginGuest. |
| 215 if (target && target->IsRenderWidgetHostViewGuest()) { | 218 if (target && target->IsRenderWidgetHostViewGuest()) { |
| 216 ui::LatencyInfo latency_info; | 219 ui::LatencyInfo latency_info; |
| 217 RenderWidgetHostViewBase* owner_view = | 220 RenderWidgetHostViewBase* owner_view = |
| 218 static_cast<RenderWidgetHostViewGuest*>(target) | 221 static_cast<RenderWidgetHostViewGuest*>(target) |
| 219 ->GetOwnerRenderWidgetHostView(); | 222 ->GetOwnerRenderWidgetHostView(); |
| 220 // In case there is nested RenderWidgetHostViewGuests (i.e., PDF inside | 223 // In case there is nested RenderWidgetHostViewGuests (i.e., PDF inside |
| 221 // <webview>), we will need the owner view of the top-most guest for input | 224 // <webview>), we will need the owner view of the top-most guest for input |
| 222 // routing. | 225 // routing. |
| 223 while (owner_view->IsRenderWidgetHostViewGuest()) { | 226 while (owner_view->IsRenderWidgetHostViewGuest()) { |
| 224 owner_view = static_cast<RenderWidgetHostViewGuest*>(owner_view) | 227 owner_view = static_cast<RenderWidgetHostViewGuest*>(owner_view) |
| 225 ->GetOwnerRenderWidgetHostView(); | 228 ->GetOwnerRenderWidgetHostView(); |
| 226 } | 229 } |
| 227 | 230 |
| 228 if (owner_view != root_view) { | 231 if (owner_view != root_view) { |
| 229 // This happens when the view is embedded inside a cross-process frame | 232 // This happens when the view is embedded inside a cross-process frame |
| 230 // (i.e., owner view is a RenderWidgetHostViewChildFrame). | 233 // (i.e., owner view is a RenderWidgetHostViewChildFrame). |
| 231 gfx::Point owner_point; | 234 gfx::Point owner_point; |
| 232 if (!root_view->TransformPointToCoordSpaceForView( | 235 if (!root_view->TransformPointToCoordSpaceForView( |
| 233 gfx::Point(event->x, event->y), owner_view, &owner_point)) { | 236 gfx::Point(event->position.x, event->position.y), owner_view, |
| 237 &owner_point)) { |
| 234 return; | 238 return; |
| 235 } | 239 } |
| 236 event->x = owner_point.x(); | 240 event->position.x = owner_point.x(); |
| 237 event->y = owner_point.y(); | 241 event->position.y = owner_point.y(); |
| 238 } | 242 } |
| 239 owner_view->ProcessMouseEvent(*event, latency_info); | 243 owner_view->ProcessMouseEvent(*event, latency_info); |
| 240 return; | 244 return; |
| 241 } | 245 } |
| 242 | 246 |
| 243 if (event->type() == blink::WebInputEvent::MouseDown) | 247 if (event->type() == blink::WebInputEvent::MouseDown) |
| 244 mouse_capture_target_.target = target; | 248 mouse_capture_target_.target = target; |
| 245 | 249 |
| 246 if (!target) | 250 if (!target) |
| 247 return; | 251 return; |
| 248 | 252 |
| 249 // SendMouseEnterOrLeaveEvents is called with the original event | 253 // SendMouseEnterOrLeaveEvents is called with the original event |
| 250 // coordinates, which are transformed independently for each view that will | 254 // coordinates, which are transformed independently for each view that will |
| 251 // receive an event. | 255 // receive an event. |
| 252 if ((event->type() == blink::WebInputEvent::MouseLeave || | 256 if ((event->type() == blink::WebInputEvent::MouseLeave || |
| 253 event->type() == blink::WebInputEvent::MouseMove) && | 257 event->type() == blink::WebInputEvent::MouseMove) && |
| 254 target != last_mouse_move_target_) | 258 target != last_mouse_move_target_) |
| 255 SendMouseEnterOrLeaveEvents(event, target, root_view); | 259 SendMouseEnterOrLeaveEvents(event, target, root_view); |
| 256 | 260 |
| 257 event->x = transformed_point.x(); | 261 event->position.x = transformed_point.x(); |
| 258 event->y = transformed_point.y(); | 262 event->position.y = transformed_point.y(); |
| 259 target->ProcessMouseEvent(*event, latency); | 263 target->ProcessMouseEvent(*event, latency); |
| 260 } | 264 } |
| 261 | 265 |
| 262 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( | 266 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( |
| 263 RenderWidgetHostViewBase* root_view, | 267 RenderWidgetHostViewBase* root_view, |
| 264 blink::WebMouseWheelEvent* event, | 268 blink::WebMouseWheelEvent* event, |
| 265 const ui::LatencyInfo& latency) { | 269 const ui::LatencyInfo& latency) { |
| 266 RenderWidgetHostViewBase* target = nullptr; | 270 RenderWidgetHostViewBase* target = nullptr; |
| 267 gfx::Point transformed_point; | 271 gfx::Point transformed_point; |
| 268 | 272 |
| 269 if (root_view->IsMouseLocked()) { | 273 if (root_view->IsMouseLocked()) { |
| 270 target = RenderWidgetHostImpl::From(root_view->GetRenderWidgetHost()) | 274 target = RenderWidgetHostImpl::From(root_view->GetRenderWidgetHost()) |
| 271 ->delegate() | 275 ->delegate() |
| 272 ->GetMouseLockWidget() | 276 ->GetMouseLockWidget() |
| 273 ->GetView(); | 277 ->GetView(); |
| 274 if (!root_view->TransformPointToCoordSpaceForView( | 278 if (!root_view->TransformPointToCoordSpaceForView( |
| 275 gfx::Point(event->x, event->y), target, &transformed_point)) | 279 gfx::Point(event->position.x, event->position.y), target, |
| 280 &transformed_point)) |
| 276 return; | 281 return; |
| 277 } else { | 282 } else { |
| 278 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), | 283 target = FindEventTarget(root_view, |
| 284 gfx::Point(event->position.x, event->position.y), |
| 279 &transformed_point); | 285 &transformed_point); |
| 280 } | 286 } |
| 281 | 287 |
| 282 if (!target) | 288 if (!target) |
| 283 return; | 289 return; |
| 284 | 290 |
| 285 event->x = transformed_point.x(); | 291 event->position.x = transformed_point.x(); |
| 286 event->y = transformed_point.y(); | 292 event->position.y = transformed_point.y(); |
| 287 target->ProcessMouseWheelEvent(*event, latency); | 293 target->ProcessMouseWheelEvent(*event, latency); |
| 288 } | 294 } |
| 289 | 295 |
| 290 void RenderWidgetHostInputEventRouter::RouteGestureEvent( | 296 void RenderWidgetHostInputEventRouter::RouteGestureEvent( |
| 291 RenderWidgetHostViewBase* root_view, | 297 RenderWidgetHostViewBase* root_view, |
| 292 blink::WebGestureEvent* event, | 298 blink::WebGestureEvent* event, |
| 293 const ui::LatencyInfo& latency) { | 299 const ui::LatencyInfo& latency) { |
| 294 switch (event->sourceDevice) { | 300 switch (event->sourceDevice) { |
| 295 case blink::WebGestureDeviceUninitialized: | 301 case blink::WebGestureDeviceUninitialized: |
| 296 NOTREACHED() << "Uninitialized device type is not allowed"; | 302 NOTREACHED() << "Uninitialized device type is not allowed"; |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 gfx::Point transformed_point; | 492 gfx::Point transformed_point; |
| 487 // Send MouseLeaves. | 493 // Send MouseLeaves. |
| 488 for (auto* view : exited_views) { | 494 for (auto* view : exited_views) { |
| 489 blink::WebMouseEvent mouse_leave(*event); | 495 blink::WebMouseEvent mouse_leave(*event); |
| 490 mouse_leave.setType(blink::WebInputEvent::MouseLeave); | 496 mouse_leave.setType(blink::WebInputEvent::MouseLeave); |
| 491 // There is a chance of a race if the last target has recently created a | 497 // There is a chance of a race if the last target has recently created a |
| 492 // new compositor surface. The SurfaceID for that might not have | 498 // new compositor surface. The SurfaceID for that might not have |
| 493 // propagated to its embedding surface, which makes it impossible to | 499 // propagated to its embedding surface, which makes it impossible to |
| 494 // compute the transformation for it | 500 // compute the transformation for it |
| 495 if (!root_view->TransformPointToCoordSpaceForView( | 501 if (!root_view->TransformPointToCoordSpaceForView( |
| 496 gfx::Point(event->x, event->y), view, &transformed_point)) | 502 gfx::Point(event->position.x, event->position.y), view, |
| 503 &transformed_point)) |
| 497 transformed_point = gfx::Point(); | 504 transformed_point = gfx::Point(); |
| 498 mouse_leave.x = transformed_point.x(); | 505 mouse_leave.position.x = transformed_point.x(); |
| 499 mouse_leave.y = transformed_point.y(); | 506 mouse_leave.position.y = transformed_point.y(); |
| 500 view->ProcessMouseEvent(mouse_leave, ui::LatencyInfo()); | 507 view->ProcessMouseEvent(mouse_leave, ui::LatencyInfo()); |
| 501 } | 508 } |
| 502 | 509 |
| 503 // The ancestor might need to trigger MouseOut handlers. | 510 // The ancestor might need to trigger MouseOut handlers. |
| 504 if (common_ancestor && common_ancestor != target) { | 511 if (common_ancestor && common_ancestor != target) { |
| 505 blink::WebMouseEvent mouse_move(*event); | 512 blink::WebMouseEvent mouse_move(*event); |
| 506 mouse_move.setType(blink::WebInputEvent::MouseMove); | 513 mouse_move.setType(blink::WebInputEvent::MouseMove); |
| 507 if (!root_view->TransformPointToCoordSpaceForView( | 514 if (!root_view->TransformPointToCoordSpaceForView( |
| 508 gfx::Point(event->x, event->y), common_ancestor, | 515 gfx::Point(event->position.x, event->position.y), common_ancestor, |
| 509 &transformed_point)) | 516 &transformed_point)) |
| 510 transformed_point = gfx::Point(); | 517 transformed_point = gfx::Point(); |
| 511 mouse_move.x = transformed_point.x(); | 518 mouse_move.position.x = transformed_point.x(); |
| 512 mouse_move.y = transformed_point.y(); | 519 mouse_move.position.y = transformed_point.y(); |
| 513 common_ancestor->ProcessMouseEvent(mouse_move, ui::LatencyInfo()); | 520 common_ancestor->ProcessMouseEvent(mouse_move, ui::LatencyInfo()); |
| 514 } | 521 } |
| 515 | 522 |
| 516 // Send MouseMoves to trigger MouseEnter handlers. | 523 // Send MouseMoves to trigger MouseEnter handlers. |
| 517 for (auto* view : entered_views) { | 524 for (auto* view : entered_views) { |
| 518 if (view == target) | 525 if (view == target) |
| 519 continue; | 526 continue; |
| 520 blink::WebMouseEvent mouse_enter(*event); | 527 blink::WebMouseEvent mouse_enter(*event); |
| 521 mouse_enter.setType(blink::WebInputEvent::MouseMove); | 528 mouse_enter.setType(blink::WebInputEvent::MouseMove); |
| 522 if (!root_view->TransformPointToCoordSpaceForView( | 529 if (!root_view->TransformPointToCoordSpaceForView( |
| 523 gfx::Point(event->x, event->y), view, &transformed_point)) | 530 gfx::Point(event->position.x, event->position.y), view, |
| 531 &transformed_point)) |
| 524 transformed_point = gfx::Point(); | 532 transformed_point = gfx::Point(); |
| 525 mouse_enter.x = transformed_point.x(); | 533 mouse_enter.position.x = transformed_point.x(); |
| 526 mouse_enter.y = transformed_point.y(); | 534 mouse_enter.position.y = transformed_point.y(); |
| 527 view->ProcessMouseEvent(mouse_enter, ui::LatencyInfo()); | 535 view->ProcessMouseEvent(mouse_enter, ui::LatencyInfo()); |
| 528 } | 536 } |
| 529 | 537 |
| 530 last_mouse_move_target_ = target; | 538 last_mouse_move_target_ = target; |
| 531 last_mouse_move_root_view_ = root_view; | 539 last_mouse_move_root_view_ = root_view; |
| 532 } | 540 } |
| 533 | 541 |
| 534 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( | 542 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( |
| 535 RenderWidgetHostViewBase* target_view, | 543 RenderWidgetHostViewBase* target_view, |
| 536 const blink::WebGestureEvent& event) { | 544 const blink::WebGestureEvent& event) { |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 if (!touchpad_gesture_target_.target) | 816 if (!touchpad_gesture_target_.target) |
| 809 return; | 817 return; |
| 810 | 818 |
| 811 // TODO(mohsen): Add tests to check event location. | 819 // TODO(mohsen): Add tests to check event location. |
| 812 event->x += touchpad_gesture_target_.delta.x(); | 820 event->x += touchpad_gesture_target_.delta.x(); |
| 813 event->y += touchpad_gesture_target_.delta.y(); | 821 event->y += touchpad_gesture_target_.delta.y(); |
| 814 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); | 822 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); |
| 815 } | 823 } |
| 816 | 824 |
| 817 } // namespace content | 825 } // namespace content |
| OLD | NEW |