From 5053a958e1487c67b5855c83bc32f740b472736c Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Thu, 5 Oct 2023 16:35:02 -0400 Subject: [PATCH] chrome: Set prefs for accept_language_list on Profile init (fixes #3579) --- .../browser/chrome/chrome_browser_context.cc | 3 +++ .../chrome_content_browser_client_cef.cc | 11 --------- .../resource_request_handler_wrapper.cc | 2 +- libcef/browser/prefs/browser_prefs.cc | 24 ++++++++++++++++--- libcef/browser/prefs/browser_prefs.h | 6 +++-- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/libcef/browser/chrome/chrome_browser_context.cc b/libcef/browser/chrome/chrome_browser_context.cc index 7528a670e..c35b733ef 100644 --- a/libcef/browser/chrome/chrome_browser_context.cc +++ b/libcef/browser/chrome/chrome_browser_context.cc @@ -4,6 +4,7 @@ #include "libcef/browser/chrome/chrome_browser_context.h" +#include "libcef/browser/prefs/browser_prefs.h" #include "libcef/browser/thread_util.h" #include "base/threading/thread_restrictions.h" @@ -167,6 +168,8 @@ void ChromeBrowserContext::ProfileCreated(Profile::CreateStatus status, : SessionStartupPref::kPrefValueNewTab); } + browser_prefs::SetInitialProfilePrefs(profile_); + if (!init_callbacks_.empty()) { for (auto& callback : init_callbacks_) { std::move(callback).Run(); diff --git a/libcef/browser/chrome/chrome_content_browser_client_cef.cc b/libcef/browser/chrome/chrome_content_browser_client_cef.cc index c223b82a4..a6572c5f4 100644 --- a/libcef/browser/chrome/chrome_content_browser_client_cef.cc +++ b/libcef/browser/chrome/chrome_content_browser_client_cef.cc @@ -411,17 +411,6 @@ bool ChromeContentBrowserClientCef::ConfigureNetworkContextParams( cef_context ? cef_context->GetCookieableSchemes() : CefBrowserContext::GetGlobalCookieableSchemes(); - // Prefer the CEF settings configuration, if specified, instead of the - // kAcceptLanguages preference which is controlled by the - // chrome://settings/languages configuration. - const std::string& accept_language_list = - browser_prefs::GetAcceptLanguageList(cef_context, /*browser=*/nullptr, - /*expand=*/true); - if (!accept_language_list.empty() && - accept_language_list != network_context_params->accept_language) { - network_context_params->accept_language = accept_language_list; - } - return true; } diff --git a/libcef/browser/net_service/resource_request_handler_wrapper.cc b/libcef/browser/net_service/resource_request_handler_wrapper.cc index e1b377c9f..de9b302ca 100644 --- a/libcef/browser/net_service/resource_request_handler_wrapper.cc +++ b/libcef/browser/net_service/resource_request_handler_wrapper.cc @@ -275,7 +275,7 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler { // Default values for standard headers. accept_language_ = browser_prefs::GetAcceptLanguageList( - cef_browser_context, browser.get(), /*expand=*/true); + cef_browser_context, browser.get()); DCHECK(!accept_language_.empty()); user_agent_ = CefAppManager::Get()->GetContentClient()->browser()->GetUserAgent(); diff --git a/libcef/browser/prefs/browser_prefs.cc b/libcef/browser/prefs/browser_prefs.cc index 179354080..c7e61b516 100644 --- a/libcef/browser/prefs/browser_prefs.cc +++ b/libcef/browser/prefs/browser_prefs.cc @@ -365,8 +365,7 @@ std::unique_ptr CreatePrefService(Profile* profile, } std::string GetAcceptLanguageList(CefBrowserContext* browser_context, - CefBrowserHostBase* browser, - bool expand) { + CefBrowserHostBase* browser) { // Always prefer to the CEF settings configuration, if specified. std::string accept_language_list = GetAcceptLanguageListSetting(browser_context, browser); @@ -380,10 +379,29 @@ std::string GetAcceptLanguageList(CefBrowserContext* browser_context, accept_language_list = prefs->GetString(language::prefs::kAcceptLanguages); } - if (!accept_language_list.empty() && expand) { + if (!accept_language_list.empty()) { return ComputeAcceptLanguageFromPref(accept_language_list); } return std::string(); } +void SetInitialProfilePrefs(Profile* profile) { + auto* prefs = profile->GetPrefs(); + + // Language preferences. + const std::string& accept_language_list = GetAcceptLanguageListSetting( + CefBrowserContext::FromProfile(profile), /*browser=*/nullptr); + if (!accept_language_list.empty()) { + // Used by ProfileNetworkContextService and InterceptedRequestHandlerWrapper + // (via GetAcceptLanguageList) for request headers, and + // renderer_preferences_util::UpdateFromSystemSettings() for + // `navigator.language`. + prefs->SetString(language::prefs::kAcceptLanguages, accept_language_list); + + // Necessary to avoid a reset of the kAcceptLanguages value in + // LanguagePrefs::UpdateAcceptLanguagesPref(). + prefs->SetString(language::prefs::kSelectedLanguages, accept_language_list); + } +} + } // namespace browser_prefs diff --git a/libcef/browser/prefs/browser_prefs.h b/libcef/browser/prefs/browser_prefs.h index 85ee6626a..3f1a28dc3 100644 --- a/libcef/browser/prefs/browser_prefs.h +++ b/libcef/browser/prefs/browser_prefs.h @@ -37,8 +37,10 @@ std::unique_ptr CreatePrefService(Profile* profile, // |browser_context| and/or |browser| may be nullptr. If |expand| is true then // base languages and Q values may be added. std::string GetAcceptLanguageList(CefBrowserContext* browser_context, - CefBrowserHostBase* browser, - bool expand); + CefBrowserHostBase* browser); + +// Set preferences for a newly initialized Profile. +void SetInitialProfilePrefs(Profile* profile); } // namespace browser_prefs