| Index: content/browser/renderer_host/input/gesture_event_queue.h
|
| diff --git a/content/browser/renderer_host/input/gesture_event_queue.h b/content/browser/renderer_host/input/gesture_event_queue.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..88c66aaefd04344f42b57654df855e5afc5ef046
|
| --- /dev/null
|
| +++ b/content/browser/renderer_host/input/gesture_event_queue.h
|
| @@ -0,0 +1,94 @@
|
| +// 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.
|
| +
|
| +#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURE_EVENT_QUEUE_H_
|
| +#define CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURE_EVENT_QUEUE_H_
|
| +
|
| +#include <deque>
|
| +#include <queue>
|
| +
|
| +#include "content/browser/renderer_host/input/gesture_event_packet.h"
|
| +#include "content/common/content_export.h"
|
| +#include "content/port/common/input_event_ack_state.h"
|
| +#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| +
|
| +namespace content {
|
| +
|
| +// Interface with which the |GestureEventQueue| forwards gestures for a given
|
| +// touch event.
|
| +class CONTENT_EXPORT GestureEventQueueClient {
|
| + public:
|
| + virtual void ForwardGestureEvent(const blink::WebGestureEvent&) = 0;
|
| +};
|
| +
|
| +// Handles dispatch of touch-derived gestures created by the platform.
|
| +// Gestures are forwarded or dropped depending on the ack dispositions of the
|
| +// generating touch sequence.
|
| +class CONTENT_EXPORT GestureEventQueue {
|
| + public:
|
| + explicit GestureEventQueue(GestureEventQueueClient* client);
|
| + ~GestureEventQueue();
|
| +
|
| + // To be called upon receipt of gesture-related events. In particular,
|
| + // |packet| contains [0, n] gestures that correspond to a given event. That
|
| + // event may be a touch, or a touch timeout for certain stationary gestures.
|
| + // It is imperative that a single packet is received for *each* touch event,
|
| + // even those that did not produce a gesture.
|
| + void OnGestureEventPacket(const GestureEventPacket& packet);
|
| +
|
| + // To be called upon receipt of *all* touch event acks.
|
| + void OnTouchEventAck(InputEventAckState ack_state);
|
| +
|
| + private:
|
| + // Utility class for tracking gesture events and dispositions for a single
|
| + // gesture sequence. A single sequence corresponds to all gestures created
|
| + // between the first finger down and the last finger up, including gestures
|
| + // generated by timeouts from a statinoary finger.
|
| + class GestureSequence {
|
| + public:
|
| + GestureSequence();
|
| + ~GestureSequence();
|
| +
|
| + void Push(const GestureEventPacket& packet);
|
| + void Pop();
|
| + const GestureEventPacket& Front() const;
|
| + void UpdateState(InputEventAckState ack_state);
|
| + bool IsGesturePrevented() const;
|
| + bool IsEmpty() const;
|
| +
|
| + private:
|
| + std::queue<GestureEventPacket> packets_;
|
| + enum GestureHandlingState {
|
| + PENDING, // The sequence has yet to receive an ack.
|
| + ALLOWED_UNTIL_PREVENTED, // Gestures in the sequence are allowed until
|
| + // a source touch is preventDefault'ed.
|
| + ALWAYS_ALLOWED, // All remaining sequence gestures are forwarded.
|
| + ALWAYS_PREVENTED // All remaining sequence gestures are dropped.
|
| + };
|
| + GestureHandlingState state_;
|
| + };
|
| + void UpdateAndDispatchPackets(GestureSequence* sequence,
|
| + InputEventAckState ack_result);
|
| + void SendPacket(const GestureEventPacket& packet);
|
| + void SendGesture(const blink::WebGestureEvent& gesture);
|
| + void CancelTapIfNecessary();
|
| + void CancelFlingIfNecessary();
|
| + GestureSequence& Head();
|
| + GestureSequence& Tail();
|
| +
|
| + GestureEventQueueClient* client_;
|
| + std::queue<GestureSequence> sequences_;
|
| +
|
| + // Bookkeeping for inserting synthetic Gesture{Tap,Fling}Cancel events
|
| + // when necessary, e.g., GestureTapCancel when scrolling begins, or
|
| + // GestureFlingCancel when a user taps following a GestureFlingStart.
|
| + bool needs_tap_ending_event_;
|
| + bool needs_fling_ending_event_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GestureEventQueue);
|
| +};
|
| +
|
| +} // namespace content
|
| +
|
| +#endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURE_EVENT_QUEUE_H_
|
|
|