Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: chrome_frame/test/chrome_frame_test_utils.cc

Issue 604014: First batch of context menu tests... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome_frame/test/chrome_frame_test_utils.h" 5 #include "chrome_frame/test/chrome_frame_test_utils.h"
6 6
7 #include <atlbase.h> 7 #include <atlbase.h>
8 #include <atlwin.h> 8 #include <atlwin.h>
9 #include <iepmapi.h> 9 #include <iepmapi.h>
10 #include <sddl.h> 10 #include <sddl.h>
(...skipping 10 matching lines...) Expand all
21 21
22 namespace chrome_frame_test { 22 namespace chrome_frame_test {
23 23
24 const wchar_t kIEImageName[] = L"iexplore.exe"; 24 const wchar_t kIEImageName[] = L"iexplore.exe";
25 const wchar_t kIEBrokerImageName[] = L"ieuser.exe"; 25 const wchar_t kIEBrokerImageName[] = L"ieuser.exe";
26 const wchar_t kFirefoxImageName[] = L"firefox.exe"; 26 const wchar_t kFirefoxImageName[] = L"firefox.exe";
27 const wchar_t kOperaImageName[] = L"opera.exe"; 27 const wchar_t kOperaImageName[] = L"opera.exe";
28 const wchar_t kSafariImageName[] = L"safari.exe"; 28 const wchar_t kSafariImageName[] = L"safari.exe";
29 const wchar_t kChromeImageName[] = L"chrome.exe"; 29 const wchar_t kChromeImageName[] = L"chrome.exe";
30 30
31 bool IsTopLevelWindow(HWND window) {
32 long style = GetWindowLong(window, GWL_STYLE); // NOLINT
33 if (!(style & WS_CHILD))
34 return true;
35
36 HWND parent = GetParent(window);
37 if (!parent)
38 return true;
39
40 if (parent == GetDesktopWindow())
41 return true;
42
43 return false;
44 }
45
46 // Callback function for EnumThreadWindows. 31 // Callback function for EnumThreadWindows.
47 BOOL CALLBACK CloseWindowsThreadCallback(HWND hwnd, LPARAM param) { 32 BOOL CALLBACK CloseWindowsThreadCallback(HWND hwnd, LPARAM param) {
48 int& count = *reinterpret_cast<int*>(param); 33 int& count = *reinterpret_cast<int*>(param);
49 if (IsWindowVisible(hwnd)) { 34 if (IsWindowVisible(hwnd)) {
50 if (IsWindowEnabled(hwnd)) { 35 if (IsWindowEnabled(hwnd)) {
51 DWORD results = 0; 36 DWORD results = 0;
52 if (!::SendMessageTimeout(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0, SMTO_BLOCK, 37 if (!::SendMessageTimeout(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0, SMTO_BLOCK,
53 10000, &results)) { 38 10000, &results)) {
54 LOG(WARNING) << "Window hung: " << StringPrintf(L"%08X", hwnd); 39 LOG(WARNING) << "Window hung: " << StringPrintf(L"%08X", hwnd);
55 } 40 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 window_close_attempts += 83 window_close_attempts +=
99 CloseVisibleTopLevelWindowsOnThread(te.th32ThreadID); 84 CloseVisibleTopLevelWindowsOnThread(te.th32ThreadID);
100 } 85 }
101 te.dwSize = sizeof(te); 86 te.dwSize = sizeof(te);
102 } while (Thread32Next(snapshot, &te)); 87 } while (Thread32Next(snapshot, &te));
103 } 88 }
104 89
105 return window_close_attempts; 90 return window_close_attempts;
106 } 91 }
107 92
108 class ForegroundHelperWindow : public CWindowImpl<ForegroundHelperWindow> {
109 public:
110 BEGIN_MSG_MAP(ForegroundHelperWindow)
111 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
112 END_MSG_MAP()
113
114 HRESULT SetForeground(HWND window) {
115 DCHECK(::IsWindow(window));
116 if (NULL == Create(NULL, NULL, NULL, WS_POPUP))
117 return AtlHresultFromLastError();
118
119 static const int kHotKeyId = 0x0000baba;
120 static const int kHotKeyWaitTimeout = 2000;
121
122 SetWindowLongPtr(GWLP_USERDATA, reinterpret_cast<ULONG_PTR>(window));
123 RegisterHotKey(m_hWnd, kHotKeyId, 0, VK_F22);
124
125 MSG msg = {0};
126 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
127
128 SendVirtualKey(VK_F22, false);
129 // There are scenarios where the WM_HOTKEY is not dispatched by the
130 // the corresponding foreground thread. To prevent us from indefinitely
131 // waiting for the hotkey, we set a timer and exit the loop.
132 SetTimer(kHotKeyId, kHotKeyWaitTimeout, NULL);
133
134 while (GetMessage(&msg, NULL, 0, 0)) {
135 TranslateMessage(&msg);
136 DispatchMessage(&msg);
137 if (msg.message == WM_HOTKEY)
138 break;
139 else if (msg.message == WM_TIMER) {
140 SetForegroundWindow(window);
141 break;
142 }
143 }
144
145 UnregisterHotKey(m_hWnd, kHotKeyId);
146 KillTimer(kHotKeyId);
147 DestroyWindow();
148 return S_OK;
149 }
150
151 LRESULT OnHotKey(UINT msg, WPARAM wp, LPARAM lp, BOOL& handled) { // NOLINT
152 HWND window = reinterpret_cast<HWND>(GetWindowLongPtr(GWLP_USERDATA));
153 SetForegroundWindow(window);
154 return 1;
155 }
156 };
157
158 bool ForceSetForegroundWindow(HWND window) {
159 if (GetForegroundWindow() == window)
160 return true;
161 ForegroundHelperWindow foreground_helper_window;
162 HRESULT hr = foreground_helper_window.SetForeground(window);
163 return SUCCEEDED(hr);
164 }
165
166 struct PidAndWindow {
167 base::ProcessId pid;
168 HWND hwnd;
169 };
170
171 BOOL CALLBACK FindWindowInProcessCallback(HWND hwnd, LPARAM param) {
172 PidAndWindow* paw = reinterpret_cast<PidAndWindow*>(param);
173 base::ProcessId pid;
174 GetWindowThreadProcessId(hwnd, &pid);
175 if (pid == paw->pid && IsWindowVisible(hwnd)) {
176 paw->hwnd = hwnd;
177 return FALSE;
178 }
179
180 return TRUE;
181 }
182
183 bool EnsureProcessInForeground(base::ProcessId process_id) {
184 HWND hwnd = GetForegroundWindow();
185 base::ProcessId current_foreground_pid = 0;
186 DWORD active_thread_id = GetWindowThreadProcessId(hwnd,
187 &current_foreground_pid);
188 if (current_foreground_pid == process_id)
189 return true;
190
191 PidAndWindow paw = { process_id };
192 EnumWindows(FindWindowInProcessCallback, reinterpret_cast<LPARAM>(&paw));
193 if (!IsWindow(paw.hwnd)) {
194 DLOG(ERROR) << "failed to find process window";
195 return false;
196 }
197
198 bool ret = ForceSetForegroundWindow(paw.hwnd);
199 LOG_IF(ERROR, !ret) << "ForceSetForegroundWindow: " << ret;
200
201 return ret;
202 }
203
204 // Iterates through all the characters in the string and simulates
205 // keyboard input. The input goes to the currently active application.
206 bool SendString(const wchar_t* string) {
207 DCHECK(string != NULL);
208
209 INPUT input[2] = {0};
210 input[0].type = INPUT_KEYBOARD;
211 input[0].ki.dwFlags = KEYEVENTF_UNICODE; // to avoid shift, etc.
212 input[1] = input[0];
213 input[1].ki.dwFlags |= KEYEVENTF_KEYUP;
214
215 for (const wchar_t* p = string; *p; p++) {
216 input[0].ki.wScan = input[1].ki.wScan = *p;
217 SendInput(2, input, sizeof(INPUT));
218 }
219
220 return true;
221 }
222
223 void SendVirtualKey(int16 key, bool extended) {
224 INPUT input = { INPUT_KEYBOARD };
225 input.ki.wVk = key;
226 input.ki.dwFlags = extended ? KEYEVENTF_EXTENDEDKEY : 0;
227 SendInput(1, &input, sizeof(input));
228 input.ki.dwFlags = (extended ? KEYEVENTF_EXTENDEDKEY : 0) | KEYEVENTF_KEYUP;
229 SendInput(1, &input, sizeof(input));
230 }
231
232 void SendChar(char c) {
233 SendVirtualKey(VkKeyScanA(c), false);
234 }
235
236 void SendString(const char* s) {
237 while (*s) {
238 SendChar(*s);
239 s++;
240 }
241 }
242
243 // Sends a keystroke to the currently active application with optional
244 // modifiers set.
245 bool SendMnemonic(WORD mnemonic_char, bool shift_pressed, bool control_pressed,
246 bool alt_pressed) {
247 INPUT special_keys[3] = {0};
248 for (int index = 0; index < arraysize(special_keys); ++index) {
249 special_keys[index].type = INPUT_KEYBOARD;
250 special_keys[index].ki.dwFlags = 0;
251 }
252
253 int num_special_keys = 0;
254 if (shift_pressed) {
255 special_keys[num_special_keys].ki.wVk = VK_SHIFT;
256 num_special_keys++;
257 }
258
259 if (control_pressed) {
260 special_keys[num_special_keys].ki.wVk = VK_CONTROL;
261 num_special_keys++;
262 }
263
264 if (alt_pressed) {
265 special_keys[num_special_keys].ki.wVk = VK_MENU;
266 num_special_keys++;
267 }
268
269 // Depress the modifiers.
270 SendInput(num_special_keys, special_keys, sizeof(INPUT));
271
272 Sleep(100);
273
274 INPUT mnemonic = {0};
275 mnemonic.type = INPUT_KEYBOARD;
276 mnemonic.ki.wVk = mnemonic_char;
277
278 // Depress and release the mnemonic.
279 SendInput(1, &mnemonic, sizeof(INPUT));
280 Sleep(100);
281
282 mnemonic.ki.dwFlags |= KEYEVENTF_KEYUP;
283 SendInput(1, &mnemonic, sizeof(INPUT));
284 Sleep(100);
285
286 // Now release the modifiers.
287 for (int index = 0; index < num_special_keys; index++) {
288 special_keys[index].ki.dwFlags |= KEYEVENTF_KEYUP;
289 }
290
291 SendInput(num_special_keys, special_keys, sizeof(INPUT));
292 Sleep(100);
293
294 return true;
295 }
296
297 std::wstring GetExecutableAppPath(const std::wstring& file) { 93 std::wstring GetExecutableAppPath(const std::wstring& file) {
298 std::wstring kAppPathsKey = 94 std::wstring kAppPathsKey =
299 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\"; 95 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\";
300 96
301 std::wstring app_path; 97 std::wstring app_path;
302 RegKey key(HKEY_LOCAL_MACHINE, (kAppPathsKey + file).c_str()); 98 RegKey key(HKEY_LOCAL_MACHINE, (kAppPathsKey + file).c_str());
303 if (key.Handle()) { 99 if (key.Handle()) {
304 key.ReadValue(NULL, &app_path); 100 key.ReadValue(NULL, &app_path);
305 } 101 }
306 102
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 browser->Quit(); 212 browser->Quit();
417 ++ret; 213 ++ret;
418 } 214 }
419 } 215 }
420 } 216 }
421 } 217 }
422 218
423 return ret; 219 return ret;
424 } 220 }
425 221
426 void ShowChromeFrameContextMenu() {
427 static const int kChromeFrameContextMenuTimeout = 500;
428 HWND renderer_window = GetChromeRendererWindow();
429 EXPECT_TRUE(IsWindow(renderer_window));
430
431 SetKeyboardFocusToWindow(renderer_window, 100, 100);
432
433 // Bring up the context menu in the Chrome renderer window.
434 PostMessage(renderer_window, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(50, 50));
435 PostMessage(renderer_window, WM_RBUTTONUP, MK_RBUTTON, MAKELPARAM(50, 50));
436
437 MessageLoop::current()->PostDelayedTask(
438 FROM_HERE,
439 NewRunnableFunction(SelectAboutChromeFrame),
440 kChromeFrameContextMenuTimeout);
441 }
442
443 void SetKeyboardFocusToWindow(HWND window, int x, int y) {
444 HWND top_level_window = window;
445 if (!IsTopLevelWindow(top_level_window)) {
446 top_level_window = GetAncestor(window, GA_ROOT);
447 }
448 ForceSetForegroundWindow(top_level_window);
449
450 POINT cursor_position = {130, 130};
451 ClientToScreen(window, &cursor_position);
452
453 double screen_width = ::GetSystemMetrics( SM_CXSCREEN ) - 1;
454 double screen_height = ::GetSystemMetrics( SM_CYSCREEN ) - 1;
455 double location_x = cursor_position.x * (65535.0f / screen_width);
456 double location_y = cursor_position.y * (65535.0f / screen_height);
457
458 INPUT input_info = {0};
459 input_info.type = INPUT_MOUSE;
460 input_info.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
461 input_info.mi.dx = static_cast<long>(location_x);
462 input_info.mi.dy = static_cast<long>(location_y);
463 ::SendInput(1, &input_info, sizeof(INPUT));
464
465 Sleep(10);
466
467 input_info.mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE;
468 ::SendInput(1, &input_info, sizeof(INPUT));
469
470 Sleep(10);
471
472 input_info.mi.dwFlags = MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE;
473 ::SendInput(1, &input_info, sizeof(INPUT));
474 }
475
476 void SendInputToWindow(HWND window, const std::string& input_string) {
477 const unsigned long kIntervalBetweenInput = 100;
478
479 for (size_t index = 0; index < input_string.length(); index++) {
480 bool is_upper_case = isupper(input_string[index]);
481 if (is_upper_case) {
482 INPUT input = { INPUT_KEYBOARD };
483 input.ki.wVk = VK_SHIFT;
484 input.ki.dwFlags = 0;
485 SendInput(1, &input, sizeof(input));
486 Sleep(kIntervalBetweenInput);
487 }
488
489 // The WM_KEYDOWN and WM_KEYUP messages for characters always contain
490 // the uppercase character codes.
491 SendVirtualKey(toupper(input_string[index]), false);
492 Sleep(kIntervalBetweenInput);
493
494 if (is_upper_case) {
495 INPUT input = { INPUT_KEYBOARD };
496 input.ki.wVk = VK_SHIFT;
497 input.ki.dwFlags = KEYEVENTF_KEYUP;
498 SendInput(1, &input, sizeof(input));
499 Sleep(kIntervalBetweenInput);
500 }
501 }
502 }
503
504 void SelectAboutChromeFrame() {
505 // Send a key up message to enable the About chrome frame option to be
506 // selected followed by a return to select it.
507 SendVirtualKey(VK_UP, true);
508 SendVirtualKey(VK_RETURN, false);
509 }
510
511 BOOL CALLBACK FindChromeRendererWindowProc(
512 HWND window, LPARAM lParam) {
513 HWND* target_window = reinterpret_cast<HWND*>(lParam);
514 wchar_t class_name[MAX_PATH] = {0};
515
516 GetClassName(window, class_name, arraysize(class_name));
517 if (!_wcsicmp(class_name, L"Chrome_RenderWidgetHostHWND")) {
518 *target_window = window;
519 return FALSE;
520 }
521
522 return TRUE;
523 }
524
525 BOOL CALLBACK EnumHostBrowserWindowProc(
526 HWND window, LPARAM lParam) {
527 EnumChildWindows(window, FindChromeRendererWindowProc, lParam);
528 HWND* target_window = reinterpret_cast<HWND*>(lParam);
529 if (IsWindow(*target_window))
530 return FALSE;
531 return TRUE;
532 }
533
534 HWND GetChromeRendererWindow() {
535 HWND chrome_window = NULL;
536 EnumWindows(EnumHostBrowserWindowProc,
537 reinterpret_cast<LPARAM>(&chrome_window));
538 return chrome_window;
539 }
540
541 222
542 LowIntegrityToken::LowIntegrityToken() : impersonated_(false) { 223 LowIntegrityToken::LowIntegrityToken() : impersonated_(false) {
543 } 224 }
544 225
545 LowIntegrityToken::~LowIntegrityToken() { 226 LowIntegrityToken::~LowIntegrityToken() {
546 RevertToSelf(); 227 RevertToSelf();
547 } 228 }
548 229
549 BOOL LowIntegrityToken::RevertToSelf() { 230 BOOL LowIntegrityToken::RevertToSelf() {
550 BOOL ok = TRUE; 231 BOOL ok = TRUE;
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 return S_OK; 476 return S_OK;
796 } 477 }
797 478
798 HRESULT WebBrowserEventSink::OnLoadErrorInternal(const VARIANT* param) { 479 HRESULT WebBrowserEventSink::OnLoadErrorInternal(const VARIANT* param) {
799 DLOG(INFO) << __FUNCTION__ << " " << param->bstrVal; 480 DLOG(INFO) << __FUNCTION__ << " " << param->bstrVal;
800 OnLoadError(param->bstrVal); 481 OnLoadError(param->bstrVal);
801 return S_OK; 482 return S_OK;
802 } 483 }
803 484
804 HRESULT WebBrowserEventSink::OnMessageInternal(const VARIANT* param) { 485 HRESULT WebBrowserEventSink::OnMessageInternal(const VARIANT* param) {
805 DLOG(INFO) << __FUNCTION__ << " " << param->bstrVal; 486 DLOG(INFO) << __FUNCTION__ << " " << param;
806 OnMessage(param->bstrVal); 487 ScopedVariant data, origin, source;
tommi (sloooow) - chröme 2010/02/12 17:14:05 very nice
488 if (param && (V_VT(param) == VT_DISPATCH)) {
489 wchar_t* properties[] = { L"data", L"origin", L"source" };
490 const int prop_count = arraysize(properties);
491 DISPID ids[prop_count] = {0};
492
493 HRESULT hr = param->pdispVal->GetIDsOfNames(IID_NULL, properties,
494 prop_count,LOCALE_SYSTEM_DEFAULT , ids);
495 if (SUCCEEDED(hr)) {
496 DISPPARAMS params = { 0 };
497 EXPECT_HRESULT_SUCCEEDED(param->pdispVal->Invoke(ids[0], IID_NULL,
498 LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params,
499 data.Receive(), NULL, NULL));
500 EXPECT_HRESULT_SUCCEEDED(param->pdispVal->Invoke(ids[1], IID_NULL,
501 LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params,
502 origin.Receive(), NULL, NULL));
503 EXPECT_HRESULT_SUCCEEDED(param->pdispVal->Invoke(ids[2], IID_NULL,
504 LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params,
505 source.Receive(), NULL, NULL));
506 }
507 }
508
509 OnMessage(V_BSTR(&data), V_BSTR(&origin), V_BSTR(&source));
807 return S_OK; 510 return S_OK;
808 } 511 }
809 512
810 HRESULT WebBrowserEventSink::LaunchIEAndNavigate( 513 HRESULT WebBrowserEventSink::LaunchIEAndNavigate(
811 const std::wstring& navigate_url) { 514 const std::wstring& navigate_url) {
812 HRESULT hr = LaunchIEAsComServer(web_browser2_.Receive()); 515 HRESULT hr = LaunchIEAsComServer(web_browser2_.Receive());
813 EXPECT_EQ(S_OK, hr); 516 EXPECT_EQ(S_OK, hr);
814 if (hr == S_OK) { 517 if (hr == S_OK) {
815 web_browser2_->put_Visible(VARIANT_TRUE); 518 web_browser2_->put_Visible(VARIANT_TRUE);
816 hr = DispEventAdvise(web_browser2_, &DIID_DWebBrowserEvents2); 519 hr = DispEventAdvise(web_browser2_, &DIID_DWebBrowserEvents2);
817 EXPECT_TRUE(hr == S_OK); 520 EXPECT_TRUE(hr == S_OK);
818 hr = Navigate(navigate_url); 521 hr = Navigate(navigate_url);
819 } 522 }
820 return hr; 523 return hr;
821 } 524 }
822 525
823 HRESULT WebBrowserEventSink::Navigate(const std::wstring& navigate_url) { 526 HRESULT WebBrowserEventSink::Navigate(const std::wstring& navigate_url) {
824 VARIANT empty = ScopedVariant::kEmptyVariant; 527 VARIANT empty = ScopedVariant::kEmptyVariant;
825 ScopedVariant url; 528 ScopedVariant url;
826 url.Set(navigate_url.c_str()); 529 url.Set(navigate_url.c_str());
827 530
828 HRESULT hr = S_OK; 531 HRESULT hr = S_OK;
829 hr = web_browser2_->Navigate2(url.AsInput(), &empty, &empty, &empty, &empty); 532 hr = web_browser2_->Navigate2(url.AsInput(), &empty, &empty, &empty, &empty);
830 EXPECT_TRUE(hr == S_OK); 533 EXPECT_TRUE(hr == S_OK);
831 return hr; 534 return hr;
832 } 535 }
833 536
834 void WebBrowserEventSink::SetFocusToChrome() { 537 void WebBrowserEventSink::SetFocusToChrome() {
835 chrome_frame_test::SetKeyboardFocusToWindow(GetTabWindow(), 1, 1); 538 simulate_input::SetKeyboardFocusToWindow(GetRendererWindow());
836 } 539 }
837 540
838 void WebBrowserEventSink::SendInputToChrome( 541 void WebBrowserEventSink::SendKeys(const wchar_t* input_string) {
839 const std::string& input_string) { 542 SetFocusToChrome();
840 chrome_frame_test::SendInputToWindow(GetTabWindow(), input_string); 543 simulate_input::SendString(input_string);
544 }
545
546 void WebBrowserEventSink::SendMouseClick(int x, int y,
547 simulate_input::MouseButton button) {
548 simulate_input::SendMouseClick(GetRendererWindow(), x, y, button);
841 } 549 }
842 550
843 void WebBrowserEventSink::ConnectToChromeFrame() { 551 void WebBrowserEventSink::ConnectToChromeFrame() {
844 DCHECK(web_browser2_); 552 DCHECK(web_browser2_);
845 ScopedComPtr<IShellBrowser> shell_browser; 553 ScopedComPtr<IShellBrowser> shell_browser;
846 DoQueryService(SID_STopLevelBrowser, web_browser2_, 554 DoQueryService(SID_STopLevelBrowser, web_browser2_,
847 shell_browser.Receive()); 555 shell_browser.Receive());
848 556
849 if (shell_browser) { 557 if (shell_browser) {
850 ScopedComPtr<IShellView> shell_view; 558 ScopedComPtr<IShellView> shell_view;
(...skipping 17 matching lines...) Expand all
868 void WebBrowserEventSink::DisconnectFromChromeFrame() { 576 void WebBrowserEventSink::DisconnectFromChromeFrame() {
869 if (chrome_frame_) { 577 if (chrome_frame_) {
870 ScopedVariant dummy(static_cast<IDispatch*>(NULL)); 578 ScopedVariant dummy(static_cast<IDispatch*>(NULL));
871 chrome_frame_->put_onmessage(dummy); 579 chrome_frame_->put_onmessage(dummy);
872 chrome_frame_->put_onload(dummy); 580 chrome_frame_->put_onload(dummy);
873 chrome_frame_->put_onloaderror(dummy); 581 chrome_frame_->put_onloaderror(dummy);
874 chrome_frame_.Release(); 582 chrome_frame_.Release();
875 } 583 }
876 } 584 }
877 585
878 HWND WebBrowserEventSink::GetTabWindow() { 586 HWND WebBrowserEventSink::GetRendererWindow() {
879 DCHECK(chrome_frame_); 587 DCHECK(chrome_frame_);
880 HWND renderer_window = NULL; 588 HWND renderer_window = NULL;
881 ScopedComPtr<IOleWindow> ole_window; 589 ScopedComPtr<IOleWindow> ole_window;
882 ole_window.QueryFrom(chrome_frame_); 590 ole_window.QueryFrom(chrome_frame_);
883 EXPECT_TRUE(ole_window.get()); 591 EXPECT_TRUE(ole_window.get());
884 592
885 if (ole_window) { 593 if (ole_window) {
886 HWND activex_window = NULL; 594 HWND activex_window = NULL;
887 ole_window->GetWindow(&activex_window); 595 ole_window->GetWindow(&activex_window);
888 EXPECT_TRUE(IsWindow(activex_window)); 596 EXPECT_TRUE(IsWindow(activex_window));
889 597
890 // chrome tab window is the first (and the only) child of activex 598 // chrome tab window is the first (and the only) child of activex
891 HWND chrome_tab_window = GetWindow(activex_window, GW_CHILD); 599 HWND chrome_tab_window = GetWindow(activex_window, GW_CHILD);
892 EXPECT_TRUE(IsWindow(chrome_tab_window)); 600 EXPECT_TRUE(IsWindow(chrome_tab_window));
893 renderer_window = GetWindow(chrome_tab_window, GW_CHILD); 601 renderer_window = GetWindow(chrome_tab_window, GW_CHILD);
894 } 602 }
895 603
896 DCHECK(IsWindow(renderer_window)); 604 EXPECT_TRUE(IsWindow(renderer_window));
897 return renderer_window; 605 return renderer_window;
898 } 606 }
899 607
900 HRESULT WebBrowserEventSink::SetWebBrowser(IWebBrowser2* web_browser2) { 608 HRESULT WebBrowserEventSink::SetWebBrowser(IWebBrowser2* web_browser2) {
901 DCHECK(web_browser2_.get() == NULL); 609 DCHECK(web_browser2_.get() == NULL);
902 web_browser2_ = web_browser2; 610 web_browser2_ = web_browser2;
903 web_browser2_->put_Visible(VARIANT_TRUE); 611 web_browser2_->put_Visible(VARIANT_TRUE);
904 HRESULT hr = DispEventAdvise(web_browser2_, &DIID_DWebBrowserEvents2); 612 HRESULT hr = DispEventAdvise(web_browser2_, &DIID_DWebBrowserEvents2);
905 return hr; 613 return hr;
906 } 614 }
907 615
616 void WebBrowserEventSink::ExpectRendererWindowHasfocus() {
617 HWND renderer_window = GetRendererWindow();
618 EXPECT_TRUE(IsWindow(renderer_window));
619
620 for (HWND first_child = renderer_window;
621 IsWindow(first_child); first_child = GetWindow(first_child, GW_CHILD)) {
tommi (sloooow) - chröme 2010/02/12 17:14:05 indent off
622 renderer_window = first_child;
623 }
624
625 wchar_t class_name[MAX_PATH] = {0};
626 GetClassName(renderer_window, class_name, arraysize(class_name));
627 EXPECT_TRUE(_wcsicmp(class_name, L"Chrome_RenderWidgetHostHWND") == 0);
628
629 DWORD renderer_thread = 0;
630 DWORD renderer_process = 0;
631 renderer_thread = GetWindowThreadProcessId(renderer_window,
632 &renderer_process);
633
634 ASSERT_TRUE(AttachThreadInput(GetCurrentThreadId(), renderer_thread, TRUE));
635 HWND focus_window = GetFocus();
636 EXPECT_TRUE(focus_window == renderer_window);
637 EXPECT_TRUE(AttachThreadInput(GetCurrentThreadId(), renderer_thread, FALSE));
638 }
639
640 void WebBrowserEventSink::Exec(const GUID* cmd_group_guid, DWORD command_id,
641 DWORD cmd_exec_opt, VARIANT* in_args,
642 VARIANT* out_args) {
643 ScopedComPtr<IOleCommandTarget> shell_browser_cmd_target;
644 DoQueryService(SID_STopLevelBrowser, web_browser2_,
645 shell_browser_cmd_target.Receive());
646 ASSERT_TRUE(NULL != shell_browser_cmd_target);
647 EXPECT_HRESULT_SUCCEEDED(shell_browser_cmd_target->Exec(cmd_group_guid,
648 command_id, cmd_exec_opt, in_args, out_args));
649 }
650
908 } // namespace chrome_frame_test 651 } // namespace chrome_frame_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698