1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
6#define CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
7
8#include "chrome/browser/ui/view_ids.h"
9#include "chrome/test/base/ui_test_utils.h"
10#include "ui/base/test/ui_controls.h"
11
12#if defined(TOOLKIT_VIEWS)
13#include "ui/views/view.h"
14#endif
15
16namespace gfx {
17class Point;
18}
19
20namespace ui_test_utils {
21
22// Brings the native window for |browser| to the foreground. Returns true on
23// success.
24bool BringBrowserWindowToFront(const Browser* browser) WARN_UNUSED_RESULT;
25
26// Returns true if the View is focused.
27bool IsViewFocused(const Browser* browser, ViewID vid);
28
29// Simulates a mouse click on a View in the browser.
30void ClickOnView(const Browser* browser, ViewID vid);
31
32// A collection of utilities that are used from interactive_ui_tests. These are
33// separated from ui_test_utils.h to ensure that browser_tests don't use them,
34// since they depend on focus which isn't possible for sharded test.
35
36// Hide a native window.
37void HideNativeWindow(gfx::NativeWindow window);
38
39// Show and focus a native window. Returns true on success.
40bool ShowAndFocusNativeWindow(gfx::NativeWindow window) WARN_UNUSED_RESULT;
41
42// Sends a key press, blocking until the key press is received or the test times
43// out. This uses ui_controls::SendKeyPress, see it for details. Returns true
44// if the event was successfully sent and received.
45bool SendKeyPressSync(const Browser* browser,
46                      ui::KeyboardCode key,
47                      bool control,
48                      bool shift,
49                      bool alt,
50                      bool command) WARN_UNUSED_RESULT;
51
52// Sends a key press, blocking until the key press is received or the test times
53// out. This uses ui_controls::SendKeyPress, see it for details. Returns true
54// if the event was successfully sent and received.
55bool SendKeyPressToWindowSync(const gfx::NativeWindow window,
56                              ui::KeyboardCode key,
57                              bool control,
58                              bool shift,
59                              bool alt,
60                              bool command) WARN_UNUSED_RESULT;
61
62// Sends a key press, blocking until both the key press and a notification from
63// |source| of type |type| are received, or until the test times out. This uses
64// ui_controls::SendKeyPress, see it for details. Returns true if the event was
65// successfully sent and both the event and notification were received.
66bool SendKeyPressAndWait(const Browser* browser,
67                         ui::KeyboardCode key,
68                         bool control,
69                         bool shift,
70                         bool alt,
71                         bool command,
72                         int type,
73                         const content::NotificationSource& source)
74                             WARN_UNUSED_RESULT;
75
76// Sends a move event blocking until received. Returns true if the event was
77// successfully received. This uses ui_controls::SendMouse***NotifyWhenDone,
78// see it for details.
79bool SendMouseMoveSync(const gfx::Point& location) WARN_UNUSED_RESULT;
80bool SendMouseEventsSync(ui_controls::MouseButton type,
81                         int state) WARN_UNUSED_RESULT;
82
83// See SendKeyPressAndWait.  This function additionally performs a check on the
84// NotificationDetails using the provided Details<U>.
85template <class U>
86bool SendKeyPressAndWaitWithDetails(
87    const Browser* browser,
88    ui::KeyboardCode key,
89    bool control,
90    bool shift,
91    bool alt,
92    bool command,
93    int type,
94    const content::NotificationSource& source,
95    const content::Details<U>& details) WARN_UNUSED_RESULT;
96
97template <class U>
98bool SendKeyPressAndWaitWithDetails(
99    const Browser* browser,
100    ui::KeyboardCode key,
101    bool control,
102    bool shift,
103    bool alt,
104    bool command,
105    int type,
106    const content::NotificationSource& source,
107    const content::Details<U>& details) {
108  WindowedNotificationObserverWithDetails<U> observer(type, source);
109
110  if (!SendKeyPressSync(browser, key, control, shift, alt, command))
111    return false;
112
113  observer.Wait();
114
115  U my_details;
116  if (!observer.GetDetailsFor(source.map_key(), &my_details))
117    return false;
118
119  return *details.ptr() == my_details && !testing::Test::HasFatalFailure();
120}
121
122// A combination of SendMouseMove to the middle of the view followed by
123// SendMouseEvents.
124void MoveMouseToCenterAndPress(
125#if defined(TOOLKIT_VIEWS)
126    views::View* view,
127#elif defined(TOOLKIT_GTK)
128    GtkWidget* widget,
129#elif defined(OS_IOS)
130    UIView* view,
131#elif defined(OS_MACOSX)
132    NSView* view,
133#endif
134    ui_controls::MouseButton button,
135    int state,
136    const base::Closure& task);
137
138namespace internal {
139
140// A utility function to send a mouse click event in a closure. It's shared by
141// ui_controls_linux.cc and ui_controls_mac.cc
142void ClickTask(ui_controls::MouseButton button,
143               int state,
144               const base::Closure& followup);
145
146}  // namespace internal
147
148}  // namespace ui_test_utils
149
150#endif  // CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
151