diff options
author | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-01 14:54:54 +0000 |
---|---|---|
committer | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-01 14:54:54 +0000 |
commit | 1b8b17cc6c94289ae75ad035db84d309739aba19 (patch) | |
tree | cd6f6de35906a526e532306934e626de9e874d44 /chrome | |
parent | e14f9533b3b73f2c23338acf9fda7a92c691df12 (diff) | |
download | chromium_src-1b8b17cc6c94289ae75ad035db84d309739aba19.zip chromium_src-1b8b17cc6c94289ae75ad035db84d309739aba19.tar.gz chromium_src-1b8b17cc6c94289ae75ad035db84d309739aba19.tar.bz2 |
Figure out error in test PrepopulateRespectBlank.
Revert previous traces and add one targeted test.
My traces seem to indicate that something else
than a Chrome window has focus when the test fails.
Lets figure out what that is...
BUG=62937
TEST=Tracking down problem in test
Review URL: http://codereview.chromium.org/5463001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67849 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/automation/ui_controls_win.cc | 48 | ||||
-rw-r--r-- | chrome/browser/ui/views/find_bar_host_interactive_uitest.cc | 50 | ||||
-rw-r--r-- | chrome/test/ui_test_utils.cc | 10 |
3 files changed, 53 insertions, 55 deletions
diff --git a/chrome/browser/automation/ui_controls_win.cc b/chrome/browser/automation/ui_controls_win.cc index dfa2af6..25469ad 100644 --- a/chrome/browser/automation/ui_controls_win.cc +++ b/chrome/browser/automation/ui_controls_win.cc @@ -8,7 +8,6 @@ #include "app/keyboard_codes.h" #include "base/logging.h" #include "base/message_loop.h" -#include "base/string_util.h" #include "base/win_util.h" #include "base/ref_counted.h" #include "base/task.h" @@ -18,12 +17,6 @@ namespace ui_controls { namespace { -void Checkpoint(const char* message, const base::TimeTicks& start_time) { - LOG(INFO) << message << " : " - << (base::TimeTicks::Now() - start_time).InMilliseconds() - << " ms" << std::flush; -} - // InputDispatcher ------------------------------------------------------------ // InputDispatcher is used to listen for a mouse/keyboard event. When the @@ -45,7 +38,7 @@ class InputDispatcher : public base::RefCounted<InputDispatcher> { ~InputDispatcher(); - // Notifies the task and release this (which should delete it). + // Notifies the task and release this (which should delete it). void NotifyTask(); // The task we notify. @@ -78,25 +71,14 @@ LRESULT CALLBACK MouseHook(int n_code, WPARAM w_param, LPARAM l_param) { // Callback from hook when a key message is received. LRESULT CALLBACK KeyHook(int n_code, WPARAM w_param, LPARAM l_param) { - base::TimeTicks start_time = base::TimeTicks::Now(); - char msg[512]; - base::snprintf(msg, 512, "KeyHook starts: %d", n_code); - Checkpoint(msg, start_time); - HHOOK next_hook = next_hook_; - base::snprintf(msg, 512, "n_code == HC_ACTION: %d, %d", - l_param, !!(l_param & (1 << 30))); - Checkpoint(msg, start_time); if (n_code == HC_ACTION) { DCHECK(current_dispatcher_); - if (l_param & (1 << 30)) { // Only send on key up. - Checkpoint("MatchingMessageFound", start_time); + if (l_param & (1 << 30)) { + // Only send on key up. current_dispatcher_->MatchingMessageFound(); - } else { - Checkpoint("Not key up", start_time); } } - Checkpoint("KeyHook ends, calling next hook.", start_time); return CallNextHookEx(next_hook, n_code, w_param, l_param); } @@ -184,99 +166,77 @@ bool SendKeyEvent(app::KeyboardCode key, bool up) { bool SendKeyPressImpl(app::KeyboardCode key, bool control, bool shift, bool alt, Task* task) { - base::TimeTicks start_time = base::TimeTicks::Now(); - Checkpoint("SendKeyPressImpl starts", start_time); - scoped_refptr<InputDispatcher> dispatcher( task ? new InputDispatcher(task, WM_KEYUP) : NULL); // If a pop-up menu is open, it won't receive events sent using SendInput. // Check for a pop-up menu using its window class (#32768) and if one // exists, send the key event directly there. - Checkpoint("FindWindow", start_time); HWND popup_menu = ::FindWindow(L"#32768", 0); if (popup_menu != NULL && popup_menu == ::GetTopWindow(NULL)) { - Checkpoint("Found popup window", start_time); WPARAM w_param = app::WindowsKeyCodeForKeyboardCode(key); LPARAM l_param = 0; - Checkpoint("Send WM_KEYDOWN", start_time); ::SendMessage(popup_menu, WM_KEYDOWN, w_param, l_param); - Checkpoint("Send WM_KEYUP", start_time); ::SendMessage(popup_menu, WM_KEYUP, w_param, l_param); - Checkpoint("Send Done", start_time); if (dispatcher.get()) dispatcher->AddRef(); return true; } - Checkpoint("Found no popup window", start_time); - - INPUT input[8] = { 0 }; // 8, assuming all the modifiers are activated + INPUT input[8] = { 0 }; // 8, assuming all the modifiers are activated. UINT i = 0; if (control) { - Checkpoint("FillKeyboardInput Control", start_time); if (!FillKeyboardInput(app::VKEY_CONTROL, &input[i], false)) return false; i++; } if (shift) { - Checkpoint("FillKeyboardInput Shift", start_time); if (!FillKeyboardInput(app::VKEY_SHIFT, &input[i], false)) return false; i++; } if (alt) { - Checkpoint("FillKeyboardInput Alt", start_time); if (!FillKeyboardInput(app::VKEY_MENU, &input[i], false)) return false; i++; } - Checkpoint("FillKeyboardInput 1", start_time); if (!FillKeyboardInput(key, &input[i], false)) return false; i++; - Checkpoint("FillKeyboardInput 2", start_time); if (!FillKeyboardInput(key, &input[i], true)) return false; i++; if (alt) { - Checkpoint("FillKeyboardInput Alt2", start_time); if (!FillKeyboardInput(app::VKEY_MENU, &input[i], true)) return false; i++; } if (shift) { - Checkpoint("FillKeyboardInput Shift2", start_time); if (!FillKeyboardInput(app::VKEY_SHIFT, &input[i], true)) return false; i++; } if (control) { - Checkpoint("FillKeyboardInput Ctrl2", start_time); if (!FillKeyboardInput(app::VKEY_CONTROL, &input[i], true)) return false; i++; } - Checkpoint("SendInput called", start_time); if (::SendInput(i, input, sizeof(INPUT)) != i) return false; - Checkpoint("SendInput done", start_time); - if (dispatcher.get()) dispatcher->AddRef(); - Checkpoint("Test done", start_time); return true; } diff --git a/chrome/browser/ui/views/find_bar_host_interactive_uitest.cc b/chrome/browser/ui/views/find_bar_host_interactive_uitest.cc index 2049eb0..9195df5 100644 --- a/chrome/browser/ui/views/find_bar_host_interactive_uitest.cc +++ b/chrome/browser/ui/views/find_bar_host_interactive_uitest.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include "app/keyboard_codes.h" +#include "base/process_util.h" +#include "base/string_number_conversions.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/find_bar_controller.h" @@ -18,6 +20,11 @@ #include "views/focus/focus_manager.h" #include "views/view.h" +#if defined(OS_WIN) +#include <windows.h> +#include <Psapi.h> +#endif + namespace { // The delay waited after sending an OS simulated event. @@ -44,6 +51,44 @@ void Checkpoint(const char* message, const base::TimeTicks& start_time) { << " ms" << std::flush; } +// Test to make sure Chrome is in the foreground as we start testing. This is +// required for tests that synthesize input to the Chrome window. +bool ChromeInForeground() { +#if defined(OS_WIN) + HWND window = ::GetForegroundWindow(); + std::wstring caption; + std::wstring filename; + int len = ::GetWindowTextLength(window) + 1; + ::GetWindowText(window, WriteInto(&caption, len), len); + bool chrome_window_in_foreground = + (caption == L"about:blank - Google Chrome"); + if (!chrome_window_in_foreground) { + DWORD process_id; + int thread_id = ::GetWindowThreadProcessId(window, &process_id); + + base::ProcessHandle process; + if (base::OpenProcessHandleWithAccess(process_id, + PROCESS_QUERY_LIMITED_INFORMATION, + &process)) { + len = MAX_PATH; + if (!GetProcessImageFileName(process, WriteInto(&filename, len), len)) { + int error = GetLastError(); + filename = L"Unable to read filename (error " + + base::IntToString16(error) + L")"; + } + base::CloseProcessHandle(process); + } + } + EXPECT_TRUE(chrome_window_in_foreground) + << "Chrome must be in the foreground when running interactive tests\n" + << "Process in foreground: " << filename.c_str(); + return chrome_window_in_foreground; +#else + // Windows only at the moment. + return true; +#endif +} + } // namespace IN_PROC_BROWSER_TEST_F(FindInPageTest, CrashEscHandlers) { @@ -133,12 +178,15 @@ IN_PROC_BROWSER_TEST_F(FindInPageTest, PrepopulateRespectBlank) { // FindInPage on Mac doesn't use prepopulated values. Search there is global. return; #endif - base::TimeTicks start_time = base::TimeTicks::Now(); Checkpoint("Starting test server", start_time); ASSERT_TRUE(test_server()->Start()); + // Make sure Chrome is in the foreground, otherwise sending input + // won't do anything and the test will hang. + ASSERT_TRUE(ChromeInForeground()); + // First we navigate to any page. Checkpoint("Navigating", start_time); GURL url = test_server()->GetURL(kSimplePage); diff --git a/chrome/test/ui_test_utils.cc b/chrome/test/ui_test_utils.cc index b7db307..d6310f3 100644 --- a/chrome/test/ui_test_utils.cc +++ b/chrome/test/ui_test_utils.cc @@ -341,12 +341,6 @@ bool ExecuteJavaScriptHelper(RenderViewHost* render_view_host, return true; } -void Checkpoint(const char* message, const base::TimeTicks& start_time) { - LOG(INFO) << message << " : " - << (base::TimeTicks::Now() - start_time).InMilliseconds() - << " ms" << std::flush; -} - } // namespace void RunMessageLoop() { @@ -612,13 +606,11 @@ bool SendKeyPressSync(const Browser* browser, bool alt, bool command) { base::TimeTicks start_time = base::TimeTicks::Now(); - Checkpoint("SendKeyPressSync", start_time); gfx::NativeWindow window = NULL; if (!GetNativeWindow(browser, &window)) return false; - Checkpoint("SendKeyPressNotifyWhenDone", start_time); if (!ui_controls::SendKeyPressNotifyWhenDone( window, key, control, shift, alt, command, new MessageLoop::QuitTask())) { @@ -628,9 +620,7 @@ bool SendKeyPressSync(const Browser* browser, // Run the message loop. It'll stop running when either the key was received // or the test timed out (in which case testing::Test::HasFatalFailure should // be set). - Checkpoint("Running loop", start_time); RunMessageLoop(); - Checkpoint("Check if HasFatalFailure", start_time); return !testing::Test::HasFatalFailure(); } |