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