// 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 <unordered_map>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "content/public/common/input_event_ack_state.h"
#include "content/renderer/render_view_impl.h"
#include "ui/events/blink/input_handler_proxy.h"

namespace base {
class SingleThreadTaskRunner;
}

namespace cc {
class InputHandler;
struct InputHandlerScrollResult;
}

namespace blink {
class WebMouseWheelEvent;
}

namespace blink {
namespace scheduler {
class WebMainThreadScheduler;
}
}

namespace ui {
struct DidOverscrollParams;
}

namespace content {

class InputHandlerWrapper;
class InputHandlerManagerClient;
class MainThreadEventQueue;
class SynchronousInputHandlerProxyClient;

InputEventAckState InputEventDispositionToAck(
    ui::InputHandlerProxy::EventDisposition disposition);

// InputHandlerManager class manages InputHandlerProxy instances for
// the WebViews in this renderer.
class CONTENT_EXPORT InputHandlerManager {
 public:
  // |task_runner| is the SingleThreadTaskRunner of the compositor thread. The
  // underlying MessageLoop and supplied |client| and the |renderer_scheduler|
  // must outlive this object. The RendererScheduler needs to know when input
  // events and fling animations occur, which is why it's passed in here.
  InputHandlerManager(
      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
      InputHandlerManagerClient* client,
      SynchronousInputHandlerProxyClient* sync_handler_client,
      blink::scheduler::WebMainThreadScheduler* main_thread_scheduler);
  virtual ~InputHandlerManager();

  // Callable from the main thread only.
  void AddInputHandler(
      int routing_id,
      const base::WeakPtr<cc::InputHandler>& input_handler,
      const scoped_refptr<MainThreadEventQueue>& input_event_queue,
      const base::WeakPtr<RenderWidget>& render_widget,
      bool enable_smooth_scrolling);

  void UnregisterRoutingID(int routing_id);

  void RegisterAssociatedRenderFrameRoutingID(int render_frame_routing_id,
                                              int render_view_routing_id);
  void RegisterAssociatedRenderFrameRoutingIDOnCompositorThread(
      int render_frame_routing_id,
      int render_view_routing_id);

  void ObserveGestureEventAndResultOnMainThread(
      int routing_id,
      const blink::WebGestureEvent& gesture_event,
      const cc::InputHandlerScrollResult& scroll_result);

  // Callback only from the compositor's thread.
  void RemoveInputHandler(int routing_id);

  using InputEventAckStateCallback =
      base::Callback<void(InputEventAckState,
                          ui::WebScopedInputEvent,
                          const ui::LatencyInfo&,
                          std::unique_ptr<ui::DidOverscrollParams>)>;
  // Called from the compositor's thread.
  virtual void HandleInputEvent(int routing_id,
                                ui::WebScopedInputEvent input_event,
                                const ui::LatencyInfo& latency_info,
                                const InputEventAckStateCallback& callback);

  virtual void QueueClosureForMainThreadEventQueue(
      int routing_id,
      const base::Closure& closure);
  // Called from the compositor's thread.
  void DidOverscroll(int routing_id, const ui::DidOverscrollParams& params);

  // Called from the compositor's thread.
  void DidStopFlinging(int routing_id);

  // Called from the compositor's thread.
  void DidAnimateForInput();

  // Called from the compositor's thread.
  void DidStartScrollingViewport(int routing_id);

  // Called from the compositor's thread.
  void DispatchNonBlockingEventToMainThread(
      int routing_id,
      ui::WebScopedInputEvent event,
      const ui::LatencyInfo& latency_info);

  // Called from the compositor's thread.
  void SetWhiteListedTouchAction(
      int routing_id,
      cc::TouchAction touch_action,
      uint32_t unique_touch_event_id,
      ui::InputHandlerProxy::EventDisposition event_disposition);

 private:
  // Called from the compositor's thread.
  void AddInputHandlerOnCompositorThread(
      int routing_id,
      const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner,
      const base::WeakPtr<cc::InputHandler>& input_handler,
      const scoped_refptr<MainThreadEventQueue>& input_event_queue,
      const base::WeakPtr<RenderWidget>& render_widget,
      bool enable_smooth_scrolling);

  void UnregisterRoutingIDOnCompositorThread(int routing_id);

  void ObserveWheelEventAndResultOnCompositorThread(
      int routing_id,
      const blink::WebMouseWheelEvent& wheel_event,
      const cc::InputHandlerScrollResult& scroll_result);

  void ObserveGestureEventAndResultOnCompositorThread(
      int routing_id,
      const blink::WebGestureEvent& gesture_event,
      const cc::InputHandlerScrollResult& scroll_result);

  void DidHandleInputEventAndOverscroll(
      const InputEventAckStateCallback& callback,
      ui::InputHandlerProxy::EventDisposition event_disposition,
      ui::WebScopedInputEvent input_event,
      const ui::LatencyInfo& latency_info,
      std::unique_ptr<ui::DidOverscrollParams> overscroll_params);

  using InputHandlerMap =
      std::unordered_map<int,  // routing_id
                         std::unique_ptr<InputHandlerWrapper>>;
  InputHandlerMap input_handlers_;

  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
  InputHandlerManagerClient* const client_;
  // May be null.
  SynchronousInputHandlerProxyClient* const synchronous_handler_proxy_client_;

  // Not owned.
  blink::scheduler::WebMainThreadScheduler* const main_thread_scheduler_;

  base::WeakPtrFactory<InputHandlerManager> weak_ptr_factory_;
};

}  // namespace content

#endif  // CONTENT_RENDERER_INPUT_INPUT_HANDLER_MANAGER_H_
