Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
26 changes: 1 addition & 25 deletions shell/platform/windows/system_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,33 +54,9 @@ std::wstring GetPreferredLanguagesFromMUI() {
std::vector<std::wstring> GetPreferredLanguages(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have no more use for GetPreferredLanguagesFromRegistry. Should we remove the function altogether?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes please remove this. If needed, we can always use git's history to resurrect the code.

const WindowsRegistry& registry) {
std::vector<std::wstring> languages;
BOOL languages_from_registry = TRUE;
ULONG buffer_size = 0;
ULONG count = 0;
DWORD flags = MUI_LANGUAGE_NAME | MUI_UI_FALLBACK;

// Determine where languages are defined and get buffer length
if (registry.GetRegistryValue(HKEY_CURRENT_USER, kGetPreferredLanguageRegKey,
kGetPreferredLanguageRegValue,
RRF_RT_REG_MULTI_SZ, NULL, NULL,
&buffer_size) != ERROR_SUCCESS) {
languages_from_registry = FALSE;
}

// Multi-string must be at least 3-long if non-empty,
// as a multi-string is terminated with 2 nulls.
//
// See:
// https://learn.microsoft.com/windows/win32/sysinfo/registry-value-types
if (languages_from_registry && buffer_size < 3) {
languages_from_registry = FALSE;
}

// Initialize the buffer
std::wstring buffer =
languages_from_registry
? GetPreferredLanguagesFromRegistry(registry, buffer_size)
: GetPreferredLanguagesFromMUI();
std::wstring buffer = GetPreferredLanguagesFromMUI();

// Extract the individual languages from the buffer.
size_t start = 0;
Expand Down
53 changes: 12 additions & 41 deletions shell/platform/windows/system_utils_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,38 +12,6 @@
namespace flutter {
namespace testing {

class MockWindowsRegistry : public WindowsRegistry {
public:
MockWindowsRegistry() = default;
virtual ~MockWindowsRegistry() = default;

virtual LSTATUS GetRegistryValue(HKEY hkey,
LPCWSTR key,
LPCWSTR value,
DWORD flags,
LPDWORD type,
PVOID data,
LPDWORD data_size) const {
using namespace std::string_literals;
static const std::wstring locales =
L"en-US\0zh-Hans-CN\0ja\0zh-Hant-TW\0he\0\0"s;
static DWORD locales_len = locales.size() * sizeof(wchar_t);
if (data != nullptr) {
if (*data_size < locales_len) {
return ERROR_MORE_DATA;
}
std::memcpy(data, locales.data(), locales_len);
*data_size = locales_len;
} else if (data_size != NULL) {
*data_size = locales_len;
}
return ERROR_SUCCESS;
}

private:
FML_DISALLOW_COPY_AND_ASSIGN(MockWindowsRegistry);
};

TEST(SystemUtils, GetPreferredLanguageInfo) {
WindowsRegistry registry;
std::vector<LanguageInfo> languages = GetPreferredLanguageInfo(registry);
Expand All @@ -63,15 +31,18 @@ TEST(SystemUtils, GetPreferredLanguages) {
// There should not be a trailing null from the parsing step.
EXPECT_EQ(languages[0].size(), wcslen(languages[0].c_str()));

// Test mock results
MockWindowsRegistry mock_registry;
languages = GetPreferredLanguages(mock_registry);
ASSERT_EQ(languages.size(), 5);
ASSERT_EQ(languages[0], std::wstring(L"en-US"));
ASSERT_EQ(languages[1], std::wstring(L"zh-Hans-CN"));
ASSERT_EQ(languages[2], std::wstring(L"ja"));
ASSERT_EQ(languages[3], std::wstring(L"zh-Hant-TW"));
ASSERT_EQ(languages[4], std::wstring(L"he"));
// Get actual system language.
std::wstring wdl_msz = GetPreferredLanguagesFromMUI();
auto wdl_itr = wdl_msz.begin();
for (auto languages_itr = languages.begin(); languages_itr != languages.end();
languages_itr++) {
for (auto lang_itr = languages_itr->begin();
lang_itr != languages_itr->end(); lang_itr++) {
EXPECT_EQ(*lang_itr, *wdl_itr++);
}
EXPECT_EQ(*wdl_itr++, 0);
}
EXPECT_EQ(*wdl_itr, 0);
}

TEST(SystemUtils, ParseLanguageNameGeneric) {
Expand Down