// 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_INPUT_SYNTHETIC_WEB_INPUT_EVENT_BUILDERS_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_INPUT_SYNTHETIC_WEB_INPUT_EVENT_BUILDERS_H_

#include "base/time/time.h"
#include "third_party/blink/public/common/common_export.h"
#include "third_party/blink/public/common/input/web_gesture_event.h"
#include "third_party/blink/public/common/input/web_input_event.h"
#include "third_party/blink/public/common/input/web_keyboard_event.h"
#include "third_party/blink/public/common/input/web_mouse_wheel_event.h"
#include "third_party/blink/public/common/input/web_touch_event.h"
#include "ui/events/types/scroll_types.h"

// Provides sensible creation of default WebInputEvents for testing purposes.

namespace blink {

class BLINK_COMMON_EXPORT SyntheticWebMouseEventBuilder {
 public:
  static blink::WebMouseEvent Build(blink::WebInputEvent::Type type);
  static blink::WebMouseEvent Build(
      blink::WebInputEvent::Type type,
      float window_x,
      float window_y,
      int modifiers,
      blink::WebPointerProperties::PointerType pointer_type =
          blink::WebPointerProperties::PointerType::kMouse);
};

class BLINK_COMMON_EXPORT SyntheticWebMouseWheelEventBuilder {
 public:
  static blink::WebMouseWheelEvent Build(
      blink::WebMouseWheelEvent::Phase phase);
  static blink::WebMouseWheelEvent Build(float x,
                                         float y,
                                         float dx,
                                         float dy,
                                         int modifiers,
                                         ui::ScrollGranularity delta_units);
  static blink::WebMouseWheelEvent Build(float x,
                                         float y,
                                         float global_x,
                                         float global_y,
                                         float dx,
                                         float dy,
                                         int modifiers,
                                         ui::ScrollGranularity delta_units);
};

class BLINK_COMMON_EXPORT SyntheticWebGestureEventBuilder {
 public:
  static blink::WebGestureEvent Build(blink::WebInputEvent::Type type,
                                      blink::WebGestureDevice source_device,
                                      int modifiers = 0);
  static blink::WebGestureEvent BuildScrollBegin(
      float dx_hint,
      float dy_hint,
      blink::WebGestureDevice source_device,
      int pointer_count = 1);
  static blink::WebGestureEvent BuildScrollUpdate(
      float dx,
      float dy,
      int modifiers,
      blink::WebGestureDevice source_device);
  static blink::WebGestureEvent BuildPinchUpdate(
      float scale,
      float anchor_x,
      float anchor_y,
      int modifiers,
      blink::WebGestureDevice source_device);
  static blink::WebGestureEvent BuildFling(
      float velocity_x,
      float velocity_y,
      blink::WebGestureDevice source_device);
};

class BLINK_COMMON_EXPORT SyntheticWebTouchEvent : public blink::WebTouchEvent {
 public:
  SyntheticWebTouchEvent();

  // Mark all the points as stationary, and remove any released points.
  void ResetPoints();

  // Adds an additional point to the touch list, returning the point's index.
  int PressPoint(float x,
                 float y,
                 float radius_x = 20.f,
                 float radius_y = 20.f,
                 float rotation_angle = 0.f,
                 float force = 1.f);
  void MovePoint(int index,
                 float x,
                 float y,
                 float radius_x = 20.f,
                 float radius_y = 20.f,
                 float rotation_angle = 0.f,
                 float force = 1.f);
  void ReleasePoint(int index);
  void CancelPoint(int index);

  void SetTimestamp(base::TimeTicks timestamp);

  int FirstFreeIndex();

 private:
  // A pointer id of each touch pointer. Every time when a pointer is pressed
  // the screen, it will be assigned to a new pointer id.
  unsigned pointer_id_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_INPUT_SYNTHETIC_WEB_INPUT_EVENT_BUILDERS_H_
