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