OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/passthrough_touch_event_queue.h" | 5 #include "content/browser/renderer_host/input/passthrough_touch_event_queue.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 return event.unique_touch_event_id < other.event.unique_touch_event_id; | 52 return event.unique_touch_event_id < other.event.unique_touch_event_id; |
53 } | 53 } |
54 | 54 |
55 PassthroughTouchEventQueue::PassthroughTouchEventQueue( | 55 PassthroughTouchEventQueue::PassthroughTouchEventQueue( |
56 TouchEventQueueClient* client, | 56 TouchEventQueueClient* client, |
57 const Config& config) | 57 const Config& config) |
58 : client_(client), | 58 : client_(client), |
59 has_handlers_(true), | 59 has_handlers_(true), |
60 maybe_has_handler_for_current_sequence_(false), | 60 maybe_has_handler_for_current_sequence_(false), |
61 drop_remaining_touches_in_sequence_(false), | 61 drop_remaining_touches_in_sequence_(false), |
62 send_touch_events_async_(false) { | 62 send_touch_events_async_(false), |
| 63 processing_acks_(false) { |
63 if (config.touch_ack_timeout_supported) { | 64 if (config.touch_ack_timeout_supported) { |
64 timeout_handler_.reset( | 65 timeout_handler_.reset( |
65 new TouchTimeoutHandler(this, config.desktop_touch_ack_timeout_delay, | 66 new TouchTimeoutHandler(this, config.desktop_touch_ack_timeout_delay, |
66 config.mobile_touch_ack_timeout_delay)); | 67 config.mobile_touch_ack_timeout_delay)); |
67 } | 68 } |
68 } | 69 } |
69 | 70 |
70 PassthroughTouchEventQueue::~PassthroughTouchEventQueue() {} | 71 PassthroughTouchEventQueue::~PassthroughTouchEventQueue() {} |
71 | 72 |
72 void PassthroughTouchEventQueue::SendTouchCancelEventForTouchEvent( | 73 void PassthroughTouchEventQueue::SendTouchCancelEventForTouchEvent( |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 auto iter = outstanding_touches_.begin(); | 199 auto iter = outstanding_touches_.begin(); |
199 TouchEventWithLatencyInfoAndAckState event = *iter; | 200 TouchEventWithLatencyInfoAndAckState event = *iter; |
200 outstanding_touches_.erase(iter); | 201 outstanding_touches_.erase(iter); |
201 if (event.ack_state() == INPUT_EVENT_ACK_STATE_UNKNOWN) | 202 if (event.ack_state() == INPUT_EVENT_ACK_STATE_UNKNOWN) |
202 event.set_ack_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 203 event.set_ack_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
203 AckTouchEventToClient(event, event.ack_state()); | 204 AckTouchEventToClient(event, event.ack_state()); |
204 } | 205 } |
205 } | 206 } |
206 | 207 |
207 void PassthroughTouchEventQueue::AckCompletedEvents() { | 208 void PassthroughTouchEventQueue::AckCompletedEvents() { |
| 209 // Don't allow re-entrancy into this method otherwise |
| 210 // the ordering of acks won't be preserved. |
| 211 if (processing_acks_) |
| 212 return; |
| 213 base::AutoReset<bool> process_acks(&processing_acks_, true); |
208 while (!outstanding_touches_.empty()) { | 214 while (!outstanding_touches_.empty()) { |
209 auto iter = outstanding_touches_.begin(); | 215 auto iter = outstanding_touches_.begin(); |
210 if (iter->ack_state() == INPUT_EVENT_ACK_STATE_UNKNOWN) | 216 if (iter->ack_state() == INPUT_EVENT_ACK_STATE_UNKNOWN) |
211 break; | 217 break; |
212 TouchEventWithLatencyInfoAndAckState event = *iter; | 218 TouchEventWithLatencyInfoAndAckState event = *iter; |
213 outstanding_touches_.erase(iter); | 219 outstanding_touches_.erase(iter); |
214 AckTouchEventToClient(event, event.ack_state()); | 220 AckTouchEventToClient(event, event.ack_state()); |
215 } | 221 } |
216 } | 222 } |
217 | 223 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 bool PassthroughTouchEventQueue::IsTimeoutRunningForTesting() const { | 380 bool PassthroughTouchEventQueue::IsTimeoutRunningForTesting() const { |
375 return timeout_handler_ && timeout_handler_->IsTimeoutTimerRunning(); | 381 return timeout_handler_ && timeout_handler_->IsTimeoutTimerRunning(); |
376 } | 382 } |
377 | 383 |
378 const TouchEventWithLatencyInfo& | 384 const TouchEventWithLatencyInfo& |
379 PassthroughTouchEventQueue::GetLatestEventForTesting() const { | 385 PassthroughTouchEventQueue::GetLatestEventForTesting() const { |
380 return *outstanding_touches_.rbegin(); | 386 return *outstanding_touches_.rbegin(); |
381 } | 387 } |
382 | 388 |
383 } // namespace content | 389 } // namespace content |
OLD | NEW |