Chromium Code Reviews| Index: content/browser/renderer_host/touchscreen_tap_suppression_controller_aura.cc |
| diff --git a/content/browser/renderer_host/touchscreen_tap_suppression_controller_aura.cc b/content/browser/renderer_host/touchscreen_tap_suppression_controller_aura.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..fb27086a58b9c727a63d85a85ee0a38b2987b390 |
| --- /dev/null |
| +++ b/content/browser/renderer_host/touchscreen_tap_suppression_controller_aura.cc |
| @@ -0,0 +1,161 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
|
rjkroege
2013/02/05 16:00:07
you need this on windows and aura. So it is misnam
mohsen
2013/02/06 16:13:06
Isn't it the case for touchpad TSC, too? Don't we
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/renderer_host/touchscreen_tap_suppression_controller.h" |
| + |
| +#include "base/command_line.h" |
| +#include "base/debug/trace_event.h" |
| +#include "base/logging.h" |
| +#include "base/string_number_conversions.h" |
| +#include "content/browser/renderer_host/gesture_event_filter.h" |
| +#include "content/browser/renderer_host/render_widget_host_impl.h" |
| +#include "content/public/common/content_switches.h" |
| +#include "ui/base/gestures/gesture_configuration.h" |
| + |
| +namespace content { |
| + |
| +TouchscreenTapSuppressionController::TouchscreenTapSuppressionController( |
| + RenderWidgetHostImpl* rwhv, |
| + GestureEventFilter* gef) |
| + : render_widget_host_(rwhv), |
| + gesture_event_filter_(gef), |
| + state_(TouchscreenTapSuppressionController::NOTHING) { |
| +} |
| + |
| +TouchscreenTapSuppressionController::~TouchscreenTapSuppressionController() { } |
| + |
| +void TouchscreenTapSuppressionController::GestureFlingCancel( |
| + double cancel_time) { |
| + switch (state_) { |
| + case NOTHING: |
| + case GFC_IN_PROGRESS: |
| + case LAST_CANCEL_STOPPED_FLING: |
| + state_ = GFC_IN_PROGRESS; |
| + break; |
| + case GTD_STASHED: |
| + break; |
| + } |
| +} |
| + |
| +void TouchscreenTapSuppressionController::GestureFlingCancelAck( |
| + bool processed) { |
| + switch (state_) { |
| + case NOTHING: |
| + NOTREACHED() << "GFC_Ack without a GFC"; |
| + break; |
| + case GFC_IN_PROGRESS: |
| + if (processed) |
| + fling_cancel_time_ = base::TimeTicks::Now(); |
| + state_ = LAST_CANCEL_STOPPED_FLING; |
| + break; |
| + case GTD_STASHED: |
| + if (!processed) { |
| + TRACE_EVENT0( |
| + "browser", |
| + "TouchscreenTapSuppressionController::GestureFlingCancelAck"); |
| + tap_down_timer_.Stop(); |
| + gesture_event_filter_->ForwardGestureEventForDeferral( |
| + stashed_tap_down_); |
| + state_ = NOTHING; |
| + } // Else waiting for the timer to release the mouse event. |
| + break; |
| + case LAST_CANCEL_STOPPED_FLING: |
| + break; |
| + } |
| +} |
| + |
| +bool TouchscreenTapSuppressionController::ShouldDeferGestureTapDown( |
| + const WebKit::WebGestureEvent& event) { |
| + switch (state_) { |
| + case NOTHING: |
| + return false; |
| + case GFC_IN_PROGRESS: |
| + tap_down_timer_.Start( |
| + FROM_HERE, |
| + base::TimeDelta::FromMilliseconds( |
| + ui::GestureConfiguration::semi_long_press_time_in_seconds() * |
| + 1000), |
| + this, |
| + &TouchscreenTapSuppressionController::GestureTapDownTimerExpired); |
| + stashed_tap_down_ = event; |
| + state_ = GTD_STASHED; |
| + return true; |
| + case GTD_STASHED: |
| + NOTREACHED() << "GestureTapDown on GTD_STASHED state"; |
| + state_ = NOTHING; |
| + return false; |
| + case LAST_CANCEL_STOPPED_FLING: |
| + if ((base::TimeTicks::Now() - fling_cancel_time_).InMilliseconds() |
| + < ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms()) { |
| + state_ = GTD_STASHED; |
| + tap_down_timer_.Start( |
| + FROM_HERE, |
| + base::TimeDelta::FromMilliseconds( |
| + ui::GestureConfiguration::semi_long_press_time_in_seconds() * |
| + 1000), |
| + this, |
| + &TouchscreenTapSuppressionController::GestureTapDownTimerExpired); |
| + stashed_tap_down_ = event; |
| + return true; |
| + } |
| + state_ = NOTHING; |
| + return false; |
| + } |
| + NOTREACHED() << "Invalid state"; |
| + return false; |
| +} |
| + |
| +bool TouchscreenTapSuppressionController::ShouldSuppressGestureTap() { |
| + switch (state_) { |
| + case NOTHING: |
| + case GFC_IN_PROGRESS: |
| + return false; |
| + case GTD_STASHED: |
| + tap_down_timer_.Stop(); |
| + state_ = NOTHING; |
| + return true; |
| + case LAST_CANCEL_STOPPED_FLING: |
| + NOTREACHED() << "Invalid GestureTap on LAST_CANCEL_STOPPED_FLING state"; |
| + return false; |
| + } |
| + NOTREACHED() << "Invalid state"; |
| + return false; |
| +} |
| + |
| +bool TouchscreenTapSuppressionController::ShouldSuppressGestureTapCancel() { |
| + switch (state_) { |
| + case NOTHING: |
| + case GFC_IN_PROGRESS: |
| + return false; |
| + case GTD_STASHED: |
| + tap_down_timer_.Stop(); |
| + state_ = NOTHING; |
| + return true; |
| + case LAST_CANCEL_STOPPED_FLING: |
| + NOTREACHED() << "GestureTapCancel on LAST_CANCEL_STOPPED_FLING state"; |
| + return false; |
| + } |
| + NOTREACHED() << "Invalid state"; |
| + return false; |
| +} |
| + |
| +void TouchscreenTapSuppressionController::GestureTapDownTimerExpired() { |
| + switch (state_) { |
| + case NOTHING: |
| + case GFC_IN_PROGRESS: |
| + case LAST_CANCEL_STOPPED_FLING: |
| + NOTREACHED() << "Timer fired on invalid state."; |
| + state_ = NOTHING; |
| + break; |
| + case GTD_STASHED: |
| + TRACE_EVENT0( |
| + "browser", |
| + "TouchscreenTapSuppressionController::GestureTapDownTimerExpired"); |
| + gesture_event_filter_->ForwardGestureEventSkipDeferral(stashed_tap_down_); |
| + state_ = NOTHING; |
| + break; |
| + } |
| +} |
| + |
| +} // namespace content |