1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_
6#define CONTENT_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_
7
8#include "base/containers/scoped_ptr_hash_map.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/weak_ptr.h"
11#include "content/common/input/input_event_ack_state.h"
12#include "content/renderer/render_view_impl.h"
13
14namespace base {
15class MessageLoopProxy;
16}
17
18namespace cc {
19class InputHandler;
20}
21
22namespace blink {
23class WebInputEvent;
24}
25
26namespace content {
27
28class InputHandlerWrapper;
29class InputHandlerManagerClient;
30struct DidOverscrollParams;
31
32// InputHandlerManager class manages InputHandlerProxy instances for
33// the WebViews in this renderer.
34class InputHandlerManager {
35 public:
36  // |message_loop_proxy| is the MessageLoopProxy of the compositor thread. Both
37  // the underlying MessageLoop and supplied |client| must outlive this object.
38  InputHandlerManager(
39      const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
40      InputHandlerManagerClient* client);
41  ~InputHandlerManager();
42
43  // Callable from the main thread only.
44  void AddInputHandler(
45      int routing_id,
46      const base::WeakPtr<cc::InputHandler>& input_handler,
47      const base::WeakPtr<RenderViewImpl>& render_view_impl);
48
49  // Callback only from the compositor's thread.
50  void RemoveInputHandler(int routing_id);
51
52  // Called from the compositor's thread.
53  InputEventAckState HandleInputEvent(int routing_id,
54                                      const blink::WebInputEvent* input_event,
55                                      ui::LatencyInfo* latency_info);
56
57  // Called from the compositor's thread.
58  void DidOverscroll(int routing_id, const DidOverscrollParams& params);
59
60  // Called from the compositor's thread.
61  void DidStopFlinging(int routing_id);
62
63 private:
64  // Called from the compositor's thread.
65  void AddInputHandlerOnCompositorThread(
66      int routing_id,
67      const scoped_refptr<base::MessageLoopProxy>& main_loop,
68      const base::WeakPtr<cc::InputHandler>& input_handler,
69      const base::WeakPtr<RenderViewImpl>& render_view_impl);
70
71  typedef base::ScopedPtrHashMap<int,  // routing_id
72                                 InputHandlerWrapper> InputHandlerMap;
73  InputHandlerMap input_handlers_;
74
75  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
76  InputHandlerManagerClient* client_;
77};
78
79}  // namespace content
80
81#endif  // CONTENT_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_
82