Index: content/browser/renderer_host/input/touch_event_queue.h |
diff --git a/content/browser/renderer_host/input/touch_event_queue.h b/content/browser/renderer_host/input/touch_event_queue.h |
index a45e60f272e5a72bad6f0081bd7dc86250416650..3bdab903750f69d119f6f1f077c7f2a89ce3f784 100644 |
--- a/content/browser/renderer_host/input/touch_event_queue.h |
+++ b/content/browser/renderer_host/input/touch_event_queue.h |
@@ -14,6 +14,7 @@ |
#include "content/common/content_export.h" |
#include "content/common/input/input_event_ack_state.h" |
#include "third_party/WebKit/public/web/WebInputEvent.h" |
+#include "ui/events/gesture_detection/bitset_32.h" |
#include "ui/gfx/geometry/point_f.h" |
namespace content { |
@@ -114,6 +115,10 @@ class CONTENT_EXPORT TouchEventQueue { |
// it will take effect only for the following touch sequence. |
void SetAckTimeoutEnabled(bool enabled); |
+ bool IsAckTimeoutEnabled() const; |
+ |
+ bool IsForwardingTouches(); |
+ |
bool empty() const WARN_UNUSED_RESULT { |
return touch_queue_.empty(); |
} |
@@ -122,13 +127,7 @@ class CONTENT_EXPORT TouchEventQueue { |
return touch_queue_.size(); |
} |
- bool ack_timeout_enabled() const { |
- return ack_timeout_enabled_; |
- } |
- |
- bool has_handlers() const { |
- return touch_filtering_state_ != DROP_ALL_TOUCHES; |
- } |
+ bool has_handlers() const { return has_handlers_; } |
private: |
class TouchTimeoutHandler; |
@@ -181,10 +180,8 @@ class CONTENT_EXPORT TouchEventQueue { |
// has no touch handler. |
PreFilterResult FilterBeforeForwarding(const blink::WebTouchEvent& event); |
void ForwardToRenderer(const TouchEventWithLatencyInfo& event); |
- void UpdateTouchAckStates(const blink::WebTouchEvent& event, |
- InputEventAckState ack_result); |
- bool AllTouchAckStatesHaveState(InputEventAckState ack_state) const; |
- |
+ void UpdateTouchConsumerStates(const blink::WebTouchEvent& event, |
+ InputEventAckState ack_result); |
// Handles touch event forwarding and ack'ed event dispatch. |
TouchEventQueueClient* client_; |
@@ -192,9 +189,11 @@ class CONTENT_EXPORT TouchEventQueue { |
typedef std::deque<CoalescedWebTouchEvent*> TouchQueue; |
TouchQueue touch_queue_; |
- // Maintain the ACK status for each touch point. |
- typedef std::map<int, InputEventAckState> TouchPointAckStates; |
- TouchPointAckStates touch_ack_states_; |
+ // Maps whether each active pointer has a consumer (i.e., a touch point has a |
+ // valid consumer iff |touch_consumer_states[pointer.id]| is true.). |
+ // TODO(jdduke): Consider simply tracking whether *any* touchstart had a |
+ // consumer, crbug.com/416497. |
+ ui::BitSet32 touch_consumer_states_; |
// Position of the first touch in the most recent sequence forwarded to the |
// client. |
@@ -209,18 +208,18 @@ class CONTENT_EXPORT TouchEventQueue { |
// ack after forwarding a touch event to the client. |
bool dispatching_touch_; |
- enum TouchFilteringState { |
- FORWARD_ALL_TOUCHES, // Don't filter at all - the default. |
- FORWARD_TOUCHES_UNTIL_TIMEOUT, // Don't filter unless we get an ACK timeout. |
- DROP_TOUCHES_IN_SEQUENCE, // Filter all events until a new touch |
- // sequence is received. |
- DROP_ALL_TOUCHES, // Filter all events, e.g., no touch handler. |
- TOUCH_FILTERING_STATE_DEFAULT = FORWARD_ALL_TOUCHES, |
- }; |
- TouchFilteringState touch_filtering_state_; |
+ // Whether the renderer has at least one touch handler. |
+ bool has_handlers_; |
+ |
+ // Whether to allow any remaining touches for the current sequence. Note that |
+ // this is a stricter condition than an empty |touch_consumer_states_|, as it |
+ // also prevents forwarding of touchstart events for new pointers in the |
+ // current sequence. This is only used when the event is synthetically |
+ // cancelled after a touch timeout, or after a scroll event when the |
+ // mode is TOUCH_SCROLLING_MODE_TOUCHCANCEL. |
+ bool drop_remaining_touches_in_sequence_; |
// Optional handler for timed-out touch event acks. |
- bool ack_timeout_enabled_; |
scoped_ptr<TouchTimeoutHandler> timeout_handler_; |
// Suppression of TouchMove's within a slop region when a sequence has not yet |