Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(631)

Side by Side Diff: content/browser/renderer_host/render_widget_host_input_event_router.cc

Issue 2417463003: Account for failure of coordinate space transformations in browser (Closed)
Patch Set: Review comments addressed Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/renderer_host/delegated_frame_host.cc ('k') | content/browser/renderer_host/render_widget_host_view_aura.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698