OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ui/events/gesture_detection/gesture_provider.h" | 5 #include "ui/events/gesture_detection/gesture_provider.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 return CreateGesture(type, | 94 return CreateGesture(type, |
95 event.GetId(), | 95 event.GetId(), |
96 event.GetEventTime(), | 96 event.GetEventTime(), |
97 event.GetX(), | 97 event.GetX(), |
98 event.GetY(), | 98 event.GetY(), |
99 event.GetPointerCount(), | 99 event.GetPointerCount(), |
100 GetBoundingBox(event)); | 100 GetBoundingBox(event)); |
101 } | 101 } |
102 | 102 |
103 GestureEventDetails CreateTapGestureDetails(EventType type, | 103 GestureEventDetails CreateTapGestureDetails(EventType type, |
104 const MotionEvent& event) { | 104 const MotionEvent& event, |
105 // Set the tap count to 1 even for ET_GESTURE_DOUBLE_TAP, in order to be | 105 int tap_count) { |
106 // consistent with double tap behavior on a mobile viewport. See | 106 DCHECK(type != ET_GESTURE_DOUBLE_TAP || tap_count == 1); |
107 // crbug.com/234986 for context. | 107 DCHECK_GT(tap_count, 0); |
108 GestureEventDetails tap_details(type, 1, 0); | 108 DCHECK_LE(tap_count, 3); |
| 109 GestureEventDetails tap_details(type, tap_count, 0); |
109 return tap_details; | 110 return tap_details; |
110 } | 111 } |
111 | 112 |
112 } // namespace | 113 } // namespace |
113 | 114 |
114 // GestureProvider:::Config | 115 // GestureProvider:::Config |
115 | 116 |
116 GestureProvider::Config::Config() | 117 GestureProvider::Config::Config() |
117 : display(gfx::Display::kInvalidDisplayID, gfx::Rect(1, 1)), | 118 : display(gfx::Display::kInvalidDisplayID, gfx::Rect(1, 1)), |
118 disable_click_delay(false), | 119 disable_click_delay(false), |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 two_finger_tap_details)); | 400 two_finger_tap_details)); |
400 return true; | 401 return true; |
401 } | 402 } |
402 | 403 |
403 virtual void OnShowPress(const MotionEvent& e) OVERRIDE { | 404 virtual void OnShowPress(const MotionEvent& e) OVERRIDE { |
404 GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0); | 405 GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0); |
405 provider_->Send( | 406 provider_->Send( |
406 CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details)); | 407 CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details)); |
407 } | 408 } |
408 | 409 |
409 virtual bool OnSingleTapUp(const MotionEvent& e) OVERRIDE { | 410 virtual bool OnSingleTapUp(const MotionEvent& e, int tap_count) OVERRIDE { |
410 // This is a hack to address the issue where user hovers | 411 // This is a hack to address the issue where user hovers |
411 // over a link for longer than double_tap_timeout_, then | 412 // over a link for longer than double_tap_timeout_, then |
412 // OnSingleTapConfirmed() is not triggered. But we still | 413 // OnSingleTapConfirmed() is not triggered. But we still |
413 // want to trigger the tap event at UP. So we override | 414 // want to trigger the tap event at UP. So we override |
414 // OnSingleTapUp() in this case. This assumes singleTapUp | 415 // OnSingleTapUp() in this case. This assumes singleTapUp |
415 // gets always called before singleTapConfirmed. | 416 // gets always called before singleTapConfirmed. |
416 if (!ignore_single_tap_) { | 417 if (!ignore_single_tap_) { |
417 if (e.GetEventTime() - current_down_time_ > double_tap_timeout_) { | 418 if (e.GetEventTime() - current_down_time_ > double_tap_timeout_) { |
418 return OnSingleTapConfirmed(e); | 419 return OnSingleTapConfirmed(e, tap_count); |
419 } else if (!IsDoubleTapEnabled() || disable_click_delay_) { | 420 } else if (!IsDoubleTapEnabled() || disable_click_delay_) { |
420 // If double-tap has been disabled, there is no need to wait | 421 // If double-tap has been disabled, there is no need to wait |
421 // for the double-tap timeout. | 422 // for the double-tap timeout. |
422 return OnSingleTapConfirmed(e); | 423 return OnSingleTapConfirmed(e, tap_count); |
423 } else { | 424 } else { |
424 // Notify Blink about this tapUp event anyway, when none of the above | 425 // Notify Blink about this tapUp event anyway, when none of the above |
425 // conditions applied. | 426 // conditions applied. |
426 provider_->Send(CreateGesture( | 427 provider_->Send(CreateGesture( |
427 ET_GESTURE_TAP_UNCONFIRMED, | 428 ET_GESTURE_TAP_UNCONFIRMED, |
428 e, | 429 e, |
429 CreateTapGestureDetails(ET_GESTURE_TAP_UNCONFIRMED, e))); | 430 CreateTapGestureDetails(ET_GESTURE_TAP_UNCONFIRMED, e, tap_count))); |
430 } | 431 } |
431 } | 432 } |
432 | 433 |
433 return provider_->SendLongTapIfNecessary(e); | 434 return provider_->SendLongTapIfNecessary(e); |
434 } | 435 } |
435 | 436 |
436 // GestureDetector::DoubleTapListener implementation. | 437 // GestureDetector::DoubleTapListener implementation. |
437 virtual bool OnSingleTapConfirmed(const MotionEvent& e) OVERRIDE { | 438 virtual bool OnSingleTapConfirmed(const MotionEvent& e, |
| 439 int tap_count) OVERRIDE { |
438 // Long taps in the edges of the screen have their events delayed by | 440 // Long taps in the edges of the screen have their events delayed by |
439 // ContentViewHolder for tab swipe operations. As a consequence of the delay | 441 // ContentViewHolder for tab swipe operations. As a consequence of the delay |
440 // this method might be called after receiving the up event. | 442 // this method might be called after receiving the up event. |
441 // These corner cases should be ignored. | 443 // These corner cases should be ignored. |
442 if (ignore_single_tap_) | 444 if (ignore_single_tap_) |
443 return true; | 445 return true; |
444 | 446 |
445 ignore_single_tap_ = true; | 447 ignore_single_tap_ = true; |
446 | 448 |
447 provider_->Send(CreateGesture( | 449 provider_->Send( |
448 ET_GESTURE_TAP, e, CreateTapGestureDetails(ET_GESTURE_TAP, e))); | 450 CreateGesture(ET_GESTURE_TAP, |
| 451 e, |
| 452 CreateTapGestureDetails(ET_GESTURE_TAP, e, tap_count))); |
449 return true; | 453 return true; |
450 } | 454 } |
451 | 455 |
452 virtual bool OnDoubleTap(const MotionEvent& e) OVERRIDE { return false; } | 456 virtual bool OnDoubleTap(const MotionEvent& e) OVERRIDE { return false; } |
453 | 457 |
454 virtual bool OnDoubleTapEvent(const MotionEvent& e) OVERRIDE { | 458 virtual bool OnDoubleTapEvent(const MotionEvent& e) OVERRIDE { |
455 switch (e.GetAction()) { | 459 switch (e.GetAction()) { |
456 case MotionEvent::ACTION_DOWN: | 460 case MotionEvent::ACTION_DOWN: |
457 gesture_detector_.set_longpress_enabled(false); | 461 gesture_detector_.set_longpress_enabled(false); |
458 break; | 462 break; |
459 | 463 |
460 case MotionEvent::ACTION_UP: | 464 case MotionEvent::ACTION_UP: |
461 if (!provider_->IsPinchInProgress() && | 465 if (!provider_->IsPinchInProgress() && |
462 !provider_->IsScrollInProgress()) { | 466 !provider_->IsScrollInProgress()) { |
463 provider_->Send( | 467 // Tap count is set to 1 for ET_GESTURE_DOUBLE_TAP, in order to be |
464 CreateGesture(ET_GESTURE_DOUBLE_TAP, | 468 // consistent with double tap behavior on a mobile viewport. See |
465 e, | 469 // crbug.com/234986 for context. |
466 CreateTapGestureDetails(ET_GESTURE_DOUBLE_TAP, e))); | 470 provider_->Send(CreateGesture( |
| 471 ET_GESTURE_DOUBLE_TAP, |
| 472 e, |
| 473 CreateTapGestureDetails(ET_GESTURE_DOUBLE_TAP, e, 1))); |
467 return true; | 474 return true; |
468 } | 475 } |
469 break; | 476 break; |
470 default: | 477 default: |
471 break; | 478 break; |
472 } | 479 } |
473 return false; | 480 return false; |
474 } | 481 } |
475 | 482 |
476 virtual bool OnLongPress(const MotionEvent& e) OVERRIDE { | 483 virtual bool OnLongPress(const MotionEvent& e) OVERRIDE { |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 if (current_down_event_) | 782 if (current_down_event_) |
776 return; | 783 return; |
777 | 784 |
778 const bool double_tap_enabled = double_tap_support_for_page_ && | 785 const bool double_tap_enabled = double_tap_support_for_page_ && |
779 double_tap_support_for_platform_; | 786 double_tap_support_for_platform_; |
780 gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); | 787 gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); |
781 scale_gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); | 788 scale_gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); |
782 } | 789 } |
783 | 790 |
784 } // namespace ui | 791 } // namespace ui |
OLD | NEW |