1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/touch_disposition_gesture_filter.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/auto_reset.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/gesture_event_details.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// A BitSet32 is used for tracking dropped gesture types.
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)COMPILE_ASSERT(ET_GESTURE_TYPE_END - ET_GESTURE_TYPE_START < 32,
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               gesture_type_count_too_large);
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGestureEventData CreateGesture(EventType type,
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               int motion_event_id,
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               MotionEvent::ToolType primary_tool_type,
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                               const GestureEventDataPacket& packet) {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // As the event is purely synthetic, we needn't be strict with event flags.
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int flags = EF_NONE;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return GestureEventData(GestureEventDetails(type),
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          motion_event_id,
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          primary_tool_type,
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          packet.timestamp(),
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          packet.touch_location().x(),
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          packet.touch_location().y(),
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          packet.raw_touch_location().x(),
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          packet.raw_touch_location().y(),
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          1,
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          gfx::RectF(packet.touch_location(), gfx::SizeF()),
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          flags);
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)enum RequiredTouches {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RT_NONE = 0,
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RT_START = 1 << 0,
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RT_CURRENT = 1 << 1,
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct DispositionHandlingInfo {
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A bitwise-OR of |RequiredTouches|.
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int required_touches;
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EventType antecedent_event_type;
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  explicit DispositionHandlingInfo(int required_touches)
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      : required_touches(required_touches), antecedent_event_type(ET_UNKNOWN) {}
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DispositionHandlingInfo(int required_touches,
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          EventType antecedent_event_type)
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : required_touches(required_touches),
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        antecedent_event_type(antecedent_event_type) {}
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DispositionHandlingInfo Info(int required_touches) {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return DispositionHandlingInfo(required_touches);
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DispositionHandlingInfo Info(int required_touches,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             EventType antecedent_event_type) {
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return DispositionHandlingInfo(required_touches, antecedent_event_type);
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This approach to disposition handling is described at http://goo.gl/5G8PWJ.
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DispositionHandlingInfo GetDispositionHandlingInfo(EventType type) {
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (type) {
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP_DOWN:
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START);
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP_CANCEL:
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START);
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_SHOW_PRESS:
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START);
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_LONG_PRESS:
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START);
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_LONG_TAP:
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START | RT_CURRENT);
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP:
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START | RT_CURRENT, ET_GESTURE_TAP_UNCONFIRMED);
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP_UNCONFIRMED:
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START | RT_CURRENT);
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_DOUBLE_TAP:
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START | RT_CURRENT, ET_GESTURE_TAP_UNCONFIRMED);
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_SCROLL_BEGIN:
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return Info(RT_START);
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_SCROLL_UPDATE:
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_CURRENT, ET_GESTURE_SCROLL_BEGIN);
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_SCROLL_END:
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_NONE, ET_GESTURE_SCROLL_BEGIN);
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_SCROLL_FLING_START:
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // We rely on |EndScrollGestureIfNecessary| to end the scroll if the fling
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // start is prevented.
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return Info(RT_NONE, ET_GESTURE_SCROLL_UPDATE);
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_SCROLL_FLING_CANCEL:
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_NONE, ET_SCROLL_FLING_START);
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_PINCH_BEGIN:
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_START, ET_GESTURE_SCROLL_BEGIN);
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_PINCH_UPDATE:
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_CURRENT, ET_GESTURE_PINCH_BEGIN);
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_PINCH_END:
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return Info(RT_NONE, ET_GESTURE_PINCH_BEGIN);
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case ET_GESTURE_BEGIN:
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return Info(RT_START);
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case ET_GESTURE_END:
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return Info(RT_NONE, ET_GESTURE_BEGIN);
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_GESTURE_SWIPE:
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return Info(RT_START, ET_GESTURE_SCROLL_BEGIN);
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_GESTURE_TWO_FINGER_TAP:
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return Info(RT_START);
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    default:
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED();
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return Info(RT_NONE);
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int GetGestureTypeIndex(EventType type) {
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK_GE(type, ET_GESTURE_TYPE_START);
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK_LE(type, ET_GESTURE_TYPE_END);
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return type - ET_GESTURE_TYPE_START;
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsTouchStartEvent(GestureEventDataPacket::GestureSource gesture_source) {
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return gesture_source == GestureEventDataPacket::TOUCH_SEQUENCE_START ||
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         gesture_source == GestureEventDataPacket::TOUCH_START;
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TouchDispositionGestureFilter
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::TouchDispositionGestureFilter(
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TouchDispositionGestureFilterClient* client)
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : client_(client),
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ending_event_motion_event_id_(0),
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ending_event_primary_tool_type_(MotionEvent::TOOL_TYPE_UNKNOWN),
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_tap_ending_event_(false),
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      needs_show_press_event_(false),
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_fling_ending_event_(false),
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      needs_scroll_ending_event_(false) {
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(client_);
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TouchDispositionGestureFilter::~TouchDispositionGestureFilter() {
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::PacketResult
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::OnGesturePacket(
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GestureEventDataPacket& packet) {
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (packet.gesture_source() == GestureEventDataPacket::UNDEFINED ||
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      packet.gesture_source() == GestureEventDataPacket::INVALID)
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return INVALID_PACKET_TYPE;
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (packet.gesture_source() == GestureEventDataPacket::TOUCH_SEQUENCE_START)
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sequences_.push(GestureSequence());
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsEmpty())
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return INVALID_PACKET_ORDER;
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (packet.gesture_source() == GestureEventDataPacket::TOUCH_TIMEOUT &&
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Tail().empty()) {
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Handle the timeout packet immediately if the packet preceding the timeout
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // has already been dispatched.
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FilterAndSendPacket(packet);
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return SUCCESS;
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Tail().push(packet);
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return SUCCESS;
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TouchDispositionGestureFilter::OnTouchEventAck(bool event_consumed) {
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Spurious touch acks from the renderer should not trigger a crash.
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsEmpty() || (Head().empty() && sequences_.size() == 1))
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (Head().empty())
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    PopGestureSequence();
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureSequence& sequence = Head();
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Dispatch the packet corresponding to the ack'ed touch, as well as any
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // additional timeout-based packets queued before the ack was received.
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool touch_packet_for_current_ack_handled = false;
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  while (!sequence.empty()) {
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK_NE(sequence.front().gesture_source(),
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              GestureEventDataPacket::UNDEFINED);
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK_NE(sequence.front().gesture_source(),
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              GestureEventDataPacket::INVALID);
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    GestureEventDataPacket::GestureSource source =
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        sequence.front().gesture_source();
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (source != GestureEventDataPacket::TOUCH_TIMEOUT) {
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // We should handle at most one non-timeout based packet.
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (touch_packet_for_current_ack_handled)
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      state_.OnTouchEventAck(event_consumed, IsTouchStartEvent(source));
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      touch_packet_for_current_ack_handled = true;
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // We need to pop the current sequence before sending the packet, because
2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // sending the packet could result in this method being re-entered (e.g. on
2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Aura, we could trigger a touch-cancel). As popping the sequence destroys
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // the packet, we copy the packet before popping it.
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const GestureEventDataPacket packet = sequence.front();
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sequence.pop();
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    FilterAndSendPacket(packet);
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(touch_packet_for_current_ack_handled);
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool TouchDispositionGestureFilter::IsEmpty() const {
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return sequences_.empty();
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TouchDispositionGestureFilter::FilterAndSendPacket(
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GestureEventDataPacket& packet) {
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (packet.gesture_source() == GestureEventDataPacket::TOUCH_SEQUENCE_START) {
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CancelTapIfNecessary(packet);
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EndScrollIfNecessary(packet);
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CancelFlingIfNecessary(packet);
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (packet.gesture_source() == GestureEventDataPacket::TOUCH_START) {
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CancelTapIfNecessary(packet);
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int gesture_end_index = -1;
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < packet.gesture_count(); ++i) {
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GestureEventData& gesture = packet.gesture(i);
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK_GE(gesture.details.type(), ET_GESTURE_TYPE_START);
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK_LE(gesture.details.type(), ET_GESTURE_TYPE_END);
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (state_.Filter(gesture.details.type())) {
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelTapIfNecessary(packet);
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      continue;
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (packet.gesture_source() == GestureEventDataPacket::TOUCH_TIMEOUT) {
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // Sending a timed gesture could delete |this|, so we need to return
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // directly after the |SendGesture| call.
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SendGesture(gesture, packet);
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // We should not have a timeout gesture and other gestures in the same
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // packet.
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DCHECK_EQ(1U, packet.gesture_count());
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return;
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Occasionally scroll or tap cancel events are synthesized when a touch
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // sequence has been canceled or terminated, we want to make sure that
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // ET_GESTURE_END always happens after them.
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (gesture.type() == ET_GESTURE_END) {
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Make sure there is at most one ET_GESTURE_END event in each packet.
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DCHECK_EQ(-1, gesture_end_index);
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gesture_end_index = static_cast<int>(i);
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SendGesture(gesture, packet);
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (packet.gesture_source() ==
2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GestureEventDataPacket::TOUCH_SEQUENCE_CANCEL) {
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EndScrollIfNecessary(packet);
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CancelTapIfNecessary(packet);
2595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else if (packet.gesture_source() ==
2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu             GestureEventDataPacket::TOUCH_SEQUENCE_END) {
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EndScrollIfNecessary(packet);
2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Always send the ET_GESTURE_END event as the last one for every touch event.
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (gesture_end_index >= 0)
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SendGesture(packet.gesture(gesture_end_index), packet);
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TouchDispositionGestureFilter::SendGesture(
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GestureEventData& event,
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GestureEventDataPacket& packet_being_sent) {
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(jdduke): Factor out gesture stream reparation code into a standalone
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // utility class.
273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (event.type()) {
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_LONG_TAP:
275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (!needs_tap_ending_event_)
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        return;
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelTapIfNecessary(packet_being_sent);
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelFlingIfNecessary(packet_being_sent);
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP_DOWN:
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK(!needs_tap_ending_event_);
282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ending_event_motion_event_id_ = event.motion_event_id;
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ending_event_primary_tool_type_ = event.primary_tool_type;
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      needs_show_press_event_ = true;
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_tap_ending_event_ = true;
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case ET_GESTURE_SHOW_PRESS:
288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (!needs_show_press_event_)
289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        return;
290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      needs_show_press_event_ = false;
291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      break;
292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case ET_GESTURE_DOUBLE_TAP:
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelTapIfNecessary(packet_being_sent);
294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      needs_show_press_event_ = false;
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      break;
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP:
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DCHECK(needs_tap_ending_event_);
298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (needs_show_press_event_) {
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        SendGesture(GestureEventData(ET_GESTURE_SHOW_PRESS, event),
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    packet_being_sent);
301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        DCHECK(!needs_show_press_event_);
302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      }
303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      needs_tap_ending_event_ = false;
304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      break;
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_TAP_CANCEL:
306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      needs_show_press_event_ = false;
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_tap_ending_event_ = false;
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_SCROLL_BEGIN:
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelTapIfNecessary(packet_being_sent);
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelFlingIfNecessary(packet_being_sent);
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EndScrollIfNecessary(packet_being_sent);
313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ending_event_motion_event_id_ = event.motion_event_id;
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ending_event_primary_tool_type_ = event.primary_tool_type;
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_scroll_ending_event_ = true;
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_GESTURE_SCROLL_END:
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_scroll_ending_event_ = false;
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_SCROLL_FLING_START:
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CancelFlingIfNecessary(packet_being_sent);
322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ending_event_motion_event_id_ = event.motion_event_id;
3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ending_event_primary_tool_type_ = event.primary_tool_type;
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_fling_ending_event_ = true;
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_scroll_ending_event_ = false;
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ET_SCROLL_FLING_CANCEL:
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      needs_fling_ending_event_ = false;
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    default:
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  client_->ForwardGestureEvent(event);
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TouchDispositionGestureFilter::CancelTapIfNecessary(
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GestureEventDataPacket& packet_being_sent) {
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!needs_tap_ending_event_)
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendGesture(CreateGesture(ET_GESTURE_TAP_CANCEL,
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            ending_event_motion_event_id_,
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            ending_event_primary_tool_type_,
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            packet_being_sent),
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              packet_being_sent);
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!needs_tap_ending_event_);
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TouchDispositionGestureFilter::CancelFlingIfNecessary(
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GestureEventDataPacket& packet_being_sent) {
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!needs_fling_ending_event_)
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendGesture(CreateGesture(ET_SCROLL_FLING_CANCEL,
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            ending_event_motion_event_id_,
3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            ending_event_primary_tool_type_,
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            packet_being_sent),
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              packet_being_sent);
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!needs_fling_ending_event_);
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TouchDispositionGestureFilter::EndScrollIfNecessary(
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GestureEventDataPacket& packet_being_sent) {
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!needs_scroll_ending_event_)
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendGesture(CreateGesture(ET_GESTURE_SCROLL_END,
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            ending_event_motion_event_id_,
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            ending_event_primary_tool_type_,
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            packet_being_sent),
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              packet_being_sent);
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!needs_scroll_ending_event_);
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid TouchDispositionGestureFilter::PopGestureSequence() {
376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(Head().empty());
377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  state_ = GestureHandlingState();
378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sequences_.pop();
379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::GestureSequence&
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::Head() {
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!sequences_.empty());
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return sequences_.front();
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::GestureSequence&
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::Tail() {
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!sequences_.empty());
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return sequences_.back();
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TouchDispositionGestureFilter::GestureHandlingState
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TouchDispositionGestureFilter::GestureHandlingState::GestureHandlingState()
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : start_touch_consumed_(false),
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      current_touch_consumed_(false) {}
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TouchDispositionGestureFilter::GestureHandlingState::OnTouchEventAck(
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool event_consumed,
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool is_touch_start_event) {
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  current_touch_consumed_ = event_consumed;
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (event_consumed && is_touch_start_event)
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    start_touch_consumed_ = true;
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool TouchDispositionGestureFilter::GestureHandlingState::Filter(
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EventType gesture_type) {
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DispositionHandlingInfo disposition_handling_info =
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetDispositionHandlingInfo(gesture_type);
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int required_touches = disposition_handling_info.required_touches;
4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventType antecedent_event_type =
4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      disposition_handling_info.antecedent_event_type;
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((required_touches & RT_START && start_touch_consumed_) ||
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      (required_touches & RT_CURRENT && current_touch_consumed_) ||
4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      (antecedent_event_type != ET_UNKNOWN &&
4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch       last_gesture_of_type_dropped_.has_bit(
4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch           GetGestureTypeIndex(antecedent_event_type)))) {
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    last_gesture_of_type_dropped_.mark_bit(GetGestureTypeIndex(gesture_type));
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return true;
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  last_gesture_of_type_dropped_.clear_bit(GetGestureTypeIndex(gesture_type));
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace content
428