// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_TEST_MOCK_RENDER_INPUT_ROUTER_H_
#define CONTENT_TEST_MOCK_RENDER_INPUT_ROUTER_H_

#include <stddef.h>

#include <memory>
#include <utility>

#include "components/input/render_input_router.h"
#include "content/test/mock_widget_input_handler.h"

using blink::WebGestureEvent;
using blink::WebTouchEvent;

namespace content {

class MockRenderInputRouter : public input::RenderInputRouter {
 public:
  using input::RenderInputRouter::input_router_;

  explicit MockRenderInputRouter(
      input::RenderInputRouterClient* host,
      std::unique_ptr<input::FlingSchedulerBase> fling_scheduler,
      input::RenderInputRouterDelegate* delegate,
      scoped_refptr<base::SingleThreadTaskRunner> task_runner);

  MockRenderInputRouter(const MockRenderInputRouter&) = delete;
  MockRenderInputRouter& operator=(const MockRenderInputRouter&) = delete;

  ~MockRenderInputRouter() override;

  // InputRouterImplClient overrides.
  blink::mojom::WidgetInputHandler* GetWidgetInputHandler() override;

  // InputDispositionHandler overrides.
  void OnTouchEventAck(const input::TouchEventWithLatencyInfo& event,
                       blink::mojom::InputEventResultSource ack_source,
                       blink::mojom::InputEventResultState ack_result) override;

  void SetupForInputRouterTest();

  void ForwardTouchEventWithLatencyInfo(
      const blink::WebTouchEvent& touch_event,
      const ui::LatencyInfo& ui_latency) override;

  void ForwardGestureEventWithLatencyInfo(
      const blink::WebGestureEvent& gesture_event,
      const ui::LatencyInfo& ui_latency) override;

  std::optional<WebGestureEvent> GetAndResetLastForwardedGestureEvent();
  std::optional<WebTouchEvent> GetAndResetLastForwardedTouchEvent();

  void SetLastWheelOrTouchEventLatencyInfo(ui::LatencyInfo latency_info) {
    last_wheel_or_touch_event_latency_info_ = latency_info;
  }

  std::optional<ui::LatencyInfo> GetLastWheelOrTouchEventLatencyInfo() {
    return last_wheel_or_touch_event_latency_info_;
  }

  MockWidgetInputHandler::MessageVector GetAndResetDispatchedMessages();

  std::optional<blink::WebInputEvent::Type> acked_touch_event_type() const {
    return acked_touch_event_type_;
  }

  std::optional<blink::WebInputEvent::Type> acked_touch_event_type_;

  std::unique_ptr<MockWidgetInputHandler> mock_widget_input_handler_;

 private:
  std::optional<ui::LatencyInfo> last_wheel_or_touch_event_latency_info_;
  std::optional<WebGestureEvent> last_forwarded_gesture_event_;
  std::optional<WebTouchEvent> last_forwarded_touch_event_;
};

}  // namespace content

#endif  // CONTENT_TEST_MOCK_RENDER_INPUT_ROUTER_H_
