| Index: content/browser/devtools/protocol/input_handler.h
 | 
| diff --git a/content/browser/devtools/protocol/input_handler.h b/content/browser/devtools/protocol/input_handler.h
 | 
| index 691cad2f6417e1310317a2edcedbd44063dd263a..e98c527e03135cb50ba7ba059d5969d59cc43855 100644
 | 
| --- a/content/browser/devtools/protocol/input_handler.h
 | 
| +++ b/content/browser/devtools/protocol/input_handler.h
 | 
| @@ -10,6 +10,7 @@
 | 
|  #include "content/browser/devtools/protocol/devtools_protocol_dispatcher.h"
 | 
|  #include "content/browser/renderer_host/input/synthetic_gesture.h"
 | 
|  #include "content/common/input/synthetic_smooth_scroll_gesture_params.h"
 | 
| +#include "content/public/browser/render_widget_host.h"
 | 
|  #include "ui/gfx/geometry/size_f.h"
 | 
|  
 | 
|  namespace cc {
 | 
| @@ -23,18 +24,20 @@ class RenderWidgetHostImpl;
 | 
|  namespace devtools {
 | 
|  namespace input {
 | 
|  
 | 
| -class InputHandler {
 | 
| +class InputHandler : public RenderWidgetHost::InputEventObserver {
 | 
|   public:
 | 
|    typedef DevToolsProtocolClient::Response Response;
 | 
|  
 | 
|    InputHandler();
 | 
| -  virtual ~InputHandler();
 | 
| +  ~InputHandler() override;
 | 
|  
 | 
|    void SetRenderWidgetHost(RenderWidgetHostImpl* host);
 | 
|    void SetClient(std::unique_ptr<Client> client);
 | 
|    void OnSwapCompositorFrame(const cc::CompositorFrameMetadata& frame_metadata);
 | 
| +  void Detached();
 | 
|  
 | 
| -  Response DispatchKeyEvent(const std::string& type,
 | 
| +  Response DispatchKeyEvent(DevToolsCommandId command_id,
 | 
| +                            const std::string& type,
 | 
|                              const int* modifiers,
 | 
|                              const double* timestamp,
 | 
|                              const std::string* text,
 | 
| @@ -48,7 +51,8 @@ class InputHandler {
 | 
|                              const bool* is_keypad,
 | 
|                              const bool* is_system_key);
 | 
|  
 | 
| -  Response DispatchMouseEvent(const std::string& type,
 | 
| +  Response DispatchMouseEvent(DevToolsCommandId command_id,
 | 
| +                              const std::string& type,
 | 
|                                int x,
 | 
|                                int y,
 | 
|                                const int* modifiers,
 | 
| @@ -101,6 +105,13 @@ class InputHandler {
 | 
|        const double* timestamp);
 | 
|  
 | 
|   private:
 | 
| +  // InputEventObserver
 | 
| +  void OnInputEvent(const blink::WebInputEvent& event) override;
 | 
| +  void OnInputEventAck(const blink::WebInputEvent& event) override;
 | 
| +
 | 
| +  void SendDispatchKeyEventResponse(DevToolsCommandId command_id);
 | 
| +  void SendDispatchMouseEventResponse(DevToolsCommandId command_id);
 | 
| +
 | 
|    void SendSynthesizePinchGestureResponse(DevToolsCommandId command_id,
 | 
|                                            SyntheticGesture::Result result);
 | 
|  
 | 
| @@ -125,8 +136,16 @@ class InputHandler {
 | 
|                          DevToolsCommandId command_id,
 | 
|                          SyntheticGesture::Result result);
 | 
|  
 | 
| +  void ClearPendingKeyCommands();
 | 
| +  void ClearPendingMouseCommands();
 | 
| +
 | 
|    RenderWidgetHostImpl* host_;
 | 
|    std::unique_ptr<Client> client_;
 | 
| +  // DevToolsCommandIds for calls to Input.dispatchKey/MouseEvent that have been
 | 
| +  // sent to the renderer, but that we haven't yet received an ack for.
 | 
| +  bool input_queued_;
 | 
| +  std::deque<DevToolsCommandId> pending_key_command_ids_;
 | 
| +  std::deque<DevToolsCommandId> pending_mouse_command_ids_;
 | 
|    float page_scale_factor_;
 | 
|    gfx::SizeF scrollable_viewport_size_;
 | 
|    base::WeakPtrFactory<InputHandler> weak_factory_;
 | 
| 
 |