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

Side by Side Diff: content/browser/renderer_host/input/gesture_event_queue.cc

Issue 140253005: Add touch scrolling modes experimental flags (DEPRECATED) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Correct semantics to deal with ending events Created 6 years, 10 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 | Annotate | Revision Log
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 "content/browser/renderer_host/input/gesture_event_queue.h" 5 #include "content/browser/renderer_host/input/gesture_event_queue.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 10
(...skipping 13 matching lines...) Expand all
24 return event; 24 return event;
25 } 25 }
26 26
27 } // namespace 27 } // namespace
28 28
29 // GestureEventQueue 29 // GestureEventQueue
30 30
31 GestureEventQueue::GestureEventQueue(GestureEventQueueClient* client) 31 GestureEventQueue::GestureEventQueue(GestureEventQueueClient* client)
32 : client_(client), 32 : client_(client),
33 needs_tap_ending_event_(false), 33 needs_tap_ending_event_(false),
34 needs_fling_ending_event_(false) { 34 needs_fling_ending_event_(false),
35 needs_scroll_ending_event_(false),
36 needs_pinch_ending_event_(false) {
35 DCHECK(client_); 37 DCHECK(client_);
36 } 38 }
37 39
38 GestureEventQueue::~GestureEventQueue() {} 40 GestureEventQueue::~GestureEventQueue() {}
39 41
40 void GestureEventQueue::OnGestureEventPacket(const GestureEventPacket& packet) { 42 void GestureEventQueue::OnGestureEventPacket(const GestureEventPacket& packet) {
41 switch (packet.gesture_source()) { 43 switch (packet.gesture_source()) {
42 case GestureEventPacket::TOUCH_BEGIN: 44 case GestureEventPacket::TOUCH_BEGIN:
43 sequences_.push(GestureSequence()); 45 sequences_.push(GestureSequence());
44 break; 46 break;
45 47
46 case GestureEventPacket::TOUCH: 48 case GestureEventPacket::TOUCH:
47 break; 49 break;
48 50
49 case GestureEventPacket::TOUCH_TIMEOUT: 51 case GestureEventPacket::TOUCH_TIMEOUT:
50 // Handle the timeout packet immediately if the packet preceding the 52 // Handle the timeout packet immediately if the packet preceding the
51 // timeout has already been dispatched. 53 // timeout has already been dispatched.
52 if (Tail().IsEmpty()) { 54 if (Tail().IsEmpty()) {
53 if (!Tail().IsGesturePrevented()) 55 FilterAndSendPacket(packet, Tail().IsGesturePrevented(),
54 SendPacket(packet); 56 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
55 return; 57 return;
56 } 58 }
57 break; 59 break;
58 60
59 case GestureEventPacket::INVALID: 61 case GestureEventPacket::INVALID:
60 NOTREACHED() << "Invalid gesture packet detected."; 62 NOTREACHED() << "Invalid gesture packet detected.";
61 break; 63 break;
62 } 64 }
63 65
64 Tail().Push(packet); 66 Tail().Push(packet);
65 } 67 }
66 68
67 void GestureEventQueue::OnTouchEventAck(InputEventAckState ack_state) { 69 void GestureEventQueue::OnTouchEventAck(InputEventAckState ack_state) {
68 if (Head().IsEmpty()) { 70 if (Head().IsEmpty()) {
69 CancelTapIfNecessary(); 71 CancelTapIfNecessary();
70 CancelFlingIfNecessary(); 72 CancelFlingIfNecessary();
71 sequences_.pop(); 73 sequences_.pop();
72 } 74 }
73 75
74 GestureSequence& sequence = Head(); 76 GestureSequence& sequence = Head();
75 sequence.UpdateState(ack_state);
76 77
77 // Dispatch the packet corresponding to the ack'ed touch, as well as any 78 // Dispatch the packet corresponding to the ack'ed touch, as well as any
78 // additional timeout-based packets queued before the ack was received. 79 // additional timeout-based packets queued before the ack was received.
79 bool touch_packet_for_current_ack_handled = false; 80 bool touch_packet_for_current_ack_handled = false;
80 while (!sequence.IsEmpty()) { 81 while (!sequence.IsEmpty()) {
81 const GestureEventPacket& packet = sequence.Front(); 82 const GestureEventPacket& packet = sequence.Front();
82 83
83 if (packet.gesture_source() == GestureEventPacket::TOUCH_BEGIN || 84 if (packet.gesture_source() == GestureEventPacket::TOUCH_BEGIN ||
84 packet.gesture_source() == GestureEventPacket::TOUCH) { 85 packet.gesture_source() == GestureEventPacket::TOUCH) {
85 // We should handle at most one touch-based packet corresponding to a 86 // We should handle at most one touch-based packet corresponding to a
86 // given ack. 87 // given ack.
87 if (touch_packet_for_current_ack_handled) 88 if (touch_packet_for_current_ack_handled)
88 break; 89 break;
90 if (!packet.is_independent() || packet.gesture_count() == 0)
91 sequence.UpdateState(ack_state);
89 touch_packet_for_current_ack_handled = true; 92 touch_packet_for_current_ack_handled = true;
90 } 93 }
91 94 FilterAndSendPacket(packet, sequence.IsGesturePrevented(), ack_state);
92 if (!sequence.IsGesturePrevented())
93 SendPacket(packet);
94 95
95 sequence.Pop(); 96 sequence.Pop();
96 } 97 }
97 DCHECK(touch_packet_for_current_ack_handled); 98 DCHECK(touch_packet_for_current_ack_handled);
98 99
99 // Immediately cancel a TapDown if TouchStart went unconsumed, but a 100 // Immediately cancel a TapDown if TouchStart went unconsumed, but a
100 // subsequent TouchMove is consumed. 101 // subsequent TouchMove is consumed.
101 if (sequence.IsGesturePrevented()) 102 if (sequence.IsGesturePrevented())
102 CancelTapIfNecessary(); 103 CancelTapIfNecessary();
103 } 104 }
104 105
105 void GestureEventQueue::SendPacket(const GestureEventPacket& packet) { 106 void GestureEventQueue::FilterAndSendPacket(
106 for (size_t i = 0; i < packet.gesture_count(); ++i) 107 const GestureEventPacket& packet,
107 SendGesture(packet.gesture(i)); 108 bool gesturePrevented,
109 InputEventAckState ack_state) {
110 for (size_t i = 0; i < packet.gesture_count(); ++i) {
111 const blink::WebGestureEvent& gesture = packet.gesture(i);
112
113 // Scroll and pinch ending events are sent if and only if their
114 // corresponding begin event was sent, regardless of the filtering state.
115 bool send = false;
tdresser 2014/02/03 15:52:58 Need {} in this conditional.
tdresser 2014/02/03 18:55:14 Done.
116 if (needs_scroll_ending_event_ &&
117 (gesture.type == WebInputEvent::GestureScrollEnd ||
118 gesture.type == WebInputEvent::GestureFlingStart))
119 send = true;
120 else if (needs_pinch_ending_event_ &&
121 gesture.type == WebInputEvent::GesturePinchEnd)
122 send = true;
123 // Other gestures are sent only when the current filtering state allows.
124 else if (!gesturePrevented) {
125 // Independent packets can be suppressed by the current ack state.
126 if (!(packet.is_independent() &&
127 ack_state == INPUT_EVENT_ACK_STATE_CONSUMED))
128 send = true;
129 }
130
131 if (send)
132 SendGesture(gesture);
133 }
108 } 134 }
109 135
110 void GestureEventQueue::SendGesture(const WebGestureEvent& event) { 136 void GestureEventQueue::SendGesture(const WebGestureEvent& event) {
137
111 switch (event.type) { 138 switch (event.type) {
112 case WebInputEvent::GestureLongTap: 139 case WebInputEvent::GestureLongTap:
113 CancelTapIfNecessary(); 140 CancelTapIfNecessary();
114 CancelFlingIfNecessary(); 141 CancelFlingIfNecessary();
115 break; 142 break;
116 case WebInputEvent::GestureTapDown: 143 case WebInputEvent::GestureTapDown:
144 DCHECK(!needs_tap_ending_event_);
117 needs_tap_ending_event_ = true; 145 needs_tap_ending_event_ = true;
118 break; 146 break;
119 case WebInputEvent::GestureTapCancel: 147 case WebInputEvent::GestureTapCancel:
120 case WebInputEvent::GestureTap: 148 case WebInputEvent::GestureTap:
121 case WebInputEvent::GestureTapUnconfirmed: 149 case WebInputEvent::GestureTapUnconfirmed:
122 case WebInputEvent::GestureDoubleTap: 150 case WebInputEvent::GestureDoubleTap:
123 needs_tap_ending_event_ = false; 151 needs_tap_ending_event_ = false;
124 break; 152 break;
125 case WebInputEvent::GestureScrollBegin: 153 case WebInputEvent::GestureScrollBegin:
126 CancelTapIfNecessary(); 154 CancelTapIfNecessary();
127 CancelFlingIfNecessary(); 155 CancelFlingIfNecessary();
156 DCHECK(!needs_scroll_ending_event_);
157 needs_scroll_ending_event_ = true;
128 break; 158 break;
129 case WebInputEvent::GestureFlingStart: 159 case WebInputEvent::GestureFlingStart:
130 CancelFlingIfNecessary(); 160 CancelFlingIfNecessary();
131 needs_fling_ending_event_ = true; 161 needs_fling_ending_event_ = true;
162 // FALL THROUGH
163 case WebInputEvent::GestureScrollEnd:
164 DCHECK(needs_scroll_ending_event_);
165 needs_scroll_ending_event_ = false;
132 break; 166 break;
133 case WebInputEvent::GestureFlingCancel: 167 case WebInputEvent::GestureFlingCancel:
134 needs_fling_ending_event_ = false; 168 needs_fling_ending_event_ = false;
135 break; 169 break;
170 case WebInputEvent::GesturePinchBegin:
171 DCHECK(!needs_pinch_ending_event_);
172 needs_pinch_ending_event_ = true;
173 break;
174 case WebInputEvent::GesturePinchEnd:
175 DCHECK(needs_pinch_ending_event_);
176 needs_pinch_ending_event_ = false;
177 break;
136 default: 178 default:
137 break; 179 break;
138 } 180 }
139 client_->ForwardGestureEvent(event); 181 client_->ForwardGestureEvent(event);
140 } 182 }
141 183
142 void GestureEventQueue::CancelTapIfNecessary() { 184 void GestureEventQueue::CancelTapIfNecessary() {
143 if (!needs_tap_ending_event_) 185 if (!needs_tap_ending_event_)
144 return; 186 return;
145 187
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 249
208 bool GestureEventQueue::GestureSequence::IsGesturePrevented() const { 250 bool GestureEventQueue::GestureSequence::IsGesturePrevented() const {
209 return state_ == ALWAYS_PREVENTED; 251 return state_ == ALWAYS_PREVENTED;
210 } 252 }
211 253
212 bool GestureEventQueue::GestureSequence::IsEmpty() const { 254 bool GestureEventQueue::GestureSequence::IsEmpty() const {
213 return packets_.empty(); 255 return packets_.empty();
214 } 256 }
215 257
216 } // namespace content 258 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698