| 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 | 10 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 RenderWidgetHostViewBase* target; | 175 RenderWidgetHostViewBase* target; |
| 176 gfx::Point transformed_point; | 176 gfx::Point transformed_point; |
| 177 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | | 177 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | |
| 178 blink::WebInputEvent::MiddleButtonDown | | 178 blink::WebInputEvent::MiddleButtonDown | |
| 179 blink::WebInputEvent::RightButtonDown; | 179 blink::WebInputEvent::RightButtonDown; |
| 180 if (mouse_capture_target_.target && | 180 if (mouse_capture_target_.target && |
| 181 event->type != blink::WebInputEvent::MouseDown && | 181 event->type != blink::WebInputEvent::MouseDown && |
| 182 (event->type == blink::WebInputEvent::MouseUp || | 182 (event->type == blink::WebInputEvent::MouseUp || |
| 183 event->modifiers & mouse_button_modifiers)) { | 183 event->modifiers & mouse_button_modifiers)) { |
| 184 target = mouse_capture_target_.target; | 184 target = mouse_capture_target_.target; |
| 185 transformed_point = root_view->TransformPointToCoordSpaceForView( | 185 if (!root_view->TransformPointToCoordSpaceForView( |
| 186 gfx::Point(event->x, event->y), target); | 186 gfx::Point(event->x, event->y), target, &transformed_point)) |
| 187 return; |
| 187 if (event->type == blink::WebInputEvent::MouseUp) | 188 if (event->type == blink::WebInputEvent::MouseUp) |
| 188 mouse_capture_target_.target = nullptr; | 189 mouse_capture_target_.target = nullptr; |
| 189 } else { | 190 } else { |
| 190 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), | 191 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), |
| 191 &transformed_point); | 192 &transformed_point); |
| 192 } | 193 } |
| 193 | 194 |
| 194 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse | 195 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse |
| 195 // events, so they have to go by the double-hop forwarding path through | 196 // events, so they have to go by the double-hop forwarding path through |
| 196 // the embedding renderer and then BrowserPluginGuest. | 197 // the embedding renderer and then BrowserPluginGuest. |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 common_ancestor = entered_views.back(); | 423 common_ancestor = entered_views.back(); |
| 423 entered_views.pop_back(); | 424 entered_views.pop_back(); |
| 424 exited_views.pop_back(); | 425 exited_views.pop_back(); |
| 425 } | 426 } |
| 426 | 427 |
| 427 gfx::Point transformed_point; | 428 gfx::Point transformed_point; |
| 428 // Send MouseLeaves. | 429 // Send MouseLeaves. |
| 429 for (auto view : exited_views) { | 430 for (auto view : exited_views) { |
| 430 blink::WebMouseEvent mouse_leave(*event); | 431 blink::WebMouseEvent mouse_leave(*event); |
| 431 mouse_leave.type = blink::WebInputEvent::MouseLeave; | 432 mouse_leave.type = blink::WebInputEvent::MouseLeave; |
| 432 transformed_point = root_view->TransformPointToCoordSpaceForView( | 433 // There is a chance of a race if the last target has recently created a |
| 433 gfx::Point(event->x, event->y), view); | 434 // new compositor surface. The SurfaceID for that might not have |
| 435 // propagated to its embedding surface, which makes it impossible to |
| 436 // compute the transformation for it |
| 437 if (!root_view->TransformPointToCoordSpaceForView( |
| 438 gfx::Point(event->x, event->y), view, &transformed_point)) |
| 439 transformed_point = gfx::Point(); |
| 434 mouse_leave.x = transformed_point.x(); | 440 mouse_leave.x = transformed_point.x(); |
| 435 mouse_leave.y = transformed_point.y(); | 441 mouse_leave.y = transformed_point.y(); |
| 436 view->ProcessMouseEvent(mouse_leave, ui::LatencyInfo()); | 442 view->ProcessMouseEvent(mouse_leave, ui::LatencyInfo()); |
| 437 } | 443 } |
| 438 | 444 |
| 439 // The ancestor might need to trigger MouseOut handlers. | 445 // The ancestor might need to trigger MouseOut handlers. |
| 440 if (common_ancestor && common_ancestor != target) { | 446 if (common_ancestor && common_ancestor != target) { |
| 441 blink::WebMouseEvent mouse_move(*event); | 447 blink::WebMouseEvent mouse_move(*event); |
| 442 mouse_move.type = blink::WebInputEvent::MouseMove; | 448 mouse_move.type = blink::WebInputEvent::MouseMove; |
| 443 transformed_point = root_view->TransformPointToCoordSpaceForView( | 449 if (!root_view->TransformPointToCoordSpaceForView( |
| 444 gfx::Point(event->x, event->y), common_ancestor); | 450 gfx::Point(event->x, event->y), common_ancestor, |
| 451 &transformed_point)) |
| 452 transformed_point = gfx::Point(); |
| 445 mouse_move.x = transformed_point.x(); | 453 mouse_move.x = transformed_point.x(); |
| 446 mouse_move.y = transformed_point.y(); | 454 mouse_move.y = transformed_point.y(); |
| 447 common_ancestor->ProcessMouseEvent(mouse_move, ui::LatencyInfo()); | 455 common_ancestor->ProcessMouseEvent(mouse_move, ui::LatencyInfo()); |
| 448 } | 456 } |
| 449 | 457 |
| 450 // Send MouseMoves to trigger MouseEnter handlers. | 458 // Send MouseMoves to trigger MouseEnter handlers. |
| 451 for (auto view : entered_views) { | 459 for (auto view : entered_views) { |
| 452 if (view == target) | 460 if (view == target) |
| 453 continue; | 461 continue; |
| 454 blink::WebMouseEvent mouse_enter(*event); | 462 blink::WebMouseEvent mouse_enter(*event); |
| 455 mouse_enter.type = blink::WebInputEvent::MouseMove; | 463 mouse_enter.type = blink::WebInputEvent::MouseMove; |
| 456 transformed_point = root_view->TransformPointToCoordSpaceForView( | 464 if (!root_view->TransformPointToCoordSpaceForView( |
| 457 gfx::Point(event->x, event->y), view); | 465 gfx::Point(event->x, event->y), view, &transformed_point)) |
| 466 transformed_point = gfx::Point(); |
| 458 mouse_enter.x = transformed_point.x(); | 467 mouse_enter.x = transformed_point.x(); |
| 459 mouse_enter.y = transformed_point.y(); | 468 mouse_enter.y = transformed_point.y(); |
| 460 view->ProcessMouseEvent(mouse_enter, ui::LatencyInfo()); | 469 view->ProcessMouseEvent(mouse_enter, ui::LatencyInfo()); |
| 461 } | 470 } |
| 462 | 471 |
| 463 last_mouse_move_target_ = target; | 472 last_mouse_move_target_ = target; |
| 464 last_mouse_move_root_view_ = root_view; | 473 last_mouse_move_root_view_ = root_view; |
| 465 } | 474 } |
| 466 | 475 |
| 467 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( | 476 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 if (!touchpad_gesture_target_.target) | 748 if (!touchpad_gesture_target_.target) |
| 740 return; | 749 return; |
| 741 | 750 |
| 742 // TODO(mohsen): Add tests to check event location. | 751 // TODO(mohsen): Add tests to check event location. |
| 743 event->x += touchpad_gesture_target_.delta.x(); | 752 event->x += touchpad_gesture_target_.delta.x(); |
| 744 event->y += touchpad_gesture_target_.delta.y(); | 753 event->y += touchpad_gesture_target_.delta.y(); |
| 745 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); | 754 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); |
| 746 } | 755 } |
| 747 | 756 |
| 748 } // namespace content | 757 } // namespace content |
| OLD | NEW |