| 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_
 | 
| 
 |