| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/gesture_detection/touch_disposition_gesture_filter.h" | 5 #include "ui/events/gesture_detection/touch_disposition_gesture_filter.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "ui/events/gesture_event_details.h" | 9 #include "ui/events/gesture_event_details.h" |
| 10 | 10 |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 return; | 176 return; |
| 177 | 177 |
| 178 if (Head().empty()) | 178 if (Head().empty()) |
| 179 PopGestureSequence(); | 179 PopGestureSequence(); |
| 180 | 180 |
| 181 GestureSequence& sequence = Head(); | 181 GestureSequence& sequence = Head(); |
| 182 | 182 |
| 183 // Dispatch the packet corresponding to the ack'ed touch, as well as any | 183 // Dispatch the packet corresponding to the ack'ed touch, as well as any |
| 184 // additional timeout-based packets queued before the ack was received. | 184 // additional timeout-based packets queued before the ack was received. |
| 185 bool touch_packet_for_current_ack_handled = false; | 185 bool touch_packet_for_current_ack_handled = false; |
| 186 bool sequence_cancelled = false; |
| 186 while (!sequence.empty()) { | 187 while (!sequence.empty()) { |
| 187 DCHECK_NE(sequence.front().gesture_source(), | 188 DCHECK_NE(sequence.front().gesture_source(), |
| 188 GestureEventDataPacket::UNDEFINED); | 189 GestureEventDataPacket::UNDEFINED); |
| 189 DCHECK_NE(sequence.front().gesture_source(), | 190 DCHECK_NE(sequence.front().gesture_source(), |
| 190 GestureEventDataPacket::INVALID); | 191 GestureEventDataPacket::INVALID); |
| 191 | 192 |
| 192 GestureEventDataPacket::GestureSource source = | 193 GestureEventDataPacket::GestureSource source = |
| 193 sequence.front().gesture_source(); | 194 sequence.front().gesture_source(); |
| 194 if (source != GestureEventDataPacket::TOUCH_TIMEOUT) { | 195 if (source != GestureEventDataPacket::TOUCH_TIMEOUT) { |
| 195 // We should handle at most one non-timeout based packet. | 196 // We should handle at most one non-timeout based packet. |
| 196 if (touch_packet_for_current_ack_handled) | 197 if (touch_packet_for_current_ack_handled) |
| 197 break; | 198 break; |
| 198 state_.OnTouchEventAck(event_consumed, IsTouchStartEvent(source)); | 199 state_.OnTouchEventAck(event_consumed, IsTouchStartEvent(source)); |
| 199 touch_packet_for_current_ack_handled = true; | 200 touch_packet_for_current_ack_handled = true; |
| 201 sequence_cancelled = |
| 202 source == GestureEventDataPacket::TOUCH_SEQUENCE_CANCEL; |
| 200 } | 203 } |
| 201 // We need to pop the current sequence before sending the packet, because | 204 // We need to pop the current sequence before sending the packet, because |
| 202 // sending the packet could result in this method being re-entered (e.g. on | 205 // sending the packet could result in this method being re-entered (e.g. on |
| 203 // Aura, we could trigger a touch-cancel). As popping the sequence destroys | 206 // Aura, we could trigger a touch-cancel). As popping the sequence destroys |
| 204 // the packet, we copy the packet before popping it. | 207 // the packet, we copy the packet before popping it. |
| 205 const GestureEventDataPacket packet = sequence.front(); | 208 const GestureEventDataPacket packet = sequence.front(); |
| 206 sequence.pop(); | 209 sequence.pop(); |
| 207 FilterAndSendPacket(packet); | 210 FilterAndSendPacket(packet); |
| 208 } | 211 } |
| 212 |
| 213 if (sequence.empty() && sequence_cancelled) |
| 214 PopGestureSequence(); |
| 215 |
| 209 DCHECK(touch_packet_for_current_ack_handled); | 216 DCHECK(touch_packet_for_current_ack_handled); |
| 210 } | 217 } |
| 211 | 218 |
| 212 bool TouchDispositionGestureFilter::IsEmpty() const { | 219 bool TouchDispositionGestureFilter::IsEmpty() const { |
| 213 return sequences_.empty(); | 220 return sequences_.empty(); |
| 214 } | 221 } |
| 215 | 222 |
| 216 void TouchDispositionGestureFilter::FilterAndSendPacket( | 223 void TouchDispositionGestureFilter::FilterAndSendPacket( |
| 217 const GestureEventDataPacket& packet) { | 224 const GestureEventDataPacket& packet) { |
| 218 if (packet.gesture_source() == GestureEventDataPacket::TOUCH_SEQUENCE_START) { | 225 if (packet.gesture_source() == GestureEventDataPacket::TOUCH_SEQUENCE_START) { |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 last_gesture_of_type_dropped_.has_bit( | 425 last_gesture_of_type_dropped_.has_bit( |
| 419 GetGestureTypeIndex(antecedent_event_type)))) { | 426 GetGestureTypeIndex(antecedent_event_type)))) { |
| 420 last_gesture_of_type_dropped_.mark_bit(GetGestureTypeIndex(gesture_type)); | 427 last_gesture_of_type_dropped_.mark_bit(GetGestureTypeIndex(gesture_type)); |
| 421 return true; | 428 return true; |
| 422 } | 429 } |
| 423 last_gesture_of_type_dropped_.clear_bit(GetGestureTypeIndex(gesture_type)); | 430 last_gesture_of_type_dropped_.clear_bit(GetGestureTypeIndex(gesture_type)); |
| 424 return false; | 431 return false; |
| 425 } | 432 } |
| 426 | 433 |
| 427 } // namespace content | 434 } // namespace content |
| OLD | NEW |