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