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

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

Issue 133273013: Consuming any touch move before SCROLL_START prevents the scroll from occuring in Aura (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address sadrul's comments. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « ui/events/gestures/gesture_sequence.h ('k') | ui/events/gestures/gestures.dot » ('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_sequence.h" 5 #include "ui/events/gestures/gesture_sequence.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 122
123 GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY = 123 GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY =
124 G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 0, TS_STATIONARY, TSI_ALWAYS), 124 G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 0, TS_STATIONARY, TSI_ALWAYS),
125 125
126 GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED = 126 GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED =
127 G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 0, TS_CANCELLED, TSI_ALWAYS), 127 G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 0, TS_CANCELLED, TSI_ALWAYS),
128 128
129 GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED = 129 GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED =
130 G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 1, TS_PRESSED, TSI_NOT_PROCESSED), 130 G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 1, TS_PRESSED, TSI_NOT_PROCESSED),
131 131
132 GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED =
133 G(GS_SYNTHETIC_CLICK_ABORTED, 0, TS_RELEASED, TSI_ALWAYS),
134
135 GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED =
136 G(GS_SYNTHETIC_CLICK_ABORTED, 1, TS_PRESSED, TSI_NOT_PROCESSED),
137
132 GST_SCROLL_FIRST_RELEASED = 138 GST_SCROLL_FIRST_RELEASED =
133 G(GS_SCROLL, 0, TS_RELEASED, TSI_ALWAYS), 139 G(GS_SCROLL, 0, TS_RELEASED, TSI_ALWAYS),
134 140
135 // Once scroll has started, process all touch-move events. 141 // Once scroll has started, process all touch-move events.
136 GST_SCROLL_FIRST_MOVED = 142 GST_SCROLL_FIRST_MOVED =
137 G(GS_SCROLL, 0, TS_MOVED, TSI_ALWAYS), 143 G(GS_SCROLL, 0, TS_MOVED, TSI_ALWAYS),
138 144
139 GST_SCROLL_FIRST_CANCELLED = 145 GST_SCROLL_FIRST_CANCELLED =
140 G(GS_SCROLL, 0, TS_CANCELLED, TSI_ALWAYS), 146 G(GS_SCROLL, 0, TS_CANCELLED, TSI_ALWAYS),
141 147
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED: 341 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
336 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY: 342 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY:
337 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED: 343 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED:
338 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED: 344 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED:
339 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED: 345 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED:
340 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED: 346 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED:
341 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_MOVED: 347 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_MOVED:
342 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY: 348 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY:
343 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED: 349 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED:
344 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED: 350 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED:
351 case GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED:
352 case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED:
345 case GST_SCROLL_FIRST_RELEASED: 353 case GST_SCROLL_FIRST_RELEASED:
346 case GST_SCROLL_FIRST_MOVED: 354 case GST_SCROLL_FIRST_MOVED:
347 case GST_SCROLL_FIRST_CANCELLED: 355 case GST_SCROLL_FIRST_CANCELLED:
348 case GST_SCROLL_SECOND_PRESSED: 356 case GST_SCROLL_SECOND_PRESSED:
349 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED: 357 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED:
350 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED_HANDLED: 358 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED_HANDLED:
351 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED: 359 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED:
352 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED_HANDLED: 360 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED_HANDLED:
353 case GST_PENDING_TWO_FINGER_TAP_FIRST_MOVED: 361 case GST_PENDING_TWO_FINGER_TAP_FIRST_MOVED:
354 case GST_PENDING_TWO_FINGER_TAP_SECOND_MOVED: 362 case GST_PENDING_TWO_FINGER_TAP_SECOND_MOVED:
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 ui::LatencyInfo* gesture_latency = (*it)->latency(); 475 ui::LatencyInfo* gesture_latency = (*it)->latency();
468 *gesture_latency = *touch_latency; 476 *gesture_latency = *touch_latency;
469 gesture_latency->trace_id = -1; 477 gesture_latency->trace_id = -1;
470 gesture_latency->terminated = false; 478 gesture_latency->terminated = false;
471 gesture_latency->RemoveLatency( 479 gesture_latency->RemoveLatency(
472 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT); 480 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT);
473 } 481 }
474 } 482 }
475 } 483 }
476 484
485 bool GestureStateSupportsActiveTimer(GestureState state) {
486 switch(state) {
487 case GS_PENDING_SYNTHETIC_CLICK:
488 case GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL:
489 return true;
490 default:
491 return false;
492 }
493 }
494
477 } // namespace 495 } // namespace
478 496
479 //////////////////////////////////////////////////////////////////////////////// 497 ////////////////////////////////////////////////////////////////////////////////
480 // GestureSequence Public: 498 // GestureSequence Public:
481 499
482 GestureSequence::GestureSequence(GestureSequenceDelegate* delegate) 500 GestureSequence::GestureSequence(GestureSequenceDelegate* delegate)
483 : state_(GS_NO_GESTURE), 501 : state_(GS_NO_GESTURE),
484 flags_(0), 502 flags_(0),
485 pinch_distance_start_(0.f), 503 pinch_distance_start_(0.f),
486 pinch_distance_current_(0.f), 504 pinch_distance_current_(0.f),
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 568
551 switch (signature) { 569 switch (signature) {
552 case GST_INVALID: 570 case GST_INVALID:
553 break; 571 break;
554 572
555 case GST_NO_GESTURE_FIRST_PRESSED: 573 case GST_NO_GESTURE_FIRST_PRESSED:
556 TouchDown(event, point, gestures.get()); 574 TouchDown(event, point, gestures.get());
557 set_state(GS_PENDING_SYNTHETIC_CLICK); 575 set_state(GS_PENDING_SYNTHETIC_CLICK);
558 break; 576 break;
559 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED: 577 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED:
578 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED:
560 if (Click(event, point, gestures.get())) 579 if (Click(event, point, gestures.get()))
561 point.UpdateForTap(); 580 point.UpdateForTap();
562 else 581 else
563 PrependTapCancelGestureEvent(point, gestures.get()); 582 PrependTapCancelGestureEvent(point, gestures.get());
564 set_state(GS_NO_GESTURE); 583 set_state(GS_NO_GESTURE);
565 break; 584 break;
566 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED: 585 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED:
567 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY: 586 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY:
568 if (ScrollStart(event, point, gestures.get())) { 587 if (ScrollStart(event, point, gestures.get())) {
569 PrependTapCancelGestureEvent(point, gestures.get()); 588 PrependTapCancelGestureEvent(point, gestures.get());
570 set_state(GS_SCROLL); 589 set_state(GS_SCROLL);
571 if (ScrollUpdate(event, point, gestures.get())) 590 if (ScrollUpdate(event, point, gestures.get()))
572 point.UpdateForScroll(); 591 point.UpdateForScroll();
573 } 592 }
574 break; 593 break;
594 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
575 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_MOVED: 595 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_MOVED:
576 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY: 596 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY:
577 // No scrolling allowed, so nothing happens.
578 break;
579 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
580 if (point.IsInScrollWindow(event)) { 597 if (point.IsInScrollWindow(event)) {
581 PrependTapCancelGestureEvent(point, gestures.get()); 598 PrependTapCancelGestureEvent(point, gestures.get());
599 set_state(GS_SYNTHETIC_CLICK_ABORTED);
600 } else {
582 set_state(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL); 601 set_state(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL);
583 } 602 }
584 break; 603 break;
585 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED: 604 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED:
586 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED: 605 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED:
606 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED:
607 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED:
587 PrependTapCancelGestureEvent(point, gestures.get()); 608 PrependTapCancelGestureEvent(point, gestures.get());
588 set_state(GS_NO_GESTURE); 609 set_state(GS_NO_GESTURE);
589 break; 610 break;
590 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED: 611 case GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED:
591 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED:
592 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED:
593 set_state(GS_NO_GESTURE); 612 set_state(GS_NO_GESTURE);
594 break; 613 break;
595 case GST_SCROLL_FIRST_MOVED: 614 case GST_SCROLL_FIRST_MOVED:
596 if (scroll_type_ == ST_VERTICAL || 615 if (scroll_type_ == ST_VERTICAL ||
597 scroll_type_ == ST_HORIZONTAL) 616 scroll_type_ == ST_HORIZONTAL)
598 BreakRailScroll(event, point, gestures.get()); 617 BreakRailScroll(event, point, gestures.get());
599 if (ScrollUpdate(event, point, gestures.get())) 618 if (ScrollUpdate(event, point, gestures.get()))
600 point.UpdateForScroll(); 619 point.UpdateForScroll();
601 break; 620 break;
602 case GST_SCROLL_FIRST_RELEASED: 621 case GST_SCROLL_FIRST_RELEASED:
603 case GST_SCROLL_FIRST_CANCELLED: 622 case GST_SCROLL_FIRST_CANCELLED:
604 ScrollEnd(event, point, gestures.get()); 623 ScrollEnd(event, point, gestures.get());
605 set_state(GS_NO_GESTURE); 624 set_state(GS_NO_GESTURE);
606 break; 625 break;
607 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED: 626 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED:
627 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED:
608 PrependTapCancelGestureEvent(point, gestures.get()); 628 PrependTapCancelGestureEvent(point, gestures.get());
609 TwoFingerTapOrPinch(event, point, gestures.get()); 629 TwoFingerTapOrPinch(event, point, gestures.get());
610 break; 630 break;
611 case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED: 631 case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED:
612 TwoFingerTapOrPinch(event, point, gestures.get()); 632 TwoFingerTapOrPinch(event, point, gestures.get());
613 break; 633 break;
614 case GST_SCROLL_SECOND_PRESSED: 634 case GST_SCROLL_SECOND_PRESSED:
615 PinchStart(event, point, gestures.get()); 635 PinchStart(event, point, gestures.get());
616 set_state(GS_PINCH); 636 set_state(GS_PINCH);
617 break; 637 break;
618 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED: 638 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED:
619 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED: 639 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED:
620 TwoFingerTouchReleased(event, point, gestures.get()); 640 TwoFingerTouchReleased(event, point, gestures.get());
621 set_state(GS_SCROLL); 641 set_state(GS_SCROLL);
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 764
745 if (event.type() == ui::ET_TOUCH_RELEASED || 765 if (event.type() == ui::ET_TOUCH_RELEASED ||
746 event.type() == ui::ET_TOUCH_CANCELLED) 766 event.type() == ui::ET_TOUCH_CANCELLED)
747 AppendEndGestureEvent(point, gestures.get()); 767 AppendEndGestureEvent(point, gestures.get());
748 768
749 if (state_ != last_state) 769 if (state_ != last_state)
750 DVLOG(4) << "Gesture Sequence" 770 DVLOG(4) << "Gesture Sequence"
751 << " State: " << state_ 771 << " State: " << state_
752 << " touch id: " << event.touch_id(); 772 << " touch id: " << event.touch_id();
753 773
754 if (last_state == GS_PENDING_SYNTHETIC_CLICK && state_ != last_state) { 774 // If the state has changed from one in which a long/show press is possible to
775 // one in which they are not possible, cancel the timers.
776 if (GestureStateSupportsActiveTimer(last_state) &&
777 !GestureStateSupportsActiveTimer(state_)) {
755 GetLongPressTimer()->Stop(); 778 GetLongPressTimer()->Stop();
756 GetShowPressTimer()->Stop(); 779 GetShowPressTimer()->Stop();
757 } 780 }
758 781
759 // The set of point_ids must be contiguous and include 0. 782 // The set of point_ids must be contiguous and include 0.
760 // When a touch point is released, all points with ids greater than the 783 // When a touch point is released, all points with ids greater than the
761 // released point must have their ids decremented, or the set of point_ids 784 // released point must have their ids decremented, or the set of point_ids
762 // could end up with gaps. 785 // could end up with gaps.
763 if (event.type() == ui::ET_TOUCH_RELEASED || 786 if (event.type() == ui::ET_TOUCH_RELEASED ||
764 event.type() == ui::ET_TOUCH_CANCELLED) { 787 event.type() == ui::ET_TOUCH_CANCELLED) {
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 rect.height()), 1118 rect.height()),
1096 point->enclosing_rectangle().CenterPoint(), 1119 point->enclosing_rectangle().CenterPoint(),
1097 flags_, 1120 flags_,
1098 base::Time::FromDoubleT(point->last_touch_time()), 1121 base::Time::FromDoubleT(point->last_touch_time()),
1099 1 << point->touch_id())); 1122 1 << point->touch_id()));
1100 } 1123 }
1101 1124
1102 bool GestureSequence::Click(const TouchEvent& event, 1125 bool GestureSequence::Click(const TouchEvent& event,
1103 const GesturePoint& point, 1126 const GesturePoint& point,
1104 Gestures* gestures) { 1127 Gestures* gestures) {
1105 DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK); 1128 DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK ||
1129 state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL);
1106 if (point.IsInClickWindow(event)) { 1130 if (point.IsInClickWindow(event)) {
1107 int tap_count = 1; 1131 int tap_count = 1;
1108 if (point.IsInTripleClickWindow(event)) 1132 if (point.IsInTripleClickWindow(event))
1109 tap_count = 3; 1133 tap_count = 3;
1110 else if (point.IsInDoubleClickWindow(event)) 1134 else if (point.IsInDoubleClickWindow(event))
1111 tap_count = 2; 1135 tap_count = 2;
1112 if (tap_count == 1 && GetShowPressTimer()->IsRunning()) { 1136 if (tap_count == 1 && GetShowPressTimer()->IsRunning()) {
1113 GetShowPressTimer()->Stop(); 1137 GetShowPressTimer()->Stop();
1114 AppendShowPressGestureEvent(); 1138 AppendShowPressGestureEvent();
1115 } 1139 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 &GestureSequence::AppendShowPressGestureEvent); 1204 &GestureSequence::AppendShowPressGestureEvent);
1181 1205
1182 return true; 1206 return true;
1183 } 1207 }
1184 1208
1185 bool GestureSequence::TwoFingerTouchDown(const TouchEvent& event, 1209 bool GestureSequence::TwoFingerTouchDown(const TouchEvent& event,
1186 const GesturePoint& point, 1210 const GesturePoint& point,
1187 Gestures* gestures) { 1211 Gestures* gestures) {
1188 DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK || 1212 DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK ||
1189 state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL || 1213 state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL ||
1214 state_ == GS_SYNTHETIC_CLICK_ABORTED ||
1190 state_ == GS_SCROLL); 1215 state_ == GS_SCROLL);
1191 1216
1192 if (state_ == GS_SCROLL) { 1217 if (state_ == GS_SCROLL) {
1193 AppendScrollGestureEnd(point, point.last_touch_position(), gestures, 1218 AppendScrollGestureEnd(point, point.last_touch_position(), gestures,
1194 0.f, 0.f); 1219 0.f, 0.f);
1195 } 1220 }
1196 second_touch_time_ = event.time_stamp(); 1221 second_touch_time_ = event.time_stamp();
1197 return true; 1222 return true;
1198 } 1223 }
1199 1224
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 // Since a timer is running, there should be a non-NULL point. 1465 // Since a timer is running, there should be a non-NULL point.
1441 const GesturePoint* point = GetPointByPointId(0); 1466 const GesturePoint* point = GetPointByPointId(0);
1442 if (!ui::gestures::IsInsideManhattanSquare(point->first_touch_position(), 1467 if (!ui::gestures::IsInsideManhattanSquare(point->first_touch_position(),
1443 event.location())) { 1468 event.location())) {
1444 GetLongPressTimer()->Stop(); 1469 GetLongPressTimer()->Stop();
1445 GetShowPressTimer()->Stop(); 1470 GetShowPressTimer()->Stop();
1446 } 1471 }
1447 } 1472 }
1448 1473
1449 } // namespace ui 1474 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/gestures/gesture_sequence.h ('k') | ui/events/gestures/gestures.dot » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698