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

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

Issue 12087140: Suppress touchscreen tap immediately after a GestureFlingCancel (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // 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
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/touchscreen_tap_suppression_controller.h "
6
7 #include "base/command_line.h"
8 #include "base/debug/trace_event.h"
9 #include "base/logging.h"
10 #include "base/string_number_conversions.h"
11 #include "content/browser/renderer_host/gesture_event_filter.h"
12 #include "content/browser/renderer_host/render_widget_host_impl.h"
13 #include "content/public/common/content_switches.h"
14 #include "ui/base/gestures/gesture_configuration.h"
15
16 namespace content {
17
18 TouchscreenTapSuppressionController::TouchscreenTapSuppressionController(
19 RenderWidgetHostImpl* rwhv,
20 GestureEventFilter* gef)
21 : render_widget_host_(rwhv),
22 gesture_event_filter_(gef),
23 state_(TouchscreenTapSuppressionController::NOTHING) {
24 }
25
26 TouchscreenTapSuppressionController::~TouchscreenTapSuppressionController() { }
27
28 void TouchscreenTapSuppressionController::GestureFlingCancel(
29 double cancel_time) {
30 switch (state_) {
31 case NOTHING:
32 case GFC_IN_PROGRESS:
33 case LAST_CANCEL_STOPPED_FLING:
34 state_ = GFC_IN_PROGRESS;
35 break;
36 case GTD_STASHED:
37 break;
38 }
39 }
40
41 void TouchscreenTapSuppressionController::GestureFlingCancelAck(
42 bool processed) {
43 switch (state_) {
44 case NOTHING:
45 NOTREACHED() << "GFC_Ack without a GFC";
46 break;
47 case GFC_IN_PROGRESS:
48 if (processed)
49 fling_cancel_time_ = base::TimeTicks::Now();
50 state_ = LAST_CANCEL_STOPPED_FLING;
51 break;
52 case GTD_STASHED:
53 if (!processed) {
54 TRACE_EVENT0(
55 "browser",
56 "TouchscreenTapSuppressionController::GestureFlingCancelAck");
57 tap_down_timer_.Stop();
58 gesture_event_filter_->ForwardGestureEventForDeferral(
59 stashed_tap_down_);
60 state_ = NOTHING;
61 } // Else waiting for the timer to release the mouse event.
62 break;
63 case LAST_CANCEL_STOPPED_FLING:
64 break;
65 }
66 }
67
68 bool TouchscreenTapSuppressionController::ShouldDeferGestureTapDown(
69 const WebKit::WebGestureEvent& event) {
70 switch (state_) {
71 case NOTHING:
72 return false;
73 case GFC_IN_PROGRESS:
74 tap_down_timer_.Start(
75 FROM_HERE,
76 base::TimeDelta::FromMilliseconds(
77 ui::GestureConfiguration::semi_long_press_time_in_seconds() *
78 1000),
79 this,
80 &TouchscreenTapSuppressionController::GestureTapDownTimerExpired);
81 stashed_tap_down_ = event;
82 state_ = GTD_STASHED;
83 return true;
84 case GTD_STASHED:
85 NOTREACHED() << "GestureTapDown on GTD_STASHED state";
86 state_ = NOTHING;
87 return false;
88 case LAST_CANCEL_STOPPED_FLING:
89 if ((base::TimeTicks::Now() - fling_cancel_time_).InMilliseconds()
90 < ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms()) {
91 state_ = GTD_STASHED;
92 tap_down_timer_.Start(
93 FROM_HERE,
94 base::TimeDelta::FromMilliseconds(
95 ui::GestureConfiguration::semi_long_press_time_in_seconds() *
96 1000),
97 this,
98 &TouchscreenTapSuppressionController::GestureTapDownTimerExpired);
99 stashed_tap_down_ = event;
100 return true;
101 }
102 state_ = NOTHING;
103 return false;
104 }
105 NOTREACHED() << "Invalid state";
106 return false;
107 }
108
109 bool TouchscreenTapSuppressionController::ShouldSuppressGestureTap() {
110 switch (state_) {
111 case NOTHING:
112 case GFC_IN_PROGRESS:
113 return false;
114 case GTD_STASHED:
115 tap_down_timer_.Stop();
116 state_ = NOTHING;
117 return true;
118 case LAST_CANCEL_STOPPED_FLING:
119 NOTREACHED() << "Invalid GestureTap on LAST_CANCEL_STOPPED_FLING state";
120 return false;
121 }
122 NOTREACHED() << "Invalid state";
123 return false;
124 }
125
126 bool TouchscreenTapSuppressionController::ShouldSuppressGestureTapCancel() {
127 switch (state_) {
128 case NOTHING:
129 case GFC_IN_PROGRESS:
130 return false;
131 case GTD_STASHED:
132 tap_down_timer_.Stop();
133 state_ = NOTHING;
134 return true;
135 case LAST_CANCEL_STOPPED_FLING:
136 NOTREACHED() << "GestureTapCancel on LAST_CANCEL_STOPPED_FLING state";
137 return false;
138 }
139 NOTREACHED() << "Invalid state";
140 return false;
141 }
142
143 void TouchscreenTapSuppressionController::GestureTapDownTimerExpired() {
144 switch (state_) {
145 case NOTHING:
146 case GFC_IN_PROGRESS:
147 case LAST_CANCEL_STOPPED_FLING:
148 NOTREACHED() << "Timer fired on invalid state.";
149 state_ = NOTHING;
150 break;
151 case GTD_STASHED:
152 TRACE_EVENT0(
153 "browser",
154 "TouchscreenTapSuppressionController::GestureTapDownTimerExpired");
155 gesture_event_filter_->ForwardGestureEventSkipDeferral(stashed_tap_down_);
156 state_ = NOTHING;
157 break;
158 }
159 }
160
161 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698