Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 return GestureEventData(GestureEventDetails(type), | 26 return GestureEventData(GestureEventDetails(type), |
| 27 motion_event_id, | 27 motion_event_id, |
| 28 primary_tool_type, | 28 primary_tool_type, |
| 29 packet.timestamp(), | 29 packet.timestamp(), |
| 30 packet.touch_location().x(), | 30 packet.touch_location().x(), |
| 31 packet.touch_location().y(), | 31 packet.touch_location().y(), |
| 32 packet.raw_touch_location().x(), | 32 packet.raw_touch_location().x(), |
| 33 packet.raw_touch_location().y(), | 33 packet.raw_touch_location().y(), |
| 34 1, | 34 1, |
| 35 gfx::RectF(packet.touch_location(), gfx::SizeF()), | 35 gfx::RectF(packet.touch_location(), gfx::SizeF()), |
| 36 flags); | 36 flags, |
| 37 0U); | |
| 37 } | 38 } |
| 38 | 39 |
| 39 enum RequiredTouches { | 40 enum RequiredTouches { |
| 40 RT_NONE = 0, | 41 RT_NONE = 0, |
| 41 RT_START = 1 << 0, | 42 RT_START = 1 << 0, |
| 42 RT_CURRENT = 1 << 1, | 43 RT_CURRENT = 1 << 1, |
| 43 }; | 44 }; |
| 44 | 45 |
| 45 struct DispositionHandlingInfo { | 46 struct DispositionHandlingInfo { |
| 46 // A bitwise-OR of |RequiredTouches|. | 47 // A bitwise-OR of |RequiredTouches|. |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 180 if (!Head().empty()) { | 181 if (!Head().empty()) { |
| 181 DCHECK_NE(packet.unique_touch_event_id(), | 182 DCHECK_NE(packet.unique_touch_event_id(), |
| 182 Head().front().unique_touch_event_id()); | 183 Head().front().unique_touch_event_id()); |
| 183 | 184 |
| 184 } | 185 } |
| 185 | 186 |
| 186 Tail().push(packet); | 187 Tail().push(packet); |
| 187 return SUCCESS; | 188 return SUCCESS; |
| 188 } | 189 } |
| 189 | 190 |
| 190 void TouchDispositionGestureFilter::OnTouchEventAck(uint32_t unique_event_id, | 191 void TouchDispositionGestureFilter::OnTouchEventAck( |
| 191 bool event_consumed) { | 192 uint32_t unique_touch_event_id, bool event_consumed) { |
| 192 // Spurious asynchronous acks should not trigger a crash. | 193 // Spurious asynchronous acks should not trigger a crash. |
| 193 if (IsEmpty() || (Head().empty() && sequences_.size() == 1)) | 194 if (IsEmpty() || (Head().empty() && sequences_.size() == 1)) |
| 194 return; | 195 return; |
| 195 | 196 |
| 196 if (Head().empty()) | 197 if (Head().empty()) |
| 197 PopGestureSequence(); | 198 PopGestureSequence(); |
| 198 | 199 |
| 199 if (!Tail().empty() && | 200 if (!Tail().empty() && |
| 200 Tail().back().unique_touch_event_id() == unique_event_id) { | 201 Tail().back().unique_touch_event_id() == unique_touch_event_id) { |
| 201 Tail().back().Ack(event_consumed); | 202 Tail().back().Ack(event_consumed); |
| 202 if (sequences_.size() == 1 && Tail().size() == 1) | 203 if (sequences_.size() == 1 && Tail().size() == 1) |
| 203 SendAckedEvents(); | 204 SendAckedEvents(); |
| 204 } else { | 205 } else { |
| 205 DCHECK(!Head().empty()); | 206 DCHECK(!Head().empty()); |
| 206 DCHECK_EQ(Head().front().unique_touch_event_id(), unique_event_id); | 207 DCHECK_EQ(Head().front().unique_touch_event_id(), unique_touch_event_id); |
| 207 Head().front().Ack(event_consumed); | 208 Head().front().Ack(event_consumed); |
| 208 SendAckedEvents(); | 209 SendAckedEvents(); |
| 209 } | 210 } |
| 210 } | 211 } |
| 211 | 212 |
| 212 void TouchDispositionGestureFilter::SendAckedEvents() { | 213 void TouchDispositionGestureFilter::SendAckedEvents() { |
| 213 // Dispatch all packets corresponding to ack'ed touches, as well as | 214 // Dispatch all packets corresponding to ack'ed touches, as well as |
| 214 // any pending timeout-based packets. | 215 // any pending timeout-based packets. |
| 215 bool touch_packet_for_current_ack_handled = false; | 216 bool touch_packet_for_current_ack_handled = false; |
| 216 while (!IsEmpty() && (!Head().empty() || sequences_.size() != 1)) { | 217 while (!IsEmpty() && (!Head().empty() || sequences_.size() != 1)) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 297 } else if (packet.gesture_source() == | 298 } else if (packet.gesture_source() == |
| 298 GestureEventDataPacket::TOUCH_SEQUENCE_END) { | 299 GestureEventDataPacket::TOUCH_SEQUENCE_END) { |
| 299 EndScrollIfNecessary(packet); | 300 EndScrollIfNecessary(packet); |
| 300 } | 301 } |
| 301 // Always send the ET_GESTURE_END event as the last one for every touch event. | 302 // Always send the ET_GESTURE_END event as the last one for every touch event. |
| 302 if (gesture_end_index >= 0) | 303 if (gesture_end_index >= 0) |
| 303 SendGesture(packet.gesture(gesture_end_index), packet); | 304 SendGesture(packet.gesture(gesture_end_index), packet); |
| 304 } | 305 } |
| 305 | 306 |
| 306 void TouchDispositionGestureFilter::SendGesture( | 307 void TouchDispositionGestureFilter::SendGesture( |
| 307 const GestureEventData& event, | 308 const GestureEventData& original_event, |
| 308 const GestureEventDataPacket& packet_being_sent) { | 309 const GestureEventDataPacket& packet_being_sent) { |
| 310 GestureEventData event(original_event); | |
|
dtapuska
2016/06/03 15:02:11
Wouldn't it make more sense to set the touch_event
mustaq
2016/06/03 20:34:45
Good catch, thanks. I originally got confused with
| |
| 311 event.unique_touch_event_id = packet_being_sent.unique_touch_event_id(); | |
| 312 | |
| 309 // TODO(jdduke): Factor out gesture stream reparation code into a standalone | 313 // TODO(jdduke): Factor out gesture stream reparation code into a standalone |
| 310 // utility class. | 314 // utility class. |
| 311 switch (event.type()) { | 315 switch (event.type()) { |
| 312 case ET_GESTURE_LONG_TAP: | 316 case ET_GESTURE_LONG_TAP: |
| 313 if (!needs_tap_ending_event_) | 317 if (!needs_tap_ending_event_) |
| 314 return; | 318 return; |
| 315 CancelTapIfNecessary(packet_being_sent); | 319 CancelTapIfNecessary(packet_being_sent); |
| 316 CancelFlingIfNecessary(packet_being_sent); | 320 CancelFlingIfNecessary(packet_being_sent); |
| 317 break; | 321 break; |
| 318 case ET_GESTURE_TAP_DOWN: | 322 case ET_GESTURE_TAP_DOWN: |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 472 return false; | 476 return false; |
| 473 } | 477 } |
| 474 | 478 |
| 475 bool TouchDispositionGestureFilter::GestureHandlingState:: | 479 bool TouchDispositionGestureFilter::GestureHandlingState:: |
| 476 HasFilteredGestureType(EventType gesture_type) const { | 480 HasFilteredGestureType(EventType gesture_type) const { |
| 477 return any_gesture_of_type_dropped_.has_bit( | 481 return any_gesture_of_type_dropped_.has_bit( |
| 478 GetGestureTypeIndex(gesture_type)); | 482 GetGestureTypeIndex(gesture_type)); |
| 479 } | 483 } |
| 480 | 484 |
| 481 } // namespace content | 485 } // namespace content |
| OLD | NEW |