| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/win/window_enumerator.h" |
| |
| #include <windows.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/test/bind.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base::win { |
| |
| TEST(WindowEnumeratorTest, EnumerateTopLevelWindows) { |
| EnumerateChildWindows( |
| ::GetDesktopWindow(), base::BindLambdaForTesting([&](HWND hwnd) { |
| const std::wstring window_class = GetWindowClass(hwnd); |
| EXPECT_EQ(window_class, [&]() { |
| constexpr int kMaxWindowClassNameLength = 256; |
| wchar_t buffer[kMaxWindowClassNameLength + 1] = {0}; |
| const int name_len = ::GetClassName(hwnd, buffer, std::size(buffer)); |
| if (name_len <= 0 || name_len > kMaxWindowClassNameLength) { |
| return std::wstring(); |
| } |
| return std::wstring(&buffer[0], static_cast<size_t>(name_len)); |
| }()); |
| |
| EXPECT_EQ(IsTopmostWindow(hwnd), |
| (::GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0); |
| |
| EXPECT_EQ(IsSystemDialog(hwnd), window_class == L"#32770"); |
| |
| EXPECT_EQ(IsShellWindow(hwnd), |
| window_class == L"Button" || |
| window_class == L"Shell_TrayWnd" || |
| window_class == L"Shell_SecondaryTrayWnd"); |
| EXPECT_EQ(GetWindowTextString(hwnd), [&]() { |
| const int num_chars = ::GetWindowTextLength(hwnd); |
| if (!num_chars) { |
| return std::wstring(); |
| } |
| std::vector<wchar_t> text(static_cast<size_t>(num_chars) + 1); |
| if (!::GetWindowText(hwnd, &text.front(), |
| static_cast<int>(text.size()))) { |
| return std::wstring(); |
| } |
| return std::wstring(text.begin(), --text.end()); |
| }()); |
| return false; |
| })); |
| } |
| |
| } // namespace base::win |