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_test_utils.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Point;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(TOOLKIT_VIEWS)
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace views {
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class View;
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui_test_utils {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Brings the native window for |browser| to the foreground. Returns true on
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// success.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BringBrowserWindowToFront(const Browser* browser) WARN_UNUSED_RESULT;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if the View is focused.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsViewFocused(const Browser* browser, ViewID vid);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Simulates a mouse click on a View in the browser.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClickOnView(const Browser* browser, ViewID vid);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Makes focus shift to the given View without clicking it.
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FocusView(const Browser* browser, ViewID vid);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A collection of utilities that are used from interactive_ui_tests. These are
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// separated from ui_test_utils.h to ensure that browser_tests don't use them,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// since they depend on focus which isn't possible for sharded test.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Hide a native window.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HideNativeWindow(gfx::NativeWindow window);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Show and focus a native window. Returns true on success.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShowAndFocusNativeWindow(gfx::NativeWindow window) WARN_UNUSED_RESULT;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a key press, blocking until the key press is received or the test times
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// out. This uses ui_controls::SendKeyPress, see it for details. Returns true
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if the event was successfully sent and received.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressSync(const Browser* browser,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ui::KeyboardCode key,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool control,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool shift,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool alt,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool command) WARN_UNUSED_RESULT;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a key press, blocking until the key press is received or the test times
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// out. This uses ui_controls::SendKeyPress, see it for details. Returns true
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if the event was successfully sent and received.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressToWindowSync(const gfx::NativeWindow window,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              ui::KeyboardCode key,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool control,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool shift,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool alt,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool command) WARN_UNUSED_RESULT;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a key press, blocking until both the key press and a notification from
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |source| of type |type| are received, or until the test times out. This uses
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ui_controls::SendKeyPress, see it for details. Returns true if the event was
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// successfully sent and both the event and notification were received.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressAndWait(const Browser* browser,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         ui::KeyboardCode key,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool control,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool shift,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool alt,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool command,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int type,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const content::NotificationSource& source)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             WARN_UNUSED_RESULT;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sends a move event blocking until received. Returns true if the event was
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// successfully received. This uses ui_controls::SendMouse***NotifyWhenDone,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// see it for details.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendMouseMoveSync(const gfx::Point& location) WARN_UNUSED_RESULT;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendMouseEventsSync(ui_controls::MouseButton type,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int state) WARN_UNUSED_RESULT;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See SendKeyPressAndWait.  This function additionally performs a check on the
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NotificationDetails using the provided Details<U>.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <class U>
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressAndWaitWithDetails(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Browser* browser,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode key,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool control,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool shift,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool alt,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool command,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::Details<U>& details) WARN_UNUSED_RESULT;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <class U>
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SendKeyPressAndWaitWithDetails(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Browser* browser,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode key,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool control,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool shift,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool alt,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool command,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::Details<U>& details) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WindowedNotificationObserverWithDetails<U> observer(type, source);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!SendKeyPressSync(browser, key, control, shift, alt, command))
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer.Wait();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  U my_details;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!observer.GetDetailsFor(source.map_key(), &my_details))
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *details.ptr() == my_details && !testing::Test::HasFatalFailure();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A combination of SendMouseMove to the middle of the view followed by
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// SendMouseEvents. Only exposed for toolkit-views.
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Alternatives: ClickOnView() and ui::test::EventGenerator.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(TOOLKIT_VIEWS)
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void MoveMouseToCenterAndPress(views::View* view,
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               ui_controls::MouseButton button,
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               int state,
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               const base::Closure& task);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A utility function to send a mouse click event in a closure. It's shared by
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ui_controls_linux.cc and ui_controls_mac.cc
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClickTask(ui_controls::MouseButton button,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               int state,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const base::Closure& followup);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace internal
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ui_test_utils
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
150