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

Side by Side Diff: ui/events/gesture_detection/touch_disposition_gesture_filter.cc

Issue 1989623002: Suppressed MEs for gestures from cancelled PEs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "ui/events/gesture_event_details.h" 11 #include "ui/events/gesture_event_details.h"
12 12
13 namespace ui { 13 namespace ui {
14 namespace { 14 namespace {
15 15
16 // A BitSet32 is used for tracking dropped gesture types. 16 // A BitSet32 is used for tracking dropped gesture types.
17 static_assert(ET_GESTURE_TYPE_END - ET_GESTURE_TYPE_START < 32, 17 static_assert(ET_GESTURE_TYPE_END - ET_GESTURE_TYPE_START < 32,
18 "gesture type count too large"); 18 "gesture type count too large");
19 19
20 GestureEventData CreateGesture(EventType type, 20 GestureEventData CreateGesture(EventType type,
21 int motion_event_id, 21 int motion_event_id,
22 MotionEvent::ToolType primary_tool_type, 22 MotionEvent::ToolType primary_tool_type,
23 const GestureEventDataPacket& packet) { 23 const GestureEventDataPacket& packet) {
24 // As the event is purely synthetic, we needn't be strict with event flags. 24 // As the event is purely synthetic, we needn't be strict with event flags.
25 int flags = EF_NONE; 25 int flags = EF_NONE;
26 GestureEventDetails details(type); 26 GestureEventDetails details(type);
27 details.set_device_type(GestureDeviceType::DEVICE_TOUCHSCREEN); 27 details.set_device_type(GestureDeviceType::DEVICE_TOUCHSCREEN);
28 return GestureEventData( 28 return GestureEventData(details,
29 details, motion_event_id, primary_tool_type, packet.timestamp(), 29 motion_event_id,
30 packet.touch_location().x(), packet.touch_location().y(), 30 primary_tool_type,
31 packet.raw_touch_location().x(), packet.raw_touch_location().y(), 1, 31 packet.timestamp(),
32 gfx::RectF(packet.touch_location(), gfx::SizeF()), flags); 32 packet.touch_location().x(),
33 packet.touch_location().y(),
34 packet.raw_touch_location().x(),
35 packet.raw_touch_location().y(),
36 1,
37 gfx::RectF(packet.touch_location(), gfx::SizeF()),
38 flags,
39 packet.unique_touch_event_id());
33 } 40 }
34 41
35 enum RequiredTouches { 42 enum RequiredTouches {
36 RT_NONE = 0, 43 RT_NONE = 0,
37 RT_START = 1 << 0, 44 RT_START = 1 << 0,
38 RT_CURRENT = 1 << 1, 45 RT_CURRENT = 1 << 1,
39 }; 46 };
40 47
41 struct DispositionHandlingInfo { 48 struct DispositionHandlingInfo {
42 // A bitwise-OR of |RequiredTouches|. 49 // A bitwise-OR of |RequiredTouches|.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 if (!Head().empty()) { 183 if (!Head().empty()) {
177 DCHECK_NE(packet.unique_touch_event_id(), 184 DCHECK_NE(packet.unique_touch_event_id(),
178 Head().front().unique_touch_event_id()); 185 Head().front().unique_touch_event_id());
179 186
180 } 187 }
181 188
182 Tail().push(packet); 189 Tail().push(packet);
183 return SUCCESS; 190 return SUCCESS;
184 } 191 }
185 192
186 void TouchDispositionGestureFilter::OnTouchEventAck(uint32_t unique_event_id, 193 void TouchDispositionGestureFilter::OnTouchEventAck(
187 bool event_consumed) { 194 uint32_t unique_touch_event_id, bool event_consumed) {
188 // Spurious asynchronous acks should not trigger a crash. 195 // Spurious asynchronous acks should not trigger a crash.
189 if (IsEmpty() || (Head().empty() && sequences_.size() == 1)) 196 if (IsEmpty() || (Head().empty() && sequences_.size() == 1))
190 return; 197 return;
191 198
192 if (Head().empty()) 199 if (Head().empty())
193 PopGestureSequence(); 200 PopGestureSequence();
194 201
195 if (!Tail().empty() && 202 if (!Tail().empty() &&
196 Tail().back().unique_touch_event_id() == unique_event_id) { 203 Tail().back().unique_touch_event_id() == unique_touch_event_id) {
197 Tail().back().Ack(event_consumed); 204 Tail().back().Ack(event_consumed);
198 if (sequences_.size() == 1 && Tail().size() == 1) 205 if (sequences_.size() == 1 && Tail().size() == 1)
199 SendAckedEvents(); 206 SendAckedEvents();
200 } else { 207 } else {
201 DCHECK(!Head().empty()); 208 DCHECK(!Head().empty());
202 DCHECK_EQ(Head().front().unique_touch_event_id(), unique_event_id); 209 DCHECK_EQ(Head().front().unique_touch_event_id(), unique_touch_event_id);
203 Head().front().Ack(event_consumed); 210 Head().front().Ack(event_consumed);
204 SendAckedEvents(); 211 SendAckedEvents();
205 } 212 }
206 } 213 }
207 214
208 void TouchDispositionGestureFilter::SendAckedEvents() { 215 void TouchDispositionGestureFilter::SendAckedEvents() {
209 // Dispatch all packets corresponding to ack'ed touches, as well as 216 // Dispatch all packets corresponding to ack'ed touches, as well as
210 // any pending timeout-based packets. 217 // any pending timeout-based packets.
211 bool touch_packet_for_current_ack_handled = false; 218 bool touch_packet_for_current_ack_handled = false;
212 while (!IsEmpty() && (!Head().empty() || sequences_.size() != 1)) { 219 while (!IsEmpty() && (!Head().empty() || sequences_.size() != 1)) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 EndScrollIfNecessary(packet); 302 EndScrollIfNecessary(packet);
296 } 303 }
297 // Always send the ET_GESTURE_END event as the last one for every touch event. 304 // Always send the ET_GESTURE_END event as the last one for every touch event.
298 if (gesture_end_index >= 0) 305 if (gesture_end_index >= 0)
299 SendGesture(packet.gesture(gesture_end_index), packet); 306 SendGesture(packet.gesture(gesture_end_index), packet);
300 } 307 }
301 308
302 void TouchDispositionGestureFilter::SendGesture( 309 void TouchDispositionGestureFilter::SendGesture(
303 const GestureEventData& event, 310 const GestureEventData& event,
304 const GestureEventDataPacket& packet_being_sent) { 311 const GestureEventDataPacket& packet_being_sent) {
312 DCHECK(event.unique_touch_event_id ==
313 packet_being_sent.unique_touch_event_id());
314
305 // TODO(jdduke): Factor out gesture stream reparation code into a standalone 315 // TODO(jdduke): Factor out gesture stream reparation code into a standalone
306 // utility class. 316 // utility class.
307 switch (event.type()) { 317 switch (event.type()) {
308 case ET_GESTURE_LONG_TAP: 318 case ET_GESTURE_LONG_TAP:
309 if (!needs_tap_ending_event_) 319 if (!needs_tap_ending_event_)
310 return; 320 return;
311 CancelTapIfNecessary(packet_being_sent); 321 CancelTapIfNecessary(packet_being_sent);
312 CancelFlingIfNecessary(packet_being_sent); 322 CancelFlingIfNecessary(packet_being_sent);
313 break; 323 break;
314 case ET_GESTURE_TAP_DOWN: 324 case ET_GESTURE_TAP_DOWN:
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 return false; 478 return false;
469 } 479 }
470 480
471 bool TouchDispositionGestureFilter::GestureHandlingState:: 481 bool TouchDispositionGestureFilter::GestureHandlingState::
472 HasFilteredGestureType(EventType gesture_type) const { 482 HasFilteredGestureType(EventType gesture_type) const {
473 return any_gesture_of_type_dropped_.has_bit( 483 return any_gesture_of_type_dropped_.has_bit(
474 GetGestureTypeIndex(gesture_type)); 484 GetGestureTypeIndex(gesture_type));
475 } 485 }
476 486
477 } // namespace content 487 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698