// 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_INPUT_QUEUE_H_ #define CONTENT_BROWSER_RENDERER_HOST_INPUT_INPUT_QUEUE_H_ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "content/common/content_export.h" #include "content/common/input/input_event_disposition.h" namespace content { class BrowserInputEvent; class EventPacketAck; class InputQueueClient; // |InputQueue| handles browser input event batching and response. // Event packets are assembled into sequential event packets. A flush entails // delivery and dispatch of a single event packet, and continues until the // packet is ack'ed and all its events have been dispatched to the renderer. class CONTENT_EXPORT InputQueue { public: // The |client| should outlive the InputQueue. InputQueue(InputQueueClient* client); virtual ~InputQueue(); // If a flush is in progress, |event| will be dispatched in the next flush. // If no flush is in progress, a flush will be requested if necessary. // |event| is assumed to be both non-NULL and valid. void QueueEvent(scoped_ptr<BrowserInputEvent> event); // Initiates the flush of the pending event packet to |client_|, if necessary. // This should only be called in response to |client_->SetNeedsFlush()|. void BeginFlush(); // Called by the owner upon EventPacket responses from the sender target. This // will dispatch event acks for events with a corresponding |ack_handler|. enum AckResult { ACK_OK, // |acked_packet| was processed successfully. ACK_UNEXPECTED, // |acked_packet| was unexpected; no flush was in-progress. ACK_INVALID, // |acked_packet| contains invalid data. ACK_SHUTDOWN // |acked_packet| processing triggered queue shutdown. }; AckResult OnEventPacketAck(int64 packet_id, const InputEventDispositions& dispositions); // Total number of evenst in the queue, both being flushed and pending flush. size_t QueuedEventCount() const; protected: friend class InputQueueTest; // Delivers |in_flush_packet_| to the client. void DeliverInFlushPacket(); // Requests a flush via |client_| if the necessary request has not been made. void RequestFlushIfNecessary(); // True when |in_flush_packet_| is non-empty. bool FlushInProgress() const; private: InputQueueClient* client_; // Used to assign unique, non-zero ID's to each delivered EventPacket. int64 next_packet_id_; // Avoid spamming the client with redundant flush requests. bool flush_requested_; class BrowserEventPacket; scoped_ptr<BrowserEventPacket> in_flush_packet_; scoped_ptr<BrowserEventPacket> pending_flush_packet_; DISALLOW_COPY_AND_ASSIGN(InputQueue); }; } // namespace content #endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_INPUT_QUEUE_H_