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