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

Side by Side Diff: ui/events/gestures/gesture_recognizer_impl.cc

Issue 282593002: Reland Unified Gesture Recognizer for Aura (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase again... Created 6 years, 7 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
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | ui/events/gestures/gesture_types.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/gestures/gesture_recognizer_impl.h" 5 #include "ui/events/gestures/gesture_recognizer_impl.h"
6 6
7 #include <limits>
8
9 #include "base/command_line.h"
7 #include "base/logging.h" 10 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h"
9 #include "base/time/time.h" 13 #include "base/time/time.h"
10 #include "ui/events/event.h" 14 #include "ui/events/event.h"
11 #include "ui/events/event_constants.h" 15 #include "ui/events/event_constants.h"
16 #include "ui/events/event_switches.h"
12 #include "ui/events/event_utils.h" 17 #include "ui/events/event_utils.h"
13 #include "ui/events/gestures/gesture_configuration.h" 18 #include "ui/events/gestures/gesture_configuration.h"
14 #include "ui/events/gestures/gesture_sequence.h" 19 #include "ui/events/gestures/gesture_sequence.h"
15 #include "ui/events/gestures/gesture_types.h" 20 #include "ui/events/gestures/gesture_types.h"
16 21
17 namespace ui { 22 namespace ui {
18 23
19 namespace { 24 namespace {
20 25
21 template <typename T> 26 template <typename T>
(...skipping 25 matching lines...) Expand all
47 GestureConsumer* old_consumer, 52 GestureConsumer* old_consumer,
48 GestureConsumer* new_consumer, 53 GestureConsumer* new_consumer,
49 GestureRecognizerImpl::TouchIdToConsumerMap* map) { 54 GestureRecognizerImpl::TouchIdToConsumerMap* map) {
50 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin(); 55 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin();
51 i != map->end(); ++i) { 56 i != map->end(); ++i) {
52 if (i->second == old_consumer) 57 if (i->second == old_consumer)
53 i->second = new_consumer; 58 i->second = new_consumer;
54 } 59 }
55 } 60 }
56 61
62 GestureProviderAura* CreateGestureProvider(GestureProviderAuraClient* client) {
63 return new GestureProviderAura(client);
64 }
65
57 } // namespace 66 } // namespace
58 67
59 //////////////////////////////////////////////////////////////////////////////// 68 ////////////////////////////////////////////////////////////////////////////////
60 // GestureRecognizerImpl, public: 69 // GestureRecognizerImpl, public:
61 70
62 GestureRecognizerImpl::GestureRecognizerImpl() { 71 GestureRecognizerImpl::GestureRecognizerImpl()
72 : use_unified_gesture_detector_(CommandLine::ForCurrentProcess()->HasSwitch(
73 switches::kUseUnifiedGestureDetector)) {
63 } 74 }
64 75
65 GestureRecognizerImpl::~GestureRecognizerImpl() { 76 GestureRecognizerImpl::~GestureRecognizerImpl() {
66 STLDeleteValues(&consumer_sequence_); 77 STLDeleteValues(&consumer_sequence_);
78 STLDeleteValues(&consumer_gesture_provider_);
67 } 79 }
68 80
69 // Checks if this finger is already down, if so, returns the current target. 81 // Checks if this finger is already down, if so, returns the current target.
70 // Otherwise, returns NULL. 82 // Otherwise, returns NULL.
71 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget( 83 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget(
72 const TouchEvent& event) { 84 const TouchEvent& event) {
73 return touch_id_target_[event.touch_id()]; 85 return touch_id_target_[event.touch_id()];
74 } 86 }
75 87
76 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent( 88 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent(
77 const GestureEvent& event) { 89 const GestureEvent& event) {
78 GestureConsumer* target = NULL; 90 GestureConsumer* target = NULL;
79 int touch_id = event.GetLowestTouchId(); 91 int touch_id = event.GetLowestTouchId();
80 target = touch_id_target_for_gestures_[touch_id]; 92 target = touch_id_target_for_gestures_[touch_id];
81 return target; 93 return target;
82 } 94 }
83 95
84 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( 96 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation(
85 const gfx::PointF& location, int source_device_id) { 97 const gfx::PointF& location, int source_device_id) {
86 const GesturePoint* closest_point = NULL;
87 int64 closest_distance_squared = 0;
88 std::map<GestureConsumer*, GestureSequence*>::iterator i;
89 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
90 const GesturePoint* points = i->second->points();
91 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
92 if (!points[j].in_use() ||
93 source_device_id != points[j].source_device_id()) {
94 continue;
95 }
96 gfx::Vector2dF delta = points[j].last_touch_position() - location;
97 // Relative distance is all we need here, so LengthSquared() is
98 // appropriate, and cheaper than Length().
99 int64 distance_squared = delta.LengthSquared();
100 if (!closest_point || distance_squared < closest_distance_squared) {
101 closest_point = &points[j];
102 closest_distance_squared = distance_squared;
103 }
104 }
105 }
106
107 const int max_distance = 98 const int max_distance =
108 GestureConfiguration::max_separation_for_gesture_touches_in_pixels(); 99 GestureConfiguration::max_separation_for_gesture_touches_in_pixels();
109 100
110 if (closest_distance_squared < max_distance * max_distance && closest_point) 101 if (!use_unified_gesture_detector_) {
111 return touch_id_target_[closest_point->touch_id()]; 102 const GesturePoint* closest_point = NULL;
112 else 103 int64 closest_distance_squared = 0;
113 return NULL; 104 std::map<GestureConsumer*, GestureSequence*>::iterator i;
105 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
106 const GesturePoint* points = i->second->points();
107 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
108 if (!points[j].in_use() ||
109 source_device_id != points[j].source_device_id()) {
110 continue;
111 }
112 gfx::Vector2dF delta = points[j].last_touch_position() - location;
113 // Relative distance is all we need here, so LengthSquared() is
114 // appropriate, and cheaper than Length().
115 int64 distance_squared = delta.LengthSquared();
116 if (!closest_point || distance_squared < closest_distance_squared) {
117 closest_point = &points[j];
118 closest_distance_squared = distance_squared;
119 }
120 }
121 }
122
123 if (closest_distance_squared < max_distance * max_distance && closest_point)
124 return touch_id_target_[closest_point->touch_id()];
125 else
126 return NULL;
127 } else {
128 gfx::PointF closest_point;
129 int closest_touch_id;
130 float closest_distance_squared = std::numeric_limits<float>::infinity();
131
132 std::map<GestureConsumer*, GestureProviderAura*>::iterator i;
133 for (i = consumer_gesture_provider_.begin();
134 i != consumer_gesture_provider_.end();
135 ++i) {
136 const MotionEventAura& pointer_state = i->second->pointer_state();
137 for (size_t j = 0; j < pointer_state.GetPointerCount(); ++j) {
138 if (source_device_id != pointer_state.GetSourceDeviceId(j))
139 continue;
140 gfx::PointF point(pointer_state.GetX(j), pointer_state.GetY(j));
141 // Relative distance is all we need here, so LengthSquared() is
142 // appropriate, and cheaper than Length().
143 float distance_squared = (point - location).LengthSquared();
144 if (distance_squared < closest_distance_squared) {
145 closest_point = point;
146 closest_touch_id = pointer_state.GetPointerId(j);
147 closest_distance_squared = distance_squared;
148 }
149 }
150 }
151
152 if (closest_distance_squared < max_distance * max_distance)
153 return touch_id_target_[closest_touch_id];
154 else
155 return NULL;
156 }
114 } 157 }
115 158
116 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, 159 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
117 GestureConsumer* new_consumer) { 160 GestureConsumer* new_consumer) {
118 // Send cancel to all those save |new_consumer| and |current_consumer|. 161 // Send cancel to all those save |new_consumer| and |current_consumer|.
119 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL. 162 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL.
120 // Dispatching a touch-cancel event can end up altering |touch_id_target_| 163 // Dispatching a touch-cancel event can end up altering |touch_id_target_|
121 // (e.g. when the target of the event is destroyed, causing it to be removed 164 // (e.g. when the target of the event is destroyed, causing it to be removed
122 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list 165 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list
123 // of the touch-ids that need to be cancelled, and dispatch the cancel events 166 // of the touch-ids that need to be cancelled, and dispatch the cancel events
124 // for them at the end. 167 // for them at the end.
125 std::vector<std::pair<int, GestureConsumer*> > ids; 168 std::vector<std::pair<int, GestureConsumer*> > ids;
126 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin(); 169 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin();
127 i != touch_id_target_.end(); ++i) { 170 i != touch_id_target_.end(); ++i) {
128 if (i->second && i->second != new_consumer && 171 if (i->second && i->second != new_consumer &&
129 (i->second != current_consumer || new_consumer == NULL) && 172 (i->second != current_consumer || new_consumer == NULL) &&
130 i->second) { 173 i->second) {
131 ids.push_back(std::make_pair(i->first, i->second)); 174 ids.push_back(std::make_pair(i->first, i->second));
132 } 175 }
133 } 176 }
134 177
135 CancelTouches(&ids); 178 CancelTouches(&ids);
136 179
137 // Transfer events from |current_consumer| to |new_consumer|. 180 // Transfer events from |current_consumer| to |new_consumer|.
138 if (current_consumer && new_consumer) { 181 if (current_consumer && new_consumer) {
139 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 182 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
140 &touch_id_target_); 183 &touch_id_target_);
141 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 184 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
142 &touch_id_target_for_gestures_); 185 &touch_id_target_for_gestures_);
143 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_); 186 if (!use_unified_gesture_detector_)
187 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_);
188 else
189 TransferConsumer(
190 current_consumer, new_consumer, &consumer_gesture_provider_);
144 } 191 }
145 } 192 }
146 193
147 bool GestureRecognizerImpl::GetLastTouchPointForTarget( 194 bool GestureRecognizerImpl::GetLastTouchPointForTarget(
148 GestureConsumer* consumer, 195 GestureConsumer* consumer,
149 gfx::PointF* point) { 196 gfx::PointF* point) {
150 if (consumer_sequence_.count(consumer) == 0) 197 if (!use_unified_gesture_detector_) {
151 return false; 198 if (consumer_sequence_.count(consumer) == 0)
152 199 return false;
153 *point = consumer_sequence_[consumer]->last_touch_location(); 200 *point = consumer_sequence_[consumer]->last_touch_location();
154 return true; 201 return true;
202 } else {
203 if (consumer_gesture_provider_.count(consumer) == 0)
204 return false;
205 const MotionEvent& pointer_state =
206 consumer_gesture_provider_[consumer]->pointer_state();
207 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
208 return true;
209 }
155 } 210 }
156 211
157 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { 212 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
158 std::vector<std::pair<int, GestureConsumer*> > ids; 213 std::vector<std::pair<int, GestureConsumer*> > ids;
159 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin(); 214 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin();
160 i != touch_id_target_.end(); ++i) { 215 i != touch_id_target_.end(); ++i) {
161 if (i->second == consumer) 216 if (i->second == consumer)
162 ids.push_back(std::make_pair(i->first, i->second)); 217 ids.push_back(std::make_pair(i->first, i->second));
163 } 218 }
164 bool cancelled_touch = !ids.empty(); 219 bool cancelled_touch = !ids.empty();
(...skipping 15 matching lines...) Expand all
180 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer( 235 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer(
181 GestureConsumer* consumer) { 236 GestureConsumer* consumer) {
182 GestureSequence* gesture_sequence = consumer_sequence_[consumer]; 237 GestureSequence* gesture_sequence = consumer_sequence_[consumer];
183 if (!gesture_sequence) { 238 if (!gesture_sequence) {
184 gesture_sequence = CreateSequence(this); 239 gesture_sequence = CreateSequence(this);
185 consumer_sequence_[consumer] = gesture_sequence; 240 consumer_sequence_[consumer] = gesture_sequence;
186 } 241 }
187 return gesture_sequence; 242 return gesture_sequence;
188 } 243 }
189 244
245 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer(
246 GestureConsumer* consumer) {
247 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer];
248 if (!gesture_provider) {
249 gesture_provider = CreateGestureProvider(this);
250 consumer_gesture_provider_[consumer] = gesture_provider;
251 }
252 return gesture_provider;
253 }
254
190 void GestureRecognizerImpl::SetupTargets(const TouchEvent& event, 255 void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
191 GestureConsumer* target) { 256 GestureConsumer* target) {
192 if (event.type() == ui::ET_TOUCH_RELEASED || 257 if (event.type() == ui::ET_TOUCH_RELEASED ||
193 event.type() == ui::ET_TOUCH_CANCELLED) { 258 event.type() == ui::ET_TOUCH_CANCELLED) {
194 touch_id_target_.erase(event.touch_id()); 259 touch_id_target_.erase(event.touch_id());
195 } else if (event.type() == ui::ET_TOUCH_PRESSED) { 260 } else if (event.type() == ui::ET_TOUCH_PRESSED) {
196 touch_id_target_[event.touch_id()] = target; 261 touch_id_target_[event.touch_id()] = target;
197 if (target) 262 if (target)
198 touch_id_target_for_gestures_[event.touch_id()] = target; 263 touch_id_target_for_gestures_[event.touch_id()] = target;
199 } 264 }
200 } 265 }
201 266
202 void GestureRecognizerImpl::CancelTouches( 267 void GestureRecognizerImpl::CancelTouches(
203 std::vector<std::pair<int, GestureConsumer*> >* touches) { 268 std::vector<std::pair<int, GestureConsumer*> >* touches) {
204 while (!touches->empty()) { 269 while (!touches->empty()) {
205 int touch_id = touches->begin()->first; 270 int touch_id = touches->begin()->first;
206 GestureConsumer* target = touches->begin()->second; 271 GestureConsumer* target = touches->begin()->second;
207 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::PointF(0, 0), 272 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::PointF(0, 0),
208 ui::EF_IS_SYNTHESIZED, touch_id, 273 ui::EF_IS_SYNTHESIZED, touch_id,
209 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f); 274 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f);
210 GestureEventHelper* helper = FindDispatchHelperForConsumer(target); 275 GestureEventHelper* helper = FindDispatchHelperForConsumer(target);
211 if (helper) 276 if (helper)
212 helper->DispatchCancelTouchEvent(&touch_event); 277 helper->DispatchCancelTouchEvent(&touch_event);
213 touches->erase(touches->begin()); 278 touches->erase(touches->begin());
214 } 279 }
215 } 280 }
216 281
282 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
283 GestureConsumer* consumer = GetTargetForGestureEvent(*event);
284 if (consumer) {
285 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
286 if (helper)
287 helper->DispatchGestureEvent(event);
288 }
289 }
290
217 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( 291 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
218 const TouchEvent& event, 292 const TouchEvent& event,
219 ui::EventResult result, 293 ui::EventResult result,
220 GestureConsumer* target) { 294 GestureConsumer* target) {
221 SetupTargets(event, target); 295 SetupTargets(event, target);
222 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target); 296
223 return gesture_sequence->ProcessTouchEventForGesture(event, result); 297 if (!use_unified_gesture_detector_) {
298 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target);
299 return gesture_sequence->ProcessTouchEventForGesture(event, result);
300 } else {
301 GestureProviderAura* gesture_provider =
302 GetGestureProviderForConsumer(target);
303 // TODO(tdresser) - detect gestures eagerly.
304 if (!(result & ER_CONSUMED)) {
305 if (gesture_provider->OnTouchEvent(event))
306 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
307 }
308 return NULL;
309 }
224 } 310 }
225 311
226 bool GestureRecognizerImpl::CleanupStateForConsumer( 312 bool GestureRecognizerImpl::CleanupStateForConsumer(
227 GestureConsumer* consumer) { 313 GestureConsumer* consumer) {
228 bool state_cleaned_up = false; 314 bool state_cleaned_up = false;
229 if (consumer_sequence_.count(consumer)) { 315
230 state_cleaned_up = true; 316 if (!use_unified_gesture_detector_) {
231 delete consumer_sequence_[consumer]; 317 if (consumer_sequence_.count(consumer)) {
232 consumer_sequence_.erase(consumer); 318 state_cleaned_up = true;
319 delete consumer_sequence_[consumer];
320 consumer_sequence_.erase(consumer);
321 }
322 } else {
323 if (consumer_gesture_provider_.count(consumer)) {
324 state_cleaned_up = true;
325 // Don't immediately delete the GestureProvider, as we could be in the
326 // middle of dispatching a set of gestures.
327 base::MessageLoop::current()->DeleteSoon(
328 FROM_HERE, consumer_gesture_provider_[consumer]);
329 consumer_gesture_provider_.erase(consumer);
330 }
233 } 331 }
234 332
235 state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_); 333 state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_);
236 state_cleaned_up |= 334 state_cleaned_up |=
237 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); 335 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_);
238 return state_cleaned_up; 336 return state_cleaned_up;
239 } 337 }
240 338
241 void GestureRecognizerImpl::AddGestureEventHelper(GestureEventHelper* helper) { 339 void GestureRecognizerImpl::AddGestureEventHelper(GestureEventHelper* helper) {
242 helpers_.push_back(helper); 340 helpers_.push_back(helper);
243 } 341 }
244 342
245 void GestureRecognizerImpl::RemoveGestureEventHelper( 343 void GestureRecognizerImpl::RemoveGestureEventHelper(
246 GestureEventHelper* helper) { 344 GestureEventHelper* helper) {
247 std::vector<GestureEventHelper*>::iterator it = std::find(helpers_.begin(), 345 std::vector<GestureEventHelper*>::iterator it = std::find(helpers_.begin(),
248 helpers_.end(), helper); 346 helpers_.end(), helper);
249 if (it != helpers_.end()) 347 if (it != helpers_.end())
250 helpers_.erase(it); 348 helpers_.erase(it);
251 } 349 }
252 350
253 void GestureRecognizerImpl::DispatchPostponedGestureEvent(GestureEvent* event) { 351 void GestureRecognizerImpl::DispatchPostponedGestureEvent(GestureEvent* event) {
254 GestureConsumer* consumer = GetTargetForGestureEvent(*event); 352 DispatchGestureEvent(event);
255 if (consumer) { 353 }
256 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer); 354
257 if (helper) 355 void GestureRecognizerImpl::OnGestureEvent(GestureEvent* event) {
258 helper->DispatchPostponedGestureEvent(event); 356 DispatchGestureEvent(event);
259 }
260 } 357 }
261 358
262 GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer( 359 GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer(
263 GestureConsumer* consumer) { 360 GestureConsumer* consumer) {
264 std::vector<GestureEventHelper*>::iterator it; 361 std::vector<GestureEventHelper*>::iterator it;
265 for (it = helpers_.begin(); it != helpers_.end(); ++it) { 362 for (it = helpers_.begin(); it != helpers_.end(); ++it) {
266 if ((*it)->CanDispatchToConsumer(consumer)) 363 if ((*it)->CanDispatchToConsumer(consumer))
267 return (*it); 364 return (*it);
268 } 365 }
269 return NULL; 366 return NULL;
(...skipping 26 matching lines...) Expand all
296 std::vector<GestureEventHelper*>::iterator it; 393 std::vector<GestureEventHelper*>::iterator it;
297 for (it = helpers.begin(); it != helpers.end(); ++it) 394 for (it = helpers.begin(); it != helpers.end(); ++it)
298 gesture_recognizer->AddGestureEventHelper(*it); 395 gesture_recognizer->AddGestureEventHelper(*it);
299 396
300 helpers.clear(); 397 helpers.clear();
301 g_gesture_recognizer_instance = 398 g_gesture_recognizer_instance =
302 static_cast<GestureRecognizerImpl*>(gesture_recognizer); 399 static_cast<GestureRecognizerImpl*>(gesture_recognizer);
303 } 400 }
304 401
305 } // namespace ui 402 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | ui/events/gestures/gesture_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698