147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2010 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h"
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/common.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h"
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32window.h"
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32windowpicker.h"
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/windowpicker.h"
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(WEBRTC_WIN)
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#error Only for Windows
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const TCHAR* kVisibleWindowTitle = L"Visible Window";
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const TCHAR* kInvisibleWindowTitle = L"Invisible Window";
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Win32WindowPickerForTest : public Win32WindowPicker {
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32WindowPickerForTest() {
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_TRUE(visible_window_.Create(NULL, kVisibleWindowTitle, WS_VISIBLE,
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                       0, 0, 0, 0, 0));
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_TRUE(invisible_window_.Create(NULL, kInvisibleWindowTitle, 0,
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                         0, 0, 0, 0, 0));
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ~Win32WindowPickerForTest() {
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    visible_window_.Destroy();
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    invisible_window_.Destroy();
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual bool GetWindowList(WindowDescriptionList* descriptions) {
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!Win32WindowPicker::EnumProc(visible_window_.handle(),
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                     reinterpret_cast<LPARAM>(descriptions))) {
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return false;
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!Win32WindowPicker::EnumProc(invisible_window_.handle(),
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                     reinterpret_cast<LPARAM>(descriptions))) {
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return false;
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return true;
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32Window* visible_window() {
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return &visible_window_;
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32Window* invisible_window() {
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return &invisible_window_;
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private:
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32Window visible_window_;
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32Window invisible_window_;
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(Win32WindowPickerTest, TestGetWindowList) {
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32WindowPickerForTest window_picker;
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  WindowDescriptionList descriptions;
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(window_picker.GetWindowList(&descriptions));
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(1, descriptions.size());
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  WindowDescription desc = descriptions.front();
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(window_picker.visible_window()->handle(), desc.id().id());
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TCHAR window_title[500];
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  GetWindowText(window_picker.visible_window()->handle(), window_title,
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                ARRAY_SIZE(window_title));
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(0, wcscmp(window_title, kVisibleWindowTitle));
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(Win32WindowPickerTest, TestIsVisible) {
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32WindowPickerForTest window_picker;
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  HWND visible_id = window_picker.visible_window()->handle();
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  HWND invisible_id = window_picker.invisible_window()->handle();
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(window_picker.IsVisible(WindowId(visible_id)));
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(window_picker.IsVisible(WindowId(invisible_id)));
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(Win32WindowPickerTest, TestMoveToFront) {
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32WindowPickerForTest window_picker;
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  HWND visible_id = window_picker.visible_window()->handle();
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  HWND invisible_id = window_picker.invisible_window()->handle();
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // There are a number of condition where SetForegroundWindow might
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // fail depending on the state of the calling process. To be on the
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // safe side we doesn't expect MoveToFront to return true, just test
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // that we don't crash.
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  window_picker.MoveToFront(WindowId(visible_id));
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  window_picker.MoveToFront(WindowId(invisible_id));
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
100