/* * Copyright 2010 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "webrtc/base/arraysize.h" #include "webrtc/base/gunit.h" #include "webrtc/base/common.h" #include "webrtc/base/logging.h" #include "webrtc/base/win32window.h" #include "webrtc/base/win32windowpicker.h" #include "webrtc/base/windowpicker.h" #if !defined(WEBRTC_WIN) #error Only for Windows #endif namespace rtc { static const TCHAR* kVisibleWindowTitle = L"Visible Window"; static const TCHAR* kInvisibleWindowTitle = L"Invisible Window"; class Win32WindowPickerForTest : public Win32WindowPicker { public: Win32WindowPickerForTest() { EXPECT_TRUE(visible_window_.Create(NULL, kVisibleWindowTitle, WS_VISIBLE, 0, 0, 0, 0, 0)); EXPECT_TRUE(invisible_window_.Create(NULL, kInvisibleWindowTitle, 0, 0, 0, 0, 0, 0)); } ~Win32WindowPickerForTest() { visible_window_.Destroy(); invisible_window_.Destroy(); } virtual bool GetWindowList(WindowDescriptionList* descriptions) { if (!Win32WindowPicker::EnumProc(visible_window_.handle(), reinterpret_cast(descriptions))) { return false; } if (!Win32WindowPicker::EnumProc(invisible_window_.handle(), reinterpret_cast(descriptions))) { return false; } return true; } Win32Window* visible_window() { return &visible_window_; } Win32Window* invisible_window() { return &invisible_window_; } private: Win32Window visible_window_; Win32Window invisible_window_; }; TEST(Win32WindowPickerTest, TestGetWindowList) { Win32WindowPickerForTest window_picker; WindowDescriptionList descriptions; EXPECT_TRUE(window_picker.GetWindowList(&descriptions)); EXPECT_EQ(1, descriptions.size()); WindowDescription desc = descriptions.front(); EXPECT_EQ(window_picker.visible_window()->handle(), desc.id().id()); TCHAR window_title[500]; GetWindowText(window_picker.visible_window()->handle(), window_title, arraysize(window_title)); EXPECT_EQ(0, wcscmp(window_title, kVisibleWindowTitle)); } TEST(Win32WindowPickerTest, TestIsVisible) { Win32WindowPickerForTest window_picker; HWND visible_id = window_picker.visible_window()->handle(); HWND invisible_id = window_picker.invisible_window()->handle(); EXPECT_TRUE(window_picker.IsVisible(WindowId(visible_id))); EXPECT_FALSE(window_picker.IsVisible(WindowId(invisible_id))); } TEST(Win32WindowPickerTest, TestMoveToFront) { Win32WindowPickerForTest window_picker; HWND visible_id = window_picker.visible_window()->handle(); HWND invisible_id = window_picker.invisible_window()->handle(); // There are a number of condition where SetForegroundWindow might // fail depending on the state of the calling process. To be on the // safe side we doesn't expect MoveToFront to return true, just test // that we don't crash. window_picker.MoveToFront(WindowId(visible_id)); window_picker.MoveToFront(WindowId(invisible_id)); } } // namespace rtc