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

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

Issue 2573073003: Collapse the API surface on WebInputEvent via accessor functions. (Closed)
Patch Set: Fix nits Created 3 years, 11 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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 void RenderWidgetHostInputEventRouter::RouteMouseEvent( 172 void RenderWidgetHostInputEventRouter::RouteMouseEvent(
173 RenderWidgetHostViewBase* root_view, 173 RenderWidgetHostViewBase* root_view,
174 blink::WebMouseEvent* event, 174 blink::WebMouseEvent* event,
175 const ui::LatencyInfo& latency) { 175 const ui::LatencyInfo& latency) {
176 RenderWidgetHostViewBase* target; 176 RenderWidgetHostViewBase* target;
177 gfx::Point transformed_point; 177 gfx::Point transformed_point;
178 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | 178 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown |
179 blink::WebInputEvent::MiddleButtonDown | 179 blink::WebInputEvent::MiddleButtonDown |
180 blink::WebInputEvent::RightButtonDown; 180 blink::WebInputEvent::RightButtonDown;
181 if (mouse_capture_target_.target && 181 if (mouse_capture_target_.target &&
182 event->type != blink::WebInputEvent::MouseDown && 182 event->type() != blink::WebInputEvent::MouseDown &&
183 (event->type == blink::WebInputEvent::MouseUp || 183 (event->type() == blink::WebInputEvent::MouseUp ||
184 event->modifiers & mouse_button_modifiers)) { 184 event->modifiers() & mouse_button_modifiers)) {
185 target = mouse_capture_target_.target; 185 target = mouse_capture_target_.target;
186 if (!root_view->TransformPointToCoordSpaceForView( 186 if (!root_view->TransformPointToCoordSpaceForView(
187 gfx::Point(event->x, event->y), target, &transformed_point)) 187 gfx::Point(event->x, event->y), target, &transformed_point))
188 return; 188 return;
189 if (event->type == blink::WebInputEvent::MouseUp) 189 if (event->type() == blink::WebInputEvent::MouseUp)
190 mouse_capture_target_.target = nullptr; 190 mouse_capture_target_.target = nullptr;
191 } else { 191 } else {
192 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), 192 target = FindEventTarget(root_view, gfx::Point(event->x, event->y),
193 &transformed_point); 193 &transformed_point);
194 } 194 }
195 195
196 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse 196 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse
197 // events, so they have to go by the double-hop forwarding path through 197 // events, so they have to go by the double-hop forwarding path through
198 // the embedding renderer and then BrowserPluginGuest. 198 // the embedding renderer and then BrowserPluginGuest.
199 if (target && target->IsRenderWidgetHostViewGuest()) { 199 if (target && target->IsRenderWidgetHostViewGuest()) {
(...skipping 17 matching lines...) Expand all
217 gfx::Point(event->x, event->y), owner_view, &owner_point)) { 217 gfx::Point(event->x, event->y), owner_view, &owner_point)) {
218 return; 218 return;
219 } 219 }
220 event->x = owner_point.x(); 220 event->x = owner_point.x();
221 event->y = owner_point.y(); 221 event->y = owner_point.y();
222 } 222 }
223 owner_view->ProcessMouseEvent(*event, latency_info); 223 owner_view->ProcessMouseEvent(*event, latency_info);
224 return; 224 return;
225 } 225 }
226 226
227 if (event->type == blink::WebInputEvent::MouseDown) 227 if (event->type() == blink::WebInputEvent::MouseDown)
228 mouse_capture_target_.target = target; 228 mouse_capture_target_.target = target;
229 229
230 if (!target) 230 if (!target)
231 return; 231 return;
232 232
233 // SendMouseEnterOrLeaveEvents is called with the original event 233 // SendMouseEnterOrLeaveEvents is called with the original event
234 // coordinates, which are transformed independently for each view that will 234 // coordinates, which are transformed independently for each view that will
235 // receive an event. 235 // receive an event.
236 if ((event->type == blink::WebInputEvent::MouseLeave || 236 if ((event->type() == blink::WebInputEvent::MouseLeave ||
237 event->type == blink::WebInputEvent::MouseMove) && 237 event->type() == blink::WebInputEvent::MouseMove) &&
238 target != last_mouse_move_target_) 238 target != last_mouse_move_target_)
239 SendMouseEnterOrLeaveEvents(event, target, root_view); 239 SendMouseEnterOrLeaveEvents(event, target, root_view);
240 240
241 event->x = transformed_point.x(); 241 event->x = transformed_point.x();
242 event->y = transformed_point.y(); 242 event->y = transformed_point.y();
243 target->ProcessMouseEvent(*event, latency); 243 target->ProcessMouseEvent(*event, latency);
244 } 244 }
245 245
246 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( 246 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent(
247 RenderWidgetHostViewBase* root_view, 247 RenderWidgetHostViewBase* root_view,
(...skipping 27 matching lines...) Expand all
275 }; 275 };
276 } 276 }
277 277
278 namespace { 278 namespace {
279 279
280 unsigned CountChangedTouchPoints(const blink::WebTouchEvent& event) { 280 unsigned CountChangedTouchPoints(const blink::WebTouchEvent& event) {
281 unsigned changed_count = 0; 281 unsigned changed_count = 0;
282 282
283 blink::WebTouchPoint::State required_state = 283 blink::WebTouchPoint::State required_state =
284 blink::WebTouchPoint::StateUndefined; 284 blink::WebTouchPoint::StateUndefined;
285 switch (event.type) { 285 switch (event.type()) {
286 case blink::WebInputEvent::TouchStart: 286 case blink::WebInputEvent::TouchStart:
287 required_state = blink::WebTouchPoint::StatePressed; 287 required_state = blink::WebTouchPoint::StatePressed;
288 break; 288 break;
289 case blink::WebInputEvent::TouchEnd: 289 case blink::WebInputEvent::TouchEnd:
290 required_state = blink::WebTouchPoint::StateReleased; 290 required_state = blink::WebTouchPoint::StateReleased;
291 break; 291 break;
292 case blink::WebInputEvent::TouchCancel: 292 case blink::WebInputEvent::TouchCancel:
293 required_state = blink::WebTouchPoint::StateCancelled; 293 required_state = blink::WebTouchPoint::StateCancelled;
294 break; 294 break;
295 default: 295 default:
296 // We'll only ever call this method for TouchStart, TouchEnd 296 // We'll only ever call this method for TouchStart, TouchEnd
297 // and TounchCancel events, so mark the rest as not-reached. 297 // and TounchCancel events, so mark the rest as not-reached.
298 NOTREACHED(); 298 NOTREACHED();
299 } 299 }
300 for (unsigned i = 0; i < event.touchesLength; ++i) { 300 for (unsigned i = 0; i < event.touchesLength; ++i) {
301 if (event.touches[i].state == required_state) 301 if (event.touches[i].state == required_state)
302 ++changed_count; 302 ++changed_count;
303 } 303 }
304 304
305 DCHECK(event.type == blink::WebInputEvent::TouchCancel || changed_count == 1); 305 DCHECK(event.type() == blink::WebInputEvent::TouchCancel ||
306 changed_count == 1);
306 return changed_count; 307 return changed_count;
307 } 308 }
308 309
309 } // namespace 310 } // namespace
310 311
311 void RenderWidgetHostInputEventRouter::RouteTouchEvent( 312 void RenderWidgetHostInputEventRouter::RouteTouchEvent(
312 RenderWidgetHostViewBase* root_view, 313 RenderWidgetHostViewBase* root_view,
313 blink::WebTouchEvent* event, 314 blink::WebTouchEvent* event,
314 const ui::LatencyInfo& latency) { 315 const ui::LatencyInfo& latency) {
315 switch (event->type) { 316 switch (event->type()) {
316 case blink::WebInputEvent::TouchStart: { 317 case blink::WebInputEvent::TouchStart: {
317 active_touches_ += CountChangedTouchPoints(*event); 318 active_touches_ += CountChangedTouchPoints(*event);
318 if (active_touches_ == 1) { 319 if (active_touches_ == 1) {
319 // Since this is the first touch, it defines the target for the rest 320 // Since this is the first touch, it defines the target for the rest
320 // of this sequence. 321 // of this sequence.
321 DCHECK(!touch_target_.target); 322 DCHECK(!touch_target_.target);
322 gfx::Point transformed_point; 323 gfx::Point transformed_point;
323 gfx::Point original_point(event->touches[0].position.x, 324 gfx::Point original_point(event->touches[0].position.x,
324 event->touches[0].position.y); 325 event->touches[0].position.y);
325 touch_target_.target = 326 touch_target_.target =
326 FindEventTarget(root_view, original_point, &transformed_point); 327 FindEventTarget(root_view, original_point, &transformed_point);
327 328
328 // TODO(wjmaclean): Instead of just computing a delta, we should extract 329 // TODO(wjmaclean): Instead of just computing a delta, we should extract
329 // the complete transform. We assume it doesn't change for the duration 330 // the complete transform. We assume it doesn't change for the duration
330 // of the touch sequence, though this could be wrong; a better approach 331 // of the touch sequence, though this could be wrong; a better approach
331 // might be to always transform each point to the |touch_target_.target| 332 // might be to always transform each point to the |touch_target_.target|
332 // for the duration of the sequence. 333 // for the duration of the sequence.
333 touch_target_.delta = transformed_point - original_point; 334 touch_target_.delta = transformed_point - original_point;
334 touchscreen_gesture_target_queue_.push_back(touch_target_); 335 touchscreen_gesture_target_queue_.push_back(touch_target_);
335 336
336 if (!touch_target_.target) 337 if (!touch_target_.target)
337 return; 338 return;
338 339
339 if (touch_target_.target == bubbling_gesture_scroll_target_.target) { 340 if (touch_target_.target == bubbling_gesture_scroll_target_.target) {
340 SendGestureScrollEnd( 341 SendGestureScrollEnd(
341 bubbling_gesture_scroll_target_.target, 342 bubbling_gesture_scroll_target_.target,
342 DummyGestureScrollUpdate(event->timeStampSeconds)); 343 DummyGestureScrollUpdate(event->timeStampSeconds()));
343 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); 344 CancelScrollBubbling(bubbling_gesture_scroll_target_.target);
344 } 345 }
345 } 346 }
346 347
347 if (touch_target_.target) { 348 if (touch_target_.target) {
348 TransformEventTouchPositions(event, touch_target_.delta); 349 TransformEventTouchPositions(event, touch_target_.delta);
349 touch_target_.target->ProcessTouchEvent(*event, latency); 350 touch_target_.target->ProcessTouchEvent(*event, latency);
350 } 351 }
351 break; 352 break;
352 } 353 }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 500
500 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( 501 void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
501 RenderWidgetHostViewBase* target_view, 502 RenderWidgetHostViewBase* target_view,
502 const blink::WebGestureEvent& event) { 503 const blink::WebGestureEvent& event) {
503 // TODO(kenrb, tdresser): This needs to be refactored when scroll latching 504 // TODO(kenrb, tdresser): This needs to be refactored when scroll latching
504 // is implemented (see https://crbug.com/526463). This design has some 505 // is implemented (see https://crbug.com/526463). This design has some
505 // race problems that can result in lost scroll delta, which are very 506 // race problems that can result in lost scroll delta, which are very
506 // difficult to resolve until this is changed to do all scroll targeting, 507 // difficult to resolve until this is changed to do all scroll targeting,
507 // including bubbling, based on GestureScrollBegin. 508 // including bubbling, based on GestureScrollBegin.
508 DCHECK(target_view); 509 DCHECK(target_view);
509 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || 510 DCHECK(event.type() == blink::WebInputEvent::GestureScrollUpdate ||
510 event.type == blink::WebInputEvent::GestureScrollEnd); 511 event.type() == blink::WebInputEvent::GestureScrollEnd);
511 // DCHECK_XNOR the current and original bubble targets. Both should be set 512 // DCHECK_XNOR the current and original bubble targets. Both should be set
512 // if a bubbling gesture scroll is in progress. 513 // if a bubbling gesture scroll is in progress.
513 DCHECK(!first_bubbling_scroll_target_.target == 514 DCHECK(!first_bubbling_scroll_target_.target ==
514 !bubbling_gesture_scroll_target_.target); 515 !bubbling_gesture_scroll_target_.target);
515 516
516 ui::LatencyInfo latency_info = 517 ui::LatencyInfo latency_info =
517 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); 518 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
518 519
519 // If target_view is already set up for bubbled scrolls, we forward 520 // If target_view is already set up for bubbled scrolls, we forward
520 // the event to the current scroll target without further consideration. 521 // the event to the current scroll target without further consideration.
521 if (target_view == first_bubbling_scroll_target_.target) { 522 if (target_view == first_bubbling_scroll_target_.target) {
522 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, 523 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event,
523 latency_info); 524 latency_info);
524 if (event.type == blink::WebInputEvent::GestureScrollEnd) { 525 if (event.type() == blink::WebInputEvent::GestureScrollEnd) {
525 first_bubbling_scroll_target_.target = nullptr; 526 first_bubbling_scroll_target_.target = nullptr;
526 bubbling_gesture_scroll_target_.target = nullptr; 527 bubbling_gesture_scroll_target_.target = nullptr;
527 } 528 }
528 return; 529 return;
529 } 530 }
530 531
531 // Disregard GestureScrollEnd events going to non-current targets. 532 // Disregard GestureScrollEnd events going to non-current targets.
532 // These should only happen on ACKs of synthesized GSE events that are 533 // These should only happen on ACKs of synthesized GSE events that are
533 // sent from SendGestureScrollEnd calls, and are not relevant here. 534 // sent from SendGestureScrollEnd calls, and are not relevant here.
534 if (event.type == blink::WebInputEvent::GestureScrollEnd) 535 if (event.type() == blink::WebInputEvent::GestureScrollEnd)
535 return; 536 return;
536 537
537 // This is a special case to catch races where multiple GestureScrollUpdates 538 // This is a special case to catch races where multiple GestureScrollUpdates
538 // have been sent to a renderer before the first one was ACKed, and the ACK 539 // have been sent to a renderer before the first one was ACKed, and the ACK
539 // caused a bubble retarget. In this case they all get forwarded. 540 // caused a bubble retarget. In this case they all get forwarded.
540 if (target_view == bubbling_gesture_scroll_target_.target) { 541 if (target_view == bubbling_gesture_scroll_target_.target) {
541 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, 542 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event,
542 latency_info); 543 latency_info);
543 return; 544 return;
544 } 545 }
(...skipping 18 matching lines...) Expand all
563 564
564 bubbling_gesture_scroll_target_.target = target_view; 565 bubbling_gesture_scroll_target_.target = target_view;
565 566
566 SendGestureScrollBegin(target_view, event); 567 SendGestureScrollBegin(target_view, event);
567 target_view->ProcessGestureEvent(event, latency_info); 568 target_view->ProcessGestureEvent(event, latency_info);
568 } 569 }
569 570
570 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( 571 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin(
571 RenderWidgetHostViewBase* view, 572 RenderWidgetHostViewBase* view,
572 const blink::WebGestureEvent& event) { 573 const blink::WebGestureEvent& event) {
573 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || 574 DCHECK(event.type() == blink::WebInputEvent::GestureScrollUpdate ||
574 event.type == blink::WebInputEvent::GesturePinchBegin); 575 event.type() == blink::WebInputEvent::GesturePinchBegin);
575 blink::WebGestureEvent scroll_begin(event); 576 blink::WebGestureEvent scroll_begin(event);
576 scroll_begin.setType(blink::WebInputEvent::GestureScrollBegin); 577 scroll_begin.setType(blink::WebInputEvent::GestureScrollBegin);
577 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; 578 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX;
578 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; 579 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY;
579 scroll_begin.data.scrollBegin.deltaHintUnits = 580 scroll_begin.data.scrollBegin.deltaHintUnits =
580 event.data.scrollUpdate.deltaUnits; 581 event.data.scrollUpdate.deltaUnits;
581 view->ProcessGestureEvent( 582 view->ProcessGestureEvent(
582 scroll_begin, 583 scroll_begin,
583 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); 584 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event));
584 } 585 }
585 586
586 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( 587 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd(
587 RenderWidgetHostViewBase* view, 588 RenderWidgetHostViewBase* view,
588 const blink::WebGestureEvent& event) { 589 const blink::WebGestureEvent& event) {
589 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || 590 DCHECK(event.type() == blink::WebInputEvent::GestureScrollUpdate ||
590 event.type == blink::WebInputEvent::GesturePinchEnd); 591 event.type() == blink::WebInputEvent::GesturePinchEnd);
591 blink::WebGestureEvent scroll_end(event); 592 blink::WebGestureEvent scroll_end(event);
592 scroll_end.setType(blink::WebInputEvent::GestureScrollEnd); 593 scroll_end.setType(blink::WebInputEvent::GestureScrollEnd);
593 scroll_end.setTimeStampSeconds( 594 scroll_end.setTimeStampSeconds(
594 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF()); 595 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF());
595 scroll_end.data.scrollEnd.inertialPhase = 596 scroll_end.data.scrollEnd.inertialPhase =
596 event.data.scrollUpdate.inertialPhase; 597 event.data.scrollUpdate.inertialPhase;
597 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; 598 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits;
598 view->ProcessGestureEvent( 599 view->ProcessGestureEvent(
599 scroll_end, 600 scroll_end,
600 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); 601 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 FindEventTarget(root_view, point, transformed_point) 657 FindEventTarget(root_view, point, transformed_point)
657 ->GetRenderWidgetHost()); 658 ->GetRenderWidgetHost());
658 } 659 }
659 660
660 void RenderWidgetHostInputEventRouter::RouteTouchscreenGestureEvent( 661 void RenderWidgetHostInputEventRouter::RouteTouchscreenGestureEvent(
661 RenderWidgetHostViewBase* root_view, 662 RenderWidgetHostViewBase* root_view,
662 blink::WebGestureEvent* event, 663 blink::WebGestureEvent* event,
663 const ui::LatencyInfo& latency) { 664 const ui::LatencyInfo& latency) {
664 DCHECK_EQ(blink::WebGestureDeviceTouchscreen, event->sourceDevice); 665 DCHECK_EQ(blink::WebGestureDeviceTouchscreen, event->sourceDevice);
665 666
666 if (event->type == blink::WebInputEvent::GesturePinchBegin) { 667 if (event->type() == blink::WebInputEvent::GesturePinchBegin) {
667 in_touchscreen_gesture_pinch_ = true; 668 in_touchscreen_gesture_pinch_ = true;
668 // If the root view wasn't already receiving the gesture stream, then we 669 // If the root view wasn't already receiving the gesture stream, then we
669 // need to wrap the diverted pinch events in a GestureScrollBegin/End. 670 // need to wrap the diverted pinch events in a GestureScrollBegin/End.
670 // TODO(wjmaclean,kenrb,tdresser): When scroll latching lands, we can 671 // TODO(wjmaclean,kenrb,tdresser): When scroll latching lands, we can
671 // revisit how this code should work. 672 // revisit how this code should work.
672 // https://crbug.com/526463 673 // https://crbug.com/526463
673 auto rwhi = 674 auto rwhi =
674 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost()); 675 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost());
675 // If the root view is the current gesture target, then we explicitly don't 676 // If the root view is the current gesture target, then we explicitly don't
676 // send a GestureScrollBegin, as by the time we see GesturePinchBegin there 677 // send a GestureScrollBegin, as by the time we see GesturePinchBegin there
677 // should have been one. 678 // should have been one.
678 if (root_view != touchscreen_gesture_target_.target && 679 if (root_view != touchscreen_gesture_target_.target &&
679 !rwhi->is_in_touchscreen_gesture_scroll()) { 680 !rwhi->is_in_touchscreen_gesture_scroll()) {
680 gesture_pinch_did_send_scroll_begin_ = true; 681 gesture_pinch_did_send_scroll_begin_ = true;
681 SendGestureScrollBegin(root_view, *event); 682 SendGestureScrollBegin(root_view, *event);
682 } 683 }
683 } 684 }
684 685
685 if (in_touchscreen_gesture_pinch_) { 686 if (in_touchscreen_gesture_pinch_) {
686 root_view->ProcessGestureEvent(*event, latency); 687 root_view->ProcessGestureEvent(*event, latency);
687 if (event->type == blink::WebInputEvent::GesturePinchEnd) { 688 if (event->type() == blink::WebInputEvent::GesturePinchEnd) {
688 in_touchscreen_gesture_pinch_ = false; 689 in_touchscreen_gesture_pinch_ = false;
689 // If the root view wasn't already receiving the gesture stream, then we 690 // If the root view wasn't already receiving the gesture stream, then we
690 // need to wrap the diverted pinch events in a GestureScrollBegin/End. 691 // need to wrap the diverted pinch events in a GestureScrollBegin/End.
691 auto rwhi = 692 auto rwhi =
692 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost()); 693 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost());
693 if (root_view != touchscreen_gesture_target_.target && 694 if (root_view != touchscreen_gesture_target_.target &&
694 gesture_pinch_did_send_scroll_begin_ && 695 gesture_pinch_did_send_scroll_begin_ &&
695 rwhi->is_in_touchscreen_gesture_scroll()) { 696 rwhi->is_in_touchscreen_gesture_scroll()) {
696 SendGestureScrollEnd(root_view, *event); 697 SendGestureScrollEnd(root_view, *event);
697 } 698 }
698 gesture_pinch_did_send_scroll_begin_ = false; 699 gesture_pinch_did_send_scroll_begin_ = false;
699 } 700 }
700 return; 701 return;
701 } 702 }
702 703
703 // We use GestureTapDown to detect the start of a gesture sequence since there 704 // We use GestureTapDown to detect the start of a gesture sequence since there
704 // is no WebGestureEvent equivalent for ET_GESTURE_BEGIN. Note that this 705 // is no WebGestureEvent equivalent for ET_GESTURE_BEGIN. Note that this
705 // means the GestureFlingCancel that always comes between ET_GESTURE_BEGIN and 706 // means the GestureFlingCancel that always comes between ET_GESTURE_BEGIN and
706 // GestureTapDown is sent to the previous target, in case it is still in a 707 // GestureTapDown is sent to the previous target, in case it is still in a
707 // fling. 708 // fling.
708 if (event->type == blink::WebInputEvent::GestureTapDown) { 709 if (event->type() == blink::WebInputEvent::GestureTapDown) {
709 bool no_target = touchscreen_gesture_target_queue_.empty(); 710 bool no_target = touchscreen_gesture_target_queue_.empty();
710 // This UMA metric is temporary, and will be removed once it has fulfilled 711 // This UMA metric is temporary, and will be removed once it has fulfilled
711 // it's purpose, namely telling us when the incidents of empty 712 // it's purpose, namely telling us when the incidents of empty
712 // gesture-queues has dropped to zero. https://crbug.com/642008 713 // gesture-queues has dropped to zero. https://crbug.com/642008
713 UMA_HISTOGRAM_BOOLEAN("Event.FrameEventRouting.NoGestureTarget", no_target); 714 UMA_HISTOGRAM_BOOLEAN("Event.FrameEventRouting.NoGestureTarget", no_target);
714 if (no_target) { 715 if (no_target) {
715 LOG(ERROR) << "Gesture sequence start detected with no target available."; 716 LOG(ERROR) << "Gesture sequence start detected with no target available.";
716 // Ignore this gesture sequence as no target is available. 717 // Ignore this gesture sequence as no target is available.
717 // TODO(wjmaclean): this only happens on Windows, and should not happen. 718 // TODO(wjmaclean): this only happens on Windows, and should not happen.
718 // https://crbug.com/595422 719 // https://crbug.com/595422
719 touchscreen_gesture_target_.target = nullptr; 720 touchscreen_gesture_target_.target = nullptr;
720 return; 721 return;
721 } 722 }
722 723
723 touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front(); 724 touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front();
724 touchscreen_gesture_target_queue_.pop_front(); 725 touchscreen_gesture_target_queue_.pop_front();
725 726
726 // Abort any scroll bubbling in progress to avoid double entry. 727 // Abort any scroll bubbling in progress to avoid double entry.
727 if (touchscreen_gesture_target_.target && 728 if (touchscreen_gesture_target_.target &&
728 touchscreen_gesture_target_.target == 729 touchscreen_gesture_target_.target ==
729 bubbling_gesture_scroll_target_.target) { 730 bubbling_gesture_scroll_target_.target) {
730 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, 731 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target,
731 DummyGestureScrollUpdate(event->timeStampSeconds)); 732 DummyGestureScrollUpdate(event->timeStampSeconds()));
732 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); 733 CancelScrollBubbling(bubbling_gesture_scroll_target_.target);
733 } 734 }
734 } 735 }
735 736
736 if (!touchscreen_gesture_target_.target) 737 if (!touchscreen_gesture_target_.target)
737 return; 738 return;
738 739
739 // TODO(mohsen): Add tests to check event location. 740 // TODO(mohsen): Add tests to check event location.
740 event->x += touchscreen_gesture_target_.delta.x(); 741 event->x += touchscreen_gesture_target_.delta.x();
741 event->y += touchscreen_gesture_target_.delta.y(); 742 event->y += touchscreen_gesture_target_.delta.y();
742 touchscreen_gesture_target_.target->ProcessGestureEvent(*event, latency); 743 touchscreen_gesture_target_.target->ProcessGestureEvent(*event, latency);
743 } 744 }
744 745
745 void RenderWidgetHostInputEventRouter::RouteTouchpadGestureEvent( 746 void RenderWidgetHostInputEventRouter::RouteTouchpadGestureEvent(
746 RenderWidgetHostViewBase* root_view, 747 RenderWidgetHostViewBase* root_view,
747 blink::WebGestureEvent* event, 748 blink::WebGestureEvent* event,
748 const ui::LatencyInfo& latency) { 749 const ui::LatencyInfo& latency) {
749 DCHECK_EQ(blink::WebGestureDeviceTouchpad, event->sourceDevice); 750 DCHECK_EQ(blink::WebGestureDeviceTouchpad, event->sourceDevice);
750 751
751 if (event->type == blink::WebInputEvent::GesturePinchBegin || 752 if (event->type() == blink::WebInputEvent::GesturePinchBegin ||
752 event->type == blink::WebInputEvent::GestureFlingStart) { 753 event->type() == blink::WebInputEvent::GestureFlingStart) {
753 gfx::Point transformed_point; 754 gfx::Point transformed_point;
754 gfx::Point original_point(event->x, event->y); 755 gfx::Point original_point(event->x, event->y);
755 touchpad_gesture_target_.target = 756 touchpad_gesture_target_.target =
756 FindEventTarget(root_view, original_point, &transformed_point); 757 FindEventTarget(root_view, original_point, &transformed_point);
757 // TODO(mohsen): Instead of just computing a delta, we should extract the 758 // TODO(mohsen): Instead of just computing a delta, we should extract the
758 // complete transform. We assume it doesn't change for the duration of the 759 // complete transform. We assume it doesn't change for the duration of the
759 // touchpad gesture sequence, though this could be wrong; a better approach 760 // touchpad gesture sequence, though this could be wrong; a better approach
760 // might be to always transform each point to the 761 // might be to always transform each point to the
761 // |touchpad_gesture_target_.target| for the duration of the sequence. 762 // |touchpad_gesture_target_.target| for the duration of the sequence.
762 touchpad_gesture_target_.delta = transformed_point - original_point; 763 touchpad_gesture_target_.delta = transformed_point - original_point;
763 764
764 // Abort any scroll bubbling in progress to avoid double entry. 765 // Abort any scroll bubbling in progress to avoid double entry.
765 if (touchpad_gesture_target_.target && 766 if (touchpad_gesture_target_.target &&
766 touchpad_gesture_target_.target == 767 touchpad_gesture_target_.target ==
767 bubbling_gesture_scroll_target_.target) { 768 bubbling_gesture_scroll_target_.target) {
768 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, 769 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target,
769 DummyGestureScrollUpdate(event->timeStampSeconds)); 770 DummyGestureScrollUpdate(event->timeStampSeconds()));
770 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); 771 CancelScrollBubbling(bubbling_gesture_scroll_target_.target);
771 } 772 }
772 } 773 }
773 774
774 if (!touchpad_gesture_target_.target) 775 if (!touchpad_gesture_target_.target)
775 return; 776 return;
776 777
777 // TODO(mohsen): Add tests to check event location. 778 // TODO(mohsen): Add tests to check event location.
778 event->x += touchpad_gesture_target_.delta.x(); 779 event->x += touchpad_gesture_target_.delta.x();
779 event->y += touchpad_gesture_target_.delta.y(); 780 event->y += touchpad_gesture_target_.delta.y();
780 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); 781 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency);
781 } 782 }
782 783
783 } // namespace content 784 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_impl.cc ('k') | content/browser/renderer_host/render_widget_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698