Index: chrome_frame/test/simulate_input.cc |
diff --git a/chrome_frame/test/simulate_input.cc b/chrome_frame/test/simulate_input.cc |
deleted file mode 100644 |
index 3dca6f185e6ab793346b5233fe4ec08091e85930..0000000000000000000000000000000000000000 |
--- a/chrome_frame/test/simulate_input.cc |
+++ /dev/null |
@@ -1,261 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome_frame/test/simulate_input.h" |
- |
-#include <atlbase.h> |
-#include <atlwin.h> |
- |
-#include "base/test/test_timeouts.h" |
-#include "base/threading/platform_thread.h" |
-#include "chrome_frame/utils.h" |
- |
-namespace simulate_input { |
- |
-class ForegroundHelperWindow : public CWindowImpl<ForegroundHelperWindow> { |
- public: |
-BEGIN_MSG_MAP(ForegroundHelperWindow) |
- MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) |
-END_MSG_MAP() |
- |
- ForegroundHelperWindow() : window_(NULL) {} |
- |
- HRESULT SetForeground(HWND window) { |
- DCHECK(::IsWindow(window)); |
- window_ = window; |
- if (NULL == Create(NULL, NULL, NULL, WS_POPUP)) |
- return AtlHresultFromLastError(); |
- |
- static const int kHotKeyId = 0x0000baba; |
- static const int kHotKeyWaitTimeout = 2000; |
- |
- RegisterHotKey(m_hWnd, kHotKeyId, 0, VK_F22); |
- |
- MSG msg = {0}; |
- PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); |
- |
- SendMnemonic(VK_F22, NONE, false, false, KEY_DOWN); |
- // There are scenarios where the WM_HOTKEY is not dispatched by the |
- // the corresponding foreground thread. To prevent us from indefinitely |
- // waiting for the hotkey, we set a timer and exit the loop. |
- SetTimer(kHotKeyId, kHotKeyWaitTimeout, NULL); |
- |
- while (GetMessage(&msg, NULL, 0, 0)) { |
- TranslateMessage(&msg); |
- DispatchMessage(&msg); |
- if (msg.message == WM_HOTKEY) { |
- break; |
- } |
- if (msg.message == WM_TIMER) { |
- SetForegroundWindow(window); |
- break; |
- } |
- } |
- |
- UnregisterHotKey(m_hWnd, kHotKeyId); |
- KillTimer(kHotKeyId); |
- DestroyWindow(); |
- return S_OK; |
- } |
- |
- LRESULT OnHotKey(UINT msg, WPARAM wp, LPARAM lp, BOOL& handled) { // NOLINT |
- SetForegroundWindow(window_); |
- return 1; |
- } |
- private: |
- HWND window_; |
-}; |
- |
-bool ForceSetForegroundWindow(HWND window) { |
- if (GetForegroundWindow() == window) |
- return true; |
- ForegroundHelperWindow foreground_helper_window; |
- HRESULT hr = foreground_helper_window.SetForeground(window); |
- return SUCCEEDED(hr); |
-} |
- |
-struct PidAndWindow { |
- base::ProcessId pid; |
- HWND hwnd; |
-}; |
- |
-BOOL CALLBACK FindWindowInProcessCallback(HWND hwnd, LPARAM param) { |
- PidAndWindow* paw = reinterpret_cast<PidAndWindow*>(param); |
- base::ProcessId pid; |
- GetWindowThreadProcessId(hwnd, &pid); |
- if (pid == paw->pid && IsWindowVisible(hwnd)) { |
- paw->hwnd = hwnd; |
- return FALSE; |
- } |
- |
- return TRUE; |
-} |
- |
-bool EnsureProcessInForeground(base::ProcessId process_id) { |
- HWND hwnd = GetForegroundWindow(); |
- base::ProcessId current_foreground_pid = 0; |
- DWORD active_thread_id = GetWindowThreadProcessId(hwnd, |
- ¤t_foreground_pid); |
- if (current_foreground_pid == process_id) |
- return true; |
- |
- PidAndWindow paw = { process_id }; |
- EnumWindows(FindWindowInProcessCallback, reinterpret_cast<LPARAM>(&paw)); |
- if (!IsWindow(paw.hwnd)) { |
- LOG(ERROR) << "failed to find process window"; |
- return false; |
- } |
- |
- bool ret = ForceSetForegroundWindow(paw.hwnd); |
- LOG_IF(ERROR, !ret) << "ForceSetForegroundWindow: " << ret; |
- |
- return ret; |
-} |
- |
-void SendScanCode(short scan_code, uint32 modifiers) { |
- DCHECK(-1 != scan_code); |
- |
- // High order byte in |scan_code| is SHIFT/CTRL/ALT key state. |
- modifiers = static_cast<Modifier>(modifiers | HIBYTE(scan_code)); |
- DCHECK(modifiers <= ALT); |
- |
- // Low order byte in |scan_code| is the actual scan code. |
- SendMnemonic(LOBYTE(scan_code), modifiers, false, true, KEY_DOWN); |
-} |
- |
-void SendCharA(char c, uint32 modifiers) { |
- SendScanCode(VkKeyScanA(c), modifiers); |
-} |
- |
-void SendCharW(wchar_t c, uint32 modifiers) { |
- SendScanCode(VkKeyScanW(c), modifiers); |
-} |
- |
-// Sends a keystroke to the currently active application with optional |
-// modifiers set. |
-void SendMnemonic(WORD mnemonic_char, |
- uint32 modifiers, |
- bool extended, |
- bool unicode, |
- KeyMode key_mode) { |
- const int kMaxInputs = 4; |
- INPUT keys[kMaxInputs] = {0}; // Keyboard events |
- int key_count = 0; // Number of generated events |
- |
- if (modifiers & SHIFT) { |
- keys[key_count].type = INPUT_KEYBOARD; |
- keys[key_count].ki.wVk = VK_SHIFT; |
- keys[key_count].ki.wScan = MapVirtualKey(VK_SHIFT, 0); |
- key_count++; |
- } |
- |
- if (modifiers & CONTROL) { |
- keys[key_count].type = INPUT_KEYBOARD; |
- keys[key_count].ki.wVk = VK_CONTROL; |
- keys[key_count].ki.wScan = MapVirtualKey(VK_CONTROL, 0); |
- key_count++; |
- } |
- |
- if (modifiers & ALT) { |
- keys[key_count].type = INPUT_KEYBOARD; |
- keys[key_count].ki.wVk = VK_MENU; |
- keys[key_count].ki.wScan = MapVirtualKey(VK_MENU, 0); |
- key_count++; |
- } |
- |
- if (mnemonic_char) { |
- keys[key_count].type = INPUT_KEYBOARD; |
- keys[key_count].ki.wVk = mnemonic_char; |
- keys[key_count].ki.wScan = MapVirtualKey(mnemonic_char, 0); |
- |
- if (extended) |
- keys[key_count].ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; |
- if (unicode) |
- keys[key_count].ki.dwFlags |= KEYEVENTF_UNICODE; |
- key_count++; |
- } |
- |
- DCHECK_LE(key_count, kMaxInputs); |
- |
- // Add the key up bit if needed. |
- if (key_mode == KEY_UP) { |
- for (int i = 0; i < key_count; i++) { |
- keys[i].ki.dwFlags |= KEYEVENTF_KEYUP; |
- } |
- } |
- |
- SendInput(key_count, &keys[0], sizeof(keys[0])); |
-} |
- |
-void SetKeyboardFocusToWindow(HWND window) { |
- SendMouseClick(window, 1, 1, LEFT); |
-} |
- |
-void SendMouseClick(int x, int y, MouseButton button) { |
- const base::TimeDelta kMessageTimeout = TestTimeouts::tiny_timeout(); |
- // TODO(joshia): Fix this. GetSystemMetrics(SM_CXSCREEN) will |
- // retrieve screen size of the primarary monitor only. And monitors |
- // arrangement could be pretty arbitrary. |
- double screen_width = ::GetSystemMetrics(SM_CXSCREEN) - 1; |
- double screen_height = ::GetSystemMetrics(SM_CYSCREEN) - 1; |
- double location_x = x * (65535.0f / screen_width); |
- double location_y = y * (65535.0f / screen_height); |
- |
- // Take advantage of button flag bitmask layout |
- unsigned int button_flag = MOUSEEVENTF_LEFTDOWN << (button + button); |
- |
- INPUT input_info = {0}; |
- input_info.type = INPUT_MOUSE; |
- input_info.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; |
- input_info.mi.dx = static_cast<LONG>(location_x); |
- input_info.mi.dy = static_cast<LONG>(location_y); |
- ::SendInput(1, &input_info, sizeof(INPUT)); |
- base::PlatformThread::Sleep(kMessageTimeout); |
- |
- input_info.mi.dwFlags = button_flag | MOUSEEVENTF_ABSOLUTE; |
- ::SendInput(1, &input_info, sizeof(INPUT)); |
- base::PlatformThread::Sleep(kMessageTimeout); |
- |
- input_info.mi.dwFlags = (button_flag << 1) | MOUSEEVENTF_ABSOLUTE; |
- ::SendInput(1, &input_info, sizeof(INPUT)); |
- base::PlatformThread::Sleep(kMessageTimeout); |
-} |
- |
-void SendMouseClick(HWND window, int x, int y, MouseButton button) { |
- if (!IsWindow(window)) { |
- NOTREACHED() << "Invalid window handle."; |
- return; |
- } |
- |
- HWND top_level_window = window; |
- if (!IsTopLevelWindow(top_level_window)) { |
- top_level_window = GetAncestor(window, GA_ROOT); |
- } |
- |
- ForceSetForegroundWindow(top_level_window); |
- |
- POINT cursor_position = {x, y}; |
- ClientToScreen(window, &cursor_position); |
- SendMouseClick(cursor_position.x, cursor_position.y, button); |
-} |
- |
-void SendExtendedKey(WORD key, uint32 modifiers) { |
- SendMnemonic(key, modifiers, true, false, KEY_UP); |
-} |
- |
-void SendStringW(const std::wstring& s) { |
- for (size_t i = 0; i < s.length(); i++) { |
- SendCharW(s[i], NONE); |
- Sleep(10); |
- } |
-} |
- |
-void SendStringA(const std::string& s) { |
- for (size_t i = 0; i < s.length(); i++) { |
- SendCharA(s[i], NONE); |
- Sleep(10); |
- } |
-} |
- |
-} // namespace simulate_input |