15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURE_EVENT_QUEUE_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURE_EVENT_QUEUE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/event_with_latency_info.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/input/tap_suppression_controller.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/input/touchpad_tap_suppression_controller.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/input/touchscreen_tap_suppression_controller.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/content_export.h"
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/input/input_event_ack_state.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GestureEventQueueTest;
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass InputRouter;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRenderWidgetHost;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Interface with which the GestureEventQueue can forward gesture events, and
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// dispatch gesture event responses.
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT GestureEventQueueClient {
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~GestureEventQueueClient() {}
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SendGestureEventImmediately(
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const GestureEventWithLatencyInfo& event) = 0;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnGestureEventAck(
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const GestureEventWithLatencyInfo& event,
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      InputEventAckState ack_result) = 0;
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maintains WebGestureEvents in a queue before forwarding them to the renderer
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to apply a sequence of filters on them:
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// 1. The sequence is filtered for bounces. A bounce is when the finger lifts
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//    from the screen briefly during an in-progress scroll. Ifco this happens,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    non-GestureScrollUpdate events are queued until the de-bounce interval
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    passes or another GestureScrollUpdate event occurs.
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// 2. Unnecessary GestureFlingCancel events are filtered. These are
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    GestureFlingCancels that have no corresponding GestureFlingStart in the
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    queue.
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// 3. Taps immediately after a GestureFlingCancel (caused by the same tap) are
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    filtered.
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// 4. Whenever possible, events in the queue are coalesced to have as few events
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    as possible and therefore maximize the chance that the event stream can be
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    handled entirely by the compositor thread.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Events in the queue are forwarded to the renderer one by one; i.e., each
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// event is sent after receiving the ACK for previous one. The only exception is
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that if a GestureScrollUpdate is followed by a GesturePinchUpdate, they are
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sent together.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rjkroege): Possibly refactor into a filter chain:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/148443.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT GestureEventQueue {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  struct CONTENT_EXPORT Config {
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Config();
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Controls touchpad-related tap suppression, disabled by default.
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TapSuppressionController::Config touchpad_tap_suppression_config;
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Controls touchscreen-related tap suppression, disabled by default.
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TapSuppressionController::Config touchscreen_tap_suppression_config;
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Determines whether non-scroll gesture events are "debounced" during an
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // active scroll sequence, suppressing brief scroll interruptions.
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Zero by default (disabled).
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::TimeDelta debounce_interval;
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Both |client| and |touchpad_client| must outlive the GestureEventQueue.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GestureEventQueue(GestureEventQueueClient* client,
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    TouchpadTapSuppressionControllerClient* touchpad_client,
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    const Config& config);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~GestureEventQueue();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns |true| if the caller should immediately forward the provided
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |GestureEventWithLatencyInfo| argument to the renderer.
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // If this function returns false, then the event may be queued and forwared
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // at a later point.
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool ShouldForward(const GestureEventWithLatencyInfo&);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Indicates that the caller has received an acknowledgement from the renderer
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // with state |ack_result| and event |type|. May send events if the queue is
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // not empty.
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ProcessGestureAck(InputEventAckState ack_result,
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         blink::WebInputEvent::Type type,
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         const ui::LatencyInfo& latency);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the state of the |fling_in_progress_| field to indicate that a fling
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is definitely not in progress.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FlingHasBeenHalted();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the |TouchpadTapSuppressionController| instance.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TouchpadTapSuppressionController* GetTouchpadTapSuppressionController();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ForwardGestureEvent(const GestureEventWithLatencyInfo& gesture_event);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Whether the queue is expecting a gesture event ack.
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool ExpectingGestureAck() const;
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool empty() const {
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return coalesced_gesture_events_.empty() &&
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           debouncing_deferral_queue_.empty();
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void set_debounce_interval_time_ms_for_testing(int interval_ms) {
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    debounce_interval_ = base::TimeDelta::FromMilliseconds(interval_ms);
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class GestureEventQueueTest;
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  friend class MockRenderWidgetHost;
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mohsen): There are a bunch of ShouldForward.../ShouldDiscard...
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // methods that are getting confusing. This should be somehow fixed. Maybe
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // while refactoring GEQ: http://crbug.com/148443.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inovked on the expiration of the debounce interval to release
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deferred events.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendScrollEndingEventsNow();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns |true| if the given GestureFlingCancel should be discarded
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as unnecessary.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldDiscardFlingCancelEvent(
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const GestureEventWithLatencyInfo& gesture_event) const;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns |true| if the only event in the queue is the current event and
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hence that event should be handled now.
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool ShouldHandleEventNow() const;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Merge or append a GestureScrollUpdate or GesturePinchUpdate into
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the coalescing queue.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MergeOrInsertScrollAndPinchEvent(
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const GestureEventWithLatencyInfo& gesture_event);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sub-filter for removing bounces from in-progress scrolls.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldForwardForBounceReduction(
146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const GestureEventWithLatencyInfo& gesture_event);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sub-filter for removing unnecessary GestureFlingCancels.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ShouldForwardForGFCFiltering(
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const GestureEventWithLatencyInfo& gesture_event) const;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sub-filter for suppressing taps immediately after a GestureFlingCancel.
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ShouldForwardForTapSuppression(
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const GestureEventWithLatencyInfo& gesture_event);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Puts the events in a queue to forward them one by one; i.e., forward them
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // whenever ACK for previous event is received. This queue also tries to
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // coalesce events as much as possible.
159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool ShouldForwardForCoalescing(
160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const GestureEventWithLatencyInfo& gesture_event);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the event_in_queue is GesturePinchUpdate or
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GestureScrollUpdate and it has the same modifiers as the
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // new event.
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool ShouldTryMerging(
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const GestureEventWithLatencyInfo& new_event,
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const GestureEventWithLatencyInfo& event_in_queue)const;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the transform matrix corresponding to the gesture event.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Assumes the gesture event sent is either GestureScrollUpdate or
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GesturePinchUpdate. Returns the identity matrix otherwise.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform GetTransformForEvent(
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const GestureEventWithLatencyInfo& gesture_event) const;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The number of sent events for which we're awaiting an ack.  These events
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // remain at the head of the queue until ack'ed.
1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  size_t EventsInFlightCount() const;
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // The receiver of all forwarded gesture events.
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GestureEventQueueClient* client_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if a GestureFlingStart is in progress on the renderer or
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // queued without a subsequent queued GestureFlingCancel event.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fling_in_progress_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if a GestureScrollUpdate sequence is in progress.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool scrolling_in_progress_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if two related gesture events were sent before without waiting
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for an ACK, so the next gesture ACK should be ignored.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ignore_next_ack_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // An object tracking the state of touchpad on the delivery of mouse events to
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the renderer to filter mouse immediately after a touchpad fling canceling
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tap.
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(mohsen): Move touchpad tap suppression out of GestureEventQueue since
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // GEQ is meant to only be used for touchscreen gesture events.
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TouchpadTapSuppressionController touchpad_tap_suppression_controller_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // An object tracking the state of touchscreen on the delivery of gesture tap
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events to the renderer to filter taps immediately after a touchscreen fling
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // canceling tap.
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TouchscreenTapSuppressionController touchscreen_tap_suppression_controller_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::deque<GestureEventWithLatencyInfo> GestureQueue;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Queue of coalesced gesture events not yet sent to the renderer. If
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |ignore_next_ack_| is false, then the event at the front of the queue has
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // been sent and is awaiting an ACK, and all other events have yet to be sent.
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If |ignore_next_ack_| is true, then the two events at the front of the
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // queue have been sent, and the second is awaiting an ACK. All other events
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // have yet to be sent.
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GestureQueue coalesced_gesture_events_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Timer to release a previously deferred gesture event.
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::OneShotTimer<GestureEventQueue> debounce_deferring_timer_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue of events that have been deferred for debounce.
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GestureQueue debouncing_deferral_queue_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Time window in which to debounce scroll/fling ends. Note that an interval
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // of zero effectively disables debouncing.
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeDelta debounce_interval_;
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GestureEventQueue);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURE_EVENT_QUEUE_H_
231