forked from electron/electron
-
Notifications
You must be signed in to change notification settings - Fork 0
/
electron_api_web_contents_win.cc
82 lines (65 loc) · 2.31 KB
/
electron_api_web_contents_win.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright (c) 2020 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/browser/api/electron_api_web_contents.h"
#include <roapi.h>
#include <windows.system.userprofile.h>
#include <wrl.h>
#include "base/strings/sys_string_conversions.h"
#include "base/win/core_winrt_util.h"
#include "base/win/i18n.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
namespace electron {
namespace api {
void WebContents::SetAcceptLanguages(blink::mojom::RendererPreferences* prefs) {
std::vector<base::string16> languages;
// Attempt to use API available on Windows 10 or later, which
// returns the full list of language preferences.
if (!GetLanguagesUsingGlobalization(&languages)) {
base::win::i18n::GetThreadPreferredUILanguageList(&languages);
}
std::string accept_langs;
for (const auto& language : languages) {
accept_langs += base::SysWideToUTF8(language) + ',';
}
accept_langs.pop_back();
prefs->accept_languages = accept_langs;
}
bool WebContents::GetLanguagesUsingGlobalization(
std::vector<base::string16>* languages) {
if (base::win::GetVersion() < base::win::Version::WIN10)
return false;
if (!base::win::ResolveCoreWinRTDelayload() ||
!base::win::ScopedHString::ResolveCoreWinRTStringDelayload())
return false;
base::win::ScopedHString guid = base::win::ScopedHString::Create(
RuntimeClass_Windows_System_UserProfile_GlobalizationPreferences);
Microsoft::WRL::ComPtr<
ABI::Windows::System::UserProfile::IGlobalizationPreferencesStatics>
prefs;
HRESULT hr =
base::win::RoGetActivationFactory(guid.get(), IID_PPV_ARGS(&prefs));
if (FAILED(hr))
return false;
ABI::Windows::Foundation::Collections::IVectorView<HSTRING>* langs;
hr = prefs->get_Languages(&langs);
if (FAILED(hr))
return false;
unsigned size;
hr = langs->get_Size(&size);
if (FAILED(hr))
return false;
for (unsigned i = 0; i < size; ++i) {
HSTRING hstr;
hr = langs->GetAt(i, &hstr);
if (SUCCEEDED(hr)) {
base::WStringPiece str = base::win::ScopedHString(hstr).Get();
languages->emplace_back(str.data(), str.size());
}
}
return true;
}
} // namespace api
} // namespace electron