Index: content/browser/renderer_host/input/buffered_input_router.h |
diff --git a/content/browser/renderer_host/input/buffered_input_router.h b/content/browser/renderer_host/input/buffered_input_router.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e166623952411d8049191ae5cfd2a41a67f371de |
--- /dev/null |
+++ b/content/browser/renderer_host/input/buffered_input_router.h |
@@ -0,0 +1,148 @@ |
+// 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_INPUT_RENDERER_HOST_BUFFERED_INPUT_ROUTER_H_ |
+#define CONTENT_BROWSER_INPUT_RENDERER_HOST_BUFFERED_INPUT_ROUTER_H_ |
+ |
+#include <map> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/scoped_vector.h" |
+#include "content/browser/renderer_host/input/browser_input_event.h" |
+#include "content/browser/renderer_host/input/input_queue.h" |
+#include "content/browser/renderer_host/input/input_queue_client.h" |
+#include "content/browser/renderer_host/input/input_router.h" |
+ |
+namespace IPC { |
+class Sender; |
+} |
+ |
+namespace content { |
+ |
+class InputAckHandler; |
+class RenderProcessHost; |
+class RenderWidgetHostImpl; |
+ |
+// Batches input events into EventPackets using a general input queue. Packets |
+// are sent the renderer on |Flush()|, called in response to flush requests. |
+class CONTENT_EXPORT BufferedInputRouter |
+ : public NON_EXPORTED_BASE(BrowserInputEventClient), |
+ public NON_EXPORTED_BASE(InputQueueClient), |
+ public NON_EXPORTED_BASE(InputRouter) { |
+ public: |
+ // |sender|, |client| and |ack_handler| must outlive the BufferedInputRouter. |
+ BufferedInputRouter(IPC::Sender* sender, |
+ InputRouterClient* client, |
+ InputAckHandler* ack_handler, |
+ int routing_id); |
+ virtual ~BufferedInputRouter(); |
+ |
+ // InputRouter |
+ virtual void Flush() OVERRIDE; |
+ virtual bool SendInput(scoped_ptr<IPC::Message> message) OVERRIDE; |
+ |
+ // Certain unhandled input event acks may create follow-up events, e.g., |
+ // TouchEvent -> GestureEvent. If these follow-up events are sent to the |
+ // router synchronously from the original event's |OnDispatched()| ack, they |
+ // will be inserted into the current input flush stream. |
+ virtual void SendMouseEvent( |
+ const MouseEventWithLatencyInfo& mouse_event) OVERRIDE; |
+ virtual void SendWheelEvent( |
+ const MouseWheelEventWithLatencyInfo& wheel_event) OVERRIDE; |
+ virtual void SendKeyboardEvent(const NativeWebKeyboardEvent& key_event, |
+ const ui::LatencyInfo& latency_info) OVERRIDE; |
+ virtual void SendGestureEvent( |
+ const GestureEventWithLatencyInfo& gesture_event) OVERRIDE; |
+ virtual void SendTouchEvent( |
+ const TouchEventWithLatencyInfo& touch_event) OVERRIDE; |
+ virtual void SendMouseEventImmediately( |
+ const MouseEventWithLatencyInfo& mouse_event) OVERRIDE; |
+ virtual void SendTouchEventImmediately( |
+ const TouchEventWithLatencyInfo& touch_event) OVERRIDE; |
+ virtual void SendGestureEventImmediately( |
+ const GestureEventWithLatencyInfo& gesture_event) OVERRIDE; |
+ virtual const NativeWebKeyboardEvent* GetLastKeyboardEvent() const OVERRIDE; |
+ virtual bool ShouldForwardTouchEvent() const OVERRIDE; |
+ virtual bool ShouldForwardGestureEvent( |
+ const GestureEventWithLatencyInfo& gesture_event) const OVERRIDE; |
+ virtual bool HasQueuedGestureEvents() const OVERRIDE; |
+ |
+ // InputQueueClient |
+ virtual void Deliver(const EventPacket& packet) OVERRIDE; |
+ virtual void DidFinishFlush() OVERRIDE; |
+ virtual void SetNeedsFlush() OVERRIDE; |
+ |
+ // BrowserInputEventClient |
+ virtual void OnDispatched(const BrowserInputEvent& event, |
+ InputEventDisposition disposition) OVERRIDE; |
+ // Events delivered to the router within the scope of |
+ // |OnDispatched()| will be added to |followup|. |
+ virtual void OnDispatched(const BrowserInputEvent& event, |
+ InputEventDisposition disposition, |
+ ScopedVector<BrowserInputEvent>* followup) OVERRIDE; |
+ |
+ // IPC::Receiver |
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |
+ |
+ protected: |
+ void OnWebInputEventAck(int64 event_id, |
+ const WebKit::WebInputEvent& web_event, |
+ const ui::LatencyInfo& latency_info, |
+ InputEventAckState acked_result, |
+ bool ack_from_input_queue); |
+ void OnEventPacketAck(int64 packet_id, |
+ const InputEventDispositions& dispositions); |
+ void OnHasTouchEventHandlers(bool has_handlers); |
+ |
+ // Returns the non-zero ID associated with the |InputEvent| added to the |
+ // |input_queue_|. If the event was dropped or filtered, returns 0. |
+ int64 QueueWebEvent(const WebKit::WebInputEvent& web_event, |
+ const ui::LatencyInfo& latency_info, |
+ bool is_key_shortcut); |
+ // Used by |QueueWebEvent()|; returns true if an event was filtered and should |
+ // not be added to the |input_queue_|. |
+ bool FilterWebEvent(const WebKit::WebInputEvent& web_event, |
+ const ui::LatencyInfo& latency_info); |
+ |
+ // Generates a monotonically increasing sequences of id's, starting with 1. |
+ int64 NextInputID(); |
+ |
+ const InputQueue* input_queue() const { return input_queue_.get(); } |
+ |
+ private: |
+ InputRouterClient* client_; |
+ InputAckHandler* ack_handler_; |
+ IPC::Sender* sender_; |
+ int routing_id_; |
+ |
+ scoped_ptr<InputQueue> input_queue_; |
+ |
+ // TODO(jdduke): Remove when we can properly serialize NativeWebKeyboardEvent. |
+ // Alternatively, attach WebInputEvents to InputEvents but don't serialize. |
+ typedef std::map<int64, NativeWebKeyboardEvent> KeyMap; |
+ KeyMap queued_key_map_; |
+ |
+ // Necessary for |HasQueuedGestureEvents()|. |
+ int queued_gesture_count_; |
+ |
+ // Necessary for |ShouldForwardTouchEvent()|. |
+ bool has_touch_handler_; |
+ int queued_touch_count_; |
+ |
+ // This is non-NULL ONLY in the scope of OnInputEventAck(event, injector). |
+ ScopedVector<BrowserInputEvent>* input_queue_override_; |
+ |
+ // Used to assign unique ID's to each InputEvent that is generated. |
+ int64 next_input_id_; |
+ |
+ // 0 if there no in-flight EventPacket. |
+ int64 in_flight_packet_id_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BufferedInputRouter); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_INPUT_RENDERER_HOST_BUFFERED_INPUT_ROUTER_H_ |