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