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

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: Truncated to int on input, git cl format 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->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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698