interactive_test_utils.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/view_ids.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_controls.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(TOOLKIT_VIEWS)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Point;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui_test_utils {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Brings the native window for |browser| to the foreground. Returns true on
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// success.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BringBrowserWindowToFront(const Browser* browser) WARN_UNUSED_RESULT;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if the View is focused.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsViewFocused(const Browser* browser, ViewID vid);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Simulates a mouse click on a View in the browser.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClickOnView(const Browser* browser, ViewID vid);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A collection of utilities that are used from interactive_ui_tests. These are
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// separated from ui_test_utils.h to ensure that browser_tests don't use them,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// since they depend on focus which isn't possible for sharded test.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Hide a native window.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HideNativeWindow(gfx::NativeWindow window);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Show and focus a native window. Returns true on success.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShowAndFocusNativeWindow(gfx::NativeWindow window) WARN_UNUSED_RESULT;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a key press, blocking until the key press is received or the test times
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// out. This uses ui_controls::SendKeyPress, see it for details. Returns true
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if the event was successfully sent and received.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressSync(const Browser* browser,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ui::KeyboardCode key,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool control,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool shift,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool alt,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool command) WARN_UNUSED_RESULT;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a key press, blocking until the key press is received or the test times
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// out. This uses ui_controls::SendKeyPress, see it for details. Returns true
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if the event was successfully sent and received.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressToWindowSync(const gfx::NativeWindow window,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              ui::KeyboardCode key,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool control,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool shift,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool alt,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool command) WARN_UNUSED_RESULT;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a key press, blocking until both the key press and a notification from
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |source| of type |type| are received, or until the test times out. This uses
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ui_controls::SendKeyPress, see it for details. Returns true if the event was
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// successfully sent and both the event and notification were received.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressAndWait(const Browser* browser,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         ui::KeyboardCode key,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool control,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool shift,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool alt,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool command,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int type,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const content::NotificationSource& source)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             WARN_UNUSED_RESULT;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a move event blocking until received. Returns true if the event was
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// successfully received. This uses ui_controls::SendMouse***NotifyWhenDone,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// see it for details.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendMouseMoveSync(const gfx::Point& location) WARN_UNUSED_RESULT;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendMouseEventsSync(ui_controls::MouseButton type,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int state) WARN_UNUSED_RESULT;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See SendKeyPressAndWait.  This function additionally performs a check on the
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NotificationDetails using the provided Details<U>.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <class U>
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressAndWaitWithDetails(
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Browser* browser,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode key,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool control,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool shift,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool alt,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool command,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::Details<U>& details) WARN_UNUSED_RESULT;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <class U>
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressAndWaitWithDetails(
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Browser* browser,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode key,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool control,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool shift,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool alt,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool command,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::Details<U>& details) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WindowedNotificationObserverWithDetails<U> observer(type, source);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!SendKeyPressSync(browser, key, control, shift, alt, command))
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer.Wait();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  U my_details;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!observer.GetDetailsFor(source.map_key(), &my_details))
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *details.ptr() == my_details && !testing::Test::HasFatalFailure();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A combination of SendMouseMove to the middle of the view followed by
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SendMouseEvents.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MoveMouseToCenterAndPress(
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(TOOLKIT_VIEWS)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* view,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(TOOLKIT_GTK)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GtkWidget* widget,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_IOS)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIView* view,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NSView* view,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::MouseButton button,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int state,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& task);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A utility function to send a mouse click event in a closure. It's shared by
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ui_controls_linux.cc and ui_controls_mac.cc
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClickTask(ui_controls::MouseButton button,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               int state,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const base::Closure& followup);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace internal
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ui_test_utils
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
151