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

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

Issue 2782893002: WebMouseEvent coordinates are now fractional & private (Closed)
Patch Set: Fixed compile failures. Created 3 years, 8 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 #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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698