1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2010 The WebRTC Project Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * that can be found in the LICENSE file in the root of the source 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * tree. An additional intellectual property rights grant can be found 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * in the file PATENTS. All contributing project authors may 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be found in the AUTHORS file in the root of the source tree. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/gunit.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webrtc/base/common.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/logging.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webrtc/base/win32window.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webrtc/base/win32windowpicker.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/windowpicker.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(WEBRTC_WIN) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error Only for Windows 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace rtc { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static const TCHAR* kVisibleWindowTitle = L"Visible Window"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const TCHAR* kInvisibleWindowTitle = L"Invisible Window"; 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Win32WindowPickerForTest : public Win32WindowPicker { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32WindowPickerForTest() { 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(visible_window_.Create(NULL, kVisibleWindowTitle, WS_VISIBLE, 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 0, 0, 0, 0, 0)); 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(invisible_window_.Create(NULL, kInvisibleWindowTitle, 0, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, 0)); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Win32WindowPickerForTest() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_window_.Destroy(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invisible_window_.Destroy(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetWindowList(WindowDescriptionList* descriptions) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Win32WindowPicker::EnumProc(visible_window_.handle(), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<LPARAM>(descriptions))) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Win32WindowPicker::EnumProc(invisible_window_.handle(), 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<LPARAM>(descriptions))) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32Window* visible_window() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &visible_window_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32Window* invisible_window() { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &invisible_window_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32Window visible_window_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32Window invisible_window_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Win32WindowPickerTest, TestGetWindowList) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32WindowPickerForTest window_picker; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowDescriptionList descriptions; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(window_picker.GetWindowList(&descriptions)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, descriptions.size()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowDescription desc = descriptions.front(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(window_picker.visible_window()->handle(), desc.id().id()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TCHAR window_title[500]; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWindowText(window_picker.visible_window()->handle(), window_title, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARRAY_SIZE(window_title)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, wcscmp(window_title, kVisibleWindowTitle)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Win32WindowPickerTest, TestIsVisible) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32WindowPickerForTest window_picker; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND visible_id = window_picker.visible_window()->handle(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND invisible_id = window_picker.invisible_window()->handle(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(window_picker.IsVisible(WindowId(visible_id))); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(window_picker.IsVisible(WindowId(invisible_id))); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Win32WindowPickerTest, TestMoveToFront) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Win32WindowPickerForTest window_picker; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND visible_id = window_picker.visible_window()->handle(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND invisible_id = window_picker.invisible_window()->handle(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are a number of condition where SetForegroundWindow might 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fail depending on the state of the calling process. To be on the 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // safe side we doesn't expect MoveToFront to return true, just test 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // that we don't crash. 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window_picker.MoveToFront(WindowId(visible_id)); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window_picker.MoveToFront(WindowId(invisible_id)); 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99} // namespace rtc 100