Index: content/browser/renderer_host/input/input_queue.h |
diff --git a/content/browser/renderer_host/input/input_queue.h b/content/browser/renderer_host/input/input_queue.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f3322a3dd6b2d399fb9da8b2e0ca88c8ccf5a9a7 |
--- /dev/null |
+++ b/content/browser/renderer_host/input/input_queue.h |
@@ -0,0 +1,82 @@ |
+// Copyright (c) 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_ |