1 /* 2 * Copyright 2010 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #include "webrtc/base/arraysize.h" 11 #include "webrtc/base/gunit.h" 12 #include "webrtc/base/common.h" 13 #include "webrtc/base/logging.h" 14 #include "webrtc/base/win32window.h" 15 #include "webrtc/base/win32windowpicker.h" 16 #include "webrtc/base/windowpicker.h" 17 18 #if !defined(WEBRTC_WIN) 19 #error Only for Windows 20 #endif 21 22 namespace rtc { 23 24 static const TCHAR* kVisibleWindowTitle = L"Visible Window"; 25 static const TCHAR* kInvisibleWindowTitle = L"Invisible Window"; 26 27 class Win32WindowPickerForTest : public Win32WindowPicker { 28 public: 29 Win32WindowPickerForTest() { 30 EXPECT_TRUE(visible_window_.Create(NULL, kVisibleWindowTitle, WS_VISIBLE, 31 0, 0, 0, 0, 0)); 32 EXPECT_TRUE(invisible_window_.Create(NULL, kInvisibleWindowTitle, 0, 33 0, 0, 0, 0, 0)); 34 } 35 36 ~Win32WindowPickerForTest() { 37 visible_window_.Destroy(); 38 invisible_window_.Destroy(); 39 } 40 41 virtual bool GetWindowList(WindowDescriptionList* descriptions) { 42 if (!Win32WindowPicker::EnumProc(visible_window_.handle(), 43 reinterpret_cast<LPARAM>(descriptions))) { 44 return false; 45 } 46 if (!Win32WindowPicker::EnumProc(invisible_window_.handle(), 47 reinterpret_cast<LPARAM>(descriptions))) { 48 return false; 49 } 50 return true; 51 } 52 53 Win32Window* visible_window() { 54 return &visible_window_; 55 } 56 57 Win32Window* invisible_window() { 58 return &invisible_window_; 59 } 60 61 private: 62 Win32Window visible_window_; 63 Win32Window invisible_window_; 64 }; 65 66 TEST(Win32WindowPickerTest, TestGetWindowList) { 67 Win32WindowPickerForTest window_picker; 68 WindowDescriptionList descriptions; 69 EXPECT_TRUE(window_picker.GetWindowList(&descriptions)); 70 EXPECT_EQ(1, descriptions.size()); 71 WindowDescription desc = descriptions.front(); 72 EXPECT_EQ(window_picker.visible_window()->handle(), desc.id().id()); 73 TCHAR window_title[500]; 74 GetWindowText(window_picker.visible_window()->handle(), window_title, 75 arraysize(window_title)); 76 EXPECT_EQ(0, wcscmp(window_title, kVisibleWindowTitle)); 77 } 78 79 TEST(Win32WindowPickerTest, TestIsVisible) { 80 Win32WindowPickerForTest window_picker; 81 HWND visible_id = window_picker.visible_window()->handle(); 82 HWND invisible_id = window_picker.invisible_window()->handle(); 83 EXPECT_TRUE(window_picker.IsVisible(WindowId(visible_id))); 84 EXPECT_FALSE(window_picker.IsVisible(WindowId(invisible_id))); 85 } 86 87 TEST(Win32WindowPickerTest, TestMoveToFront) { 88 Win32WindowPickerForTest window_picker; 89 HWND visible_id = window_picker.visible_window()->handle(); 90 HWND invisible_id = window_picker.invisible_window()->handle(); 91 92 // There are a number of condition where SetForegroundWindow might 93 // fail depending on the state of the calling process. To be on the 94 // safe side we doesn't expect MoveToFront to return true, just test 95 // that we don't crash. 96 window_picker.MoveToFront(WindowId(visible_id)); 97 window_picker.MoveToFront(WindowId(invisible_id)); 98 } 99 100 } // namespace rtc 101