From 628b68116059636057c115c4d9183898f393db09 Mon Sep 17 00:00:00 2001 From: Sorah Fukumori Date: Thu, 23 Apr 2020 07:57:14 +0900 Subject: [PATCH] feat: respect language preferences on Win/macOS This commit partially fixes https://github.com/electron/electron/issues/18829 Chromium uses navigator.languages (Accept-Language) to determine fallback fonts on Windows, especially kanji/han characters in CJK. Previously the full preferences set to OS was not given to Chromium. For instance, when user sets 'en-US, ja-JP' to Accept-Language, while Chromium chooses Japanese font for kanji text, but Electron chooses Chinese font. This is because only the first language is given to Accept-Language on Electron. This patch is based on https://github.com/electron/electron/pull/15532 Co-authored-by: Nitish Sakhawalkar --- filenames.gni | 2 ++ .../browser/api/electron_api_web_contents.cc | 4 +-- shell/browser/api/electron_api_web_contents.h | 2 ++ .../api/electron_api_web_contents_linux.cc | 20 +++++++++++++ .../api/electron_api_web_contents_mac.mm | 6 ++++ .../api/electron_api_web_contents_win.cc | 28 +++++++++++++++++++ spec-main/chromium-spec.ts | 3 +- 7 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 shell/browser/api/electron_api_web_contents_linux.cc create mode 100644 shell/browser/api/electron_api_web_contents_win.cc diff --git a/filenames.gni b/filenames.gni index 404b2f3502e29..324e6caed6aef 100644 --- a/filenames.gni +++ b/filenames.gni @@ -110,6 +110,8 @@ filenames = { "shell/browser/api/electron_api_web_contents.h", "shell/browser/api/electron_api_web_contents_impl.cc", "shell/browser/api/electron_api_web_contents_mac.mm", + "shell/browser/api/electron_api_web_contents_linux.cc", + "shell/browser/api/electron_api_web_contents_win.cc", "shell/browser/api/electron_api_web_contents_view.cc", "shell/browser/api/electron_api_web_contents_view.h", "shell/browser/api/electron_api_web_request.cc", diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index b65096d368ad3..e61a7aa5a596b 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -100,6 +100,7 @@ #include "third_party/blink/public/mojom/frame/find_in_page.mojom.h" #include "third_party/blink/public/mojom/frame/fullscreen.mojom.h" #include "third_party/blink/public/mojom/messaging/transferable_message.mojom.h" +#include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #include "ui/base/cursor/cursor.h" #include "ui/base/mojom/cursor_type.mojom-shared.h" #include "ui/display/screen.h" @@ -121,7 +122,6 @@ #endif #if defined(OS_LINUX) || defined(OS_WIN) -#include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #include "ui/gfx/font_render_params.h" #endif @@ -535,7 +535,7 @@ void WebContents::InitWithSessionAndOptions( managed_web_contents()->GetView()->SetDelegate(this); auto* prefs = web_contents()->GetMutableRendererPrefs(); - prefs->accept_languages = g_browser_process->GetApplicationLocale(); + SetAcceptLanguages(prefs); #if defined(OS_LINUX) || defined(OS_WIN) // Update font settings. diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index 980ff85b0630f..2db27c7ffe1dd 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -579,6 +579,8 @@ class WebContents : public gin_helper::TrackableObject, void InitZoomController(content::WebContents* web_contents, const gin_helper::Dictionary& options); + void SetAcceptLanguages(blink::mojom::RendererPreferences* prefs); + v8::Global session_; v8::Global devtools_web_contents_; v8::Global debugger_; diff --git a/shell/browser/api/electron_api_web_contents_linux.cc b/shell/browser/api/electron_api_web_contents_linux.cc new file mode 100644 index 0000000000000..27ac73c9b4cd3 --- /dev/null +++ b/shell/browser/api/electron_api_web_contents_linux.cc @@ -0,0 +1,20 @@ +// 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 "chrome/browser/browser_process.h" +#include "content/public/common/renderer_preferences.h" + +namespace electron { + +namespace api { + +void WebContents::SetAcceptLanguages(blink::mojom::RendererPreferences* prefs) { + prefs->accept_languages = g_browser_process->GetApplicationLocale(); +} + +} // namespace api + +} // namespace electron diff --git a/shell/browser/api/electron_api_web_contents_mac.mm b/shell/browser/api/electron_api_web_contents_mac.mm index ea70eed08d522..3e0c920400004 100644 --- a/shell/browser/api/electron_api_web_contents_mac.mm +++ b/shell/browser/api/electron_api_web_contents_mac.mm @@ -4,6 +4,7 @@ #include "content/public/browser/render_widget_host_view.h" #include "shell/browser/api/electron_api_web_contents.h" +#include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #import @@ -27,6 +28,11 @@ return view->HasFocus(); } +void WebContents::SetAcceptLanguages(blink::mojom::RendererPreferences* prefs) { + prefs->accept_languages = base::SysNSStringToUTF8( + [[NSLocale preferredLanguages] componentsJoinedByString:@","]); +} + } // namespace api } // namespace electron diff --git a/shell/browser/api/electron_api_web_contents_win.cc b/shell/browser/api/electron_api_web_contents_win.cc new file mode 100644 index 0000000000000..a4e21eca8f86c --- /dev/null +++ b/shell/browser/api/electron_api_web_contents_win.cc @@ -0,0 +1,28 @@ +// 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 "base/strings/sys_string_conversions.h" +#include "base/win/i18n.h" +#include "third_party/blink/public/mojom/renderer_preferences.mojom.h" + +namespace electron { + +namespace api { + +void WebContents::SetAcceptLanguages(blink::mojom::RendererPreferences* prefs) { + std::vector languages; + base::win::i18n::GetThreadPreferredUILanguageList(&languages); + std::string accept_langs; + for (const auto& s16 : languages) { + accept_langs += base::SysWideToUTF8(s16) + ','; + } + accept_langs.pop_back(); + prefs->accept_languages = accept_langs; +} + +} // namespace api + +} // namespace electron diff --git a/spec-main/chromium-spec.ts b/spec-main/chromium-spec.ts index 2a4320d393427..81760b01b1451 100644 --- a/spec-main/chromium-spec.ts +++ b/spec-main/chromium-spec.ts @@ -319,7 +319,8 @@ describe('chromium features', () => { const w = new BrowserWindow({ show: false }); await w.loadURL('about:blank'); const languages = await w.webContents.executeJavaScript('navigator.languages'); - expect(languages).to.deep.equal([appLocale]); + expect(languages.length).to.be.greaterThan(0); + expect(languages[0].split('-')[0]).to.equal(appLocale); }); });