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 |