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 #include "chrome/test/base/interactive_test_utils.h" 6 7 #include "chrome/browser/ui/browser.h" 8 #include "chrome/browser/ui/browser_window.h" 9 10 namespace ui_test_utils { 11 12 namespace { 13 14 bool GetNativeWindow(const Browser* browser, gfx::NativeWindow* native_window) { 15 BrowserWindow* window = browser->window(); 16 if (!window) 17 return false; 18 19 *native_window = window->GetNativeWindow(); 20 return *native_window; 21 } 22 23 } // namespace 24 25 bool BringBrowserWindowToFront(const Browser* browser) { 26 gfx::NativeWindow window = NULL; 27 if (!GetNativeWindow(browser, &window)) 28 return false; 29 30 return ui_test_utils::ShowAndFocusNativeWindow(window); 31 } 32 33 bool SendKeyPressSync(const Browser* browser, 34 ui::KeyboardCode key, 35 bool control, 36 bool shift, 37 bool alt, 38 bool command) { 39 gfx::NativeWindow window = NULL; 40 if (!GetNativeWindow(browser, &window)) 41 return false; 42 return SendKeyPressToWindowSync(window, key, control, shift, alt, command); 43 } 44 45 bool SendKeyPressToWindowSync(const gfx::NativeWindow window, 46 ui::KeyboardCode key, 47 bool control, 48 bool shift, 49 bool alt, 50 bool command) { 51 scoped_refptr<content::MessageLoopRunner> runner = 52 new content::MessageLoopRunner; 53 bool result; 54 result = ui_controls::SendKeyPressNotifyWhenDone( 55 window, key, control, shift, alt, command, runner->QuitClosure()); 56 #if defined(OS_WIN) 57 if (!result && ui_test_utils::ShowAndFocusNativeWindow(window)) { 58 result = ui_controls::SendKeyPressNotifyWhenDone( 59 window, key, control, shift, alt, command, runner->QuitClosure()); 60 } 61 #endif 62 if (!result) { 63 LOG(ERROR) << "ui_controls::SendKeyPressNotifyWhenDone failed"; 64 return false; 65 } 66 67 // Run the message loop. It'll stop running when either the key was received 68 // or the test timed out (in which case testing::Test::HasFatalFailure should 69 // be set). 70 runner->Run(); 71 return !testing::Test::HasFatalFailure(); 72 } 73 74 bool SendKeyPressAndWait(const Browser* browser, 75 ui::KeyboardCode key, 76 bool control, 77 bool shift, 78 bool alt, 79 bool command, 80 int type, 81 const content::NotificationSource& source) { 82 content::WindowedNotificationObserver observer(type, source); 83 84 if (!SendKeyPressSync(browser, key, control, shift, alt, command)) 85 return false; 86 87 observer.Wait(); 88 return !testing::Test::HasFatalFailure(); 89 } 90 91 bool SendMouseMoveSync(const gfx::Point& location) { 92 scoped_refptr<content::MessageLoopRunner> runner = 93 new content::MessageLoopRunner; 94 if (!ui_controls::SendMouseMoveNotifyWhenDone( 95 location.x(), location.y(), runner->QuitClosure())) { 96 return false; 97 } 98 runner->Run(); 99 return !testing::Test::HasFatalFailure(); 100 } 101 102 bool SendMouseEventsSync(ui_controls::MouseButton type, int state) { 103 scoped_refptr<content::MessageLoopRunner> runner = 104 new content::MessageLoopRunner; 105 if (!ui_controls::SendMouseEventsNotifyWhenDone( 106 type, state, runner->QuitClosure())) { 107 return false; 108 } 109 runner->Run(); 110 return !testing::Test::HasFatalFailure(); 111 } 112 113 namespace internal { 114 115 void ClickTask(ui_controls::MouseButton button, 116 int state, 117 const base::Closure& followup) { 118 if (!followup.is_null()) 119 ui_controls::SendMouseEventsNotifyWhenDone(button, state, followup); 120 else 121 ui_controls::SendMouseEvents(button, state); 122 } 123 124 } // namespace internal 125 126 } // namespace ui_test_utils 127