| Index: chrome/browser/automation/ui_controls_win.cc
|
| ===================================================================
|
| --- chrome/browser/automation/ui_controls_win.cc (revision 67850)
|
| +++ chrome/browser/automation/ui_controls_win.cc (working copy)
|
| @@ -8,6 +8,7 @@
|
| #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"
|
| @@ -17,6 +18,12 @@
|
|
|
| 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
|
| @@ -38,7 +45,7 @@
|
|
|
| ~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.
|
| @@ -71,14 +78,25 @@
|
|
|
| // 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.
|
| + if (l_param & (1 << 30)) { // Only send on key up.
|
| + Checkpoint("MatchingMessageFound", start_time);
|
| 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);
|
| }
|
|
|
| @@ -166,77 +184,99 @@
|
| 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;
|
| }
|
|
|
| - INPUT input[8] = { 0 }; // 8, assuming all the modifiers are activated.
|
| + Checkpoint("Found no popup window", start_time);
|
|
|
| + 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;
|
| }
|
|
|
|
|