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