// Copyright 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_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_
#define CONTENT_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "content/port/common/input_event_ack_state.h"
#include "content/renderer/render_view_impl.h"
namespace base {
class MessageLoopProxy;
}
namespace cc {
class InputHandler;
struct DidOverscrollParams;
}
namespace blink {
class WebInputEvent;
}
namespace content {
class InputHandlerWrapper;
class InputHandlerManagerClient;
// InputHandlerManager class manages InputHandlerProxy instances for
// the WebViews in this renderer.
class InputHandlerManager {
public:
// |message_loop_proxy| is the MessageLoopProxy of the compositor thread. Both
// the underlying MessageLoop and supplied |client| must outlive this object.
InputHandlerManager(
const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
InputHandlerManagerClient* client);
~InputHandlerManager();
// Callable from the main thread only.
void AddInputHandler(
int routing_id,
const base::WeakPtr<cc::InputHandler>& input_handler,
const base::WeakPtr<RenderViewImpl>& render_view_impl);
// Callback only from the compositor's thread.
void RemoveInputHandler(int routing_id);
// Called from the compositor's thread.
InputEventAckState HandleInputEvent(int routing_id,
const blink::WebInputEvent* input_event,
ui::LatencyInfo* latency_info);
// Called from the compositor's thread.
void DidOverscroll(int routing_id, const cc::DidOverscrollParams& params);
private:
// Called from the compositor's thread.
void AddInputHandlerOnCompositorThread(
int routing_id,
const scoped_refptr<base::MessageLoopProxy>& main_loop,
const base::WeakPtr<cc::InputHandler>& input_handler,
const base::WeakPtr<RenderViewImpl>& render_view_impl);
typedef base::ScopedPtrHashMap<int, // routing_id
InputHandlerWrapper> InputHandlerMap;
InputHandlerMap input_handlers_;
scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
InputHandlerManagerClient* client_;
};
} // namespace content
#endif // CONTENT_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_