Index: content/browser/renderer_host/input/gesture_event_packet.cc |
diff --git a/content/browser/renderer_host/input/gesture_event_packet.cc b/content/browser/renderer_host/input/gesture_event_packet.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..696f8ce77c92af1f482a8947a62cbc3d4636555c |
--- /dev/null |
+++ b/content/browser/renderer_host/input/gesture_event_packet.cc |
@@ -0,0 +1,88 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/renderer_host/input/gesture_event_packet.h" |
+ |
+#include "base/logging.h" |
+#include "content/common/input/web_input_event_traits.h" |
+ |
+using blink::WebGestureEvent; |
+using blink::WebInputEvent; |
+using blink::WebTouchEvent; |
+using blink::WebTouchPoint; |
+ |
+namespace content { |
+namespace { |
+ |
+bool IsTouchSequenceBegin(const WebTouchEvent& event) { |
tdresser
2014/01/16 14:31:45
nit: "IsTouchSequenceStart" probably makes more se
jdduke (slow)
2014/01/16 17:17:53
Done.
|
+ if (event.type != WebInputEvent::TouchStart) |
+ return false; |
+ if (!event.touchesLength) |
+ return false; |
+ for (size_t i = 0; i < event.touchesLength; i++) { |
+ if (event.touches[i].state != WebTouchPoint::StatePressed) |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+bool IsTriggeredByTimeout(const WebGestureEvent& event) { |
+ switch (event.type) { |
+ case WebInputEvent::GestureShowPress: |
+ case WebInputEvent::GestureLongPress: |
+ case WebInputEvent::GestureTapUnconfirmed: |
+ case WebInputEvent::GestureTapCancel: |
+ // A GestureTapCancel may be triggered by the loss of window focus |
+ // (e.g., following a GestureLongPress). |
+ // TODO(jdduke): Eliminate this corner case, instead relying on the |
+ // GestureEventQueue to cancel the tap sequence if necessary. |
+ return true; |
+ default: |
+ break; |
+ } |
+ return false; |
+} |
+ |
+GestureEventPacket::GestureSource |
+ToGestureSource(const WebTouchEvent& event) { |
+ // TODO(jdduke): Use GestureTapDown as a new sequence marker? |
tdresser
2014/01/16 14:31:45
Agreed, that sounds simpler.
|
+ return IsTouchSequenceBegin(event) ? GestureEventPacket::TOUCH_BEGIN |
+ : GestureEventPacket::TOUCH; |
+} |
+ |
+GestureEventPacket::GestureSource |
+ToGestureSource(const WebGestureEvent& event) { |
+ return IsTriggeredByTimeout(event) ? GestureEventPacket::TOUCH_TIMEOUT |
+ : GestureEventPacket::SYNTHETIC; |
+} |
+ |
+} // namespace |
+ |
+GestureEventPacket::GestureEventPacket(GestureSource source) |
+ : gesture_count_(0), |
+ gesture_source_(source) {} |
+ |
+GestureEventPacket::GestureEventPacket() |
+ : gesture_count_(0), |
+ gesture_source_(GESTURE_SOURCE_DEFAULT) {} |
+ |
+GestureEventPacket::~GestureEventPacket() {} |
+ |
+void GestureEventPacket::Push(const blink::WebGestureEvent& gesture) { |
+ DCHECK_LT(gesture_count_, kMaxGesturesPerTouch); |
tdresser
2014/01/16 14:31:45
Is it reasonable to make this a CHECK_LT? I'm pret
jdduke (slow)
2014/01/16 17:17:53
Yeah.
|
+ gestures_[gesture_count_++] = gesture; |
+} |
+ |
+GestureEventPacket GestureEventPacket::FromTouch(const WebTouchEvent& event) { |
+ return GestureEventPacket(ToGestureSource(event)); |
+} |
+ |
+GestureEventPacket GestureEventPacket::FromGesture( |
+ const WebGestureEvent& event) { |
+ GestureEventPacket packet(ToGestureSource(event)); |
+ packet.Push(event); |
+ return packet; |
+} |
+ |
+} // namespace content |