blob: 01e5a9d987347df659e9fb06363f177e3b6d8ce9 [file] [log] [blame]
// Copyright (c) 2012 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 UI_AURA_TEST_EVENT_GENERATOR_H_
#define UI_AURA_TEST_EVENT_GENERATOR_H_
#include "base/basictypes.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/gfx/point.h"
namespace base {
class TimeDelta;
}
namespace ui {
class Event;
}
namespace aura {
class RootWindow;
class Window;
namespace test {
// EventGenerator is a tool that generates and dispatch events.
class EventGenerator {
public:
// Creates an EventGenerator with the mouse/touch location (0,0).
explicit EventGenerator(RootWindow* root_window);
// Creates an EventGenerator with the mouse/touch location
// at |initial_location|.
EventGenerator(RootWindow* root_window, const gfx::Point& initial_location);
// Creates an EventGenerator with the mouse/touch location
// centered over |window|.
EventGenerator(RootWindow* root_window, Window* window);
virtual ~EventGenerator();
// Explicitly sets the location used by mouse/touch events. This is set by the
// various methods that take a location but can be manipulated directly,
// typically for touch.
void set_current_location(const gfx::Point& location) {
current_location_ = location;
}
const gfx::Point& current_location() const { return current_location_; }
// Resets the event flags bitmask.
void set_flags(int flags) { flags_ = flags; }
// Generates a left button press event.
void PressLeftButton();
// Generates a left button release event.
void ReleaseLeftButton();
// Generates events to click (press, release) left button.
void ClickLeftButton();
// Generates a double click event using the left button.
void DoubleClickLeftButton();
// Generates a right button press event.
void PressRightButton();
// Generates a right button release event.
void ReleaseRightButton();
// Generates events to move mouse to be the given |point|.
void MoveMouseTo(const gfx::Point& point, int count);
void MoveMouseTo(const gfx::Point& point) {
MoveMouseTo(point, 1);
}
void MoveMouseTo(int x, int y) {
MoveMouseTo(gfx::Point(x, y));
}
// Generates events to move mouse to be the given |point| in |window|'s
// coordinates.
void MoveMouseRelativeTo(const Window* window, const gfx::Point& point);
void MoveMouseRelativeTo(const Window* window, int x, int y) {
MoveMouseRelativeTo(window, gfx::Point(x, y));
}
void MoveMouseBy(int x, int y) {
MoveMouseTo(current_location_.Add(gfx::Point(x, y)));
}
// Generates events to drag mouse to given |point|.
void DragMouseTo(const gfx::Point& point);
void DragMouseTo(int x, int y) {
DragMouseTo(gfx::Point(x, y));
}
void DragMouseBy(int dx, int dy) {
DragMouseTo(current_location_.Add(gfx::Point(dx, dy)));
}
// Generates events to move the mouse to the center of the window.
void MoveMouseToCenterOf(Window* window);
// Generates a touch press event.
void PressTouch();
// Generates a ET_TOUCH_MOVED event to |point|.
void MoveTouch(const gfx::Point& point);
// Generates a touch release event.
void ReleaseTouch();
// Generates press, move and release event to move touch
// to be the given |point|.
void PressMoveAndReleaseTouchTo(const gfx::Point& point);
void PressMoveAndReleaseTouchTo(int x, int y) {
PressMoveAndReleaseTouchTo(gfx::Point(x, y));
}
void PressMoveAndReleaseTouchBy(int x, int y) {
PressMoveAndReleaseTouchTo(current_location_.Add(gfx::Point(x, y)));
}
// Generates press, move and release events to move touch
// to the center of the window.
void PressMoveAndReleaseTouchToCenterOf(Window* window);
// Generates and dispatches touch-events required to generate a TAP gesture.
// Note that this can generate a number of other gesture events at the same
// time (e.g. GESTURE_BEGIN, TAP_DOWN, END).
void GestureTapAt(const gfx::Point& point);
// Generates press and release touch-events to generate a TAP_DOWN event, but
// without generating any scroll or tap events. This can also generate a few
// other gesture events (e.g. GESTURE_BEGIN, END).
void GestureTapDownAndUp(const gfx::Point& point);
// Generates press, move, release touch-events to generate a sequence of
// scroll events. |duration| and |steps| affect the velocity of the scroll,
// and depending on these values, this may also generate FLING scroll
// gestures. If velocity/fling is irrelevant for the test, then any non-zero
// values for these should be sufficient.
void GestureScrollSequence(const gfx::Point& start,
const gfx::Point& end,
const base::TimeDelta& duration,
int steps);
// Generates press, move, release touch-events to generate a sequence of
// multi-finger scroll events. |count| specifies the number of touch-points
// that should generate the scroll events. |start| are the starting positions
// of all the touch points. |steps| and |event_separation_time_ms| are
// relevant when testing velocity/fling/swipe, otherwise these can be any
// non-zero value. |delta_x| and |delta_y| are the amount that each finger
// should be moved.
void GestureMultiFingerScroll(int count,
const gfx::Point* start,
int event_separation_time_ms,
int steps,
int move_x,
int move_y);
// Generates a key press event. On platforms except Windows and X11, a key
// event without native_event() is generated. Note that ui::EF_ flags should
// be passed as |flags|, not the native ones like 'ShiftMask' in <X11/X.h>.
// TODO(yusukes): Support native_event() on all platforms.
void PressKey(ui::KeyboardCode key_code, int flags);
// Generates a key release event. On platforms except Windows and X11, a key
// event without native_event() is generated. Note that ui::EF_ flags should
// be passed as |flags|, not the native ones like 'ShiftMask' in <X11/X.h>.
// TODO(yusukes): Support native_event() on all platforms.
void ReleaseKey(ui::KeyboardCode key_code, int flags);
// Dispatch the |event| to the RootWindow.
void Dispatch(ui::Event& event);
private:
// Dispatch a key event to the RootWindow.
void DispatchKeyEvent(bool is_press, ui::KeyboardCode key_code, int flags);
RootWindow* root_window_;
int flags_;
gfx::Point current_location_;
DISALLOW_COPY_AND_ASSIGN(EventGenerator);
};
} // namespace test
} // namespace aura
#endif // UI_AURA_TEST_EVENT_GENERATOR_H_