diff --git a/libcef/browser/chrome/chrome_browser_context.cc b/libcef/browser/chrome/chrome_browser_context.cc index ed65ec034..e3575d4fc 100644 --- a/libcef/browser/chrome/chrome_browser_context.cc +++ b/libcef/browser/chrome/chrome_browser_context.cc @@ -4,7 +4,6 @@ #include "libcef/browser/chrome/chrome_browser_context.h" -#include "libcef/browser/prefs/browser_prefs.h" #include "libcef/browser/thread_util.h" #include "chrome/browser/browser_process.h" @@ -112,7 +111,6 @@ void ChromeBrowserContext::ProfileCreated(Profile* profile, if (status == Profile::CreateStatus::CREATE_STATUS_INITIALIZED) { CHECK(profile_); - browser_prefs::SetLanguagePrefs(profile_); // Must set |profile_| before Init() calls // ChromeContentBrowserClientCef::ConfigureNetworkContextParams so that diff --git a/libcef/browser/chrome/chrome_content_browser_client_cef.cc b/libcef/browser/chrome/chrome_content_browser_client_cef.cc index 55e0c1312..3030a4a35 100644 --- a/libcef/browser/chrome/chrome_content_browser_client_cef.cc +++ b/libcef/browser/chrome/chrome_content_browser_client_cef.cc @@ -16,6 +16,7 @@ #include "libcef/browser/net_service/login_delegate.h" #include "libcef/browser/net_service/proxy_url_loader_factory.h" #include "libcef/browser/net_service/resource_request_handler_wrapper.h" +#include "libcef/browser/prefs/browser_prefs.h" #include "libcef/browser/prefs/renderer_prefs.h" #include "libcef/common/app_manager.h" #include "libcef/common/cef_switches.h" @@ -303,6 +304,17 @@ void ChromeContentBrowserClientCef::ConfigureNetworkContextParams( network_context_params->cookieable_schemes = 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; + } } std::unique_ptr diff --git a/libcef/browser/context.cc b/libcef/browser/context.cc index 9942e2e3a..687e4b8df 100644 --- a/libcef/browser/context.cc +++ b/libcef/browser/context.cc @@ -435,8 +435,6 @@ void CefContext::PopulateGlobalRequestContextSettings( settings->ignore_certificate_errors = settings_.ignore_certificate_errors || command_line->HasSwitch(switches::kIgnoreCertificateErrors); - CefString(&settings->accept_language_list) = - CefString(&settings_.accept_language_list); CefString(&settings->cookieable_schemes_list) = CefString(&settings_.cookieable_schemes_list); @@ -449,12 +447,6 @@ void CefContext::NormalizeRequestContextSettings( // The |root_cache_path| value was already normalized in Initialize. const base::FilePath& root_cache_path = CefString(&settings_.root_cache_path); NormalizeCachePathAndSet(settings->cache_path, root_cache_path); - - if (settings->accept_language_list.length == 0) { - // Use the global language list setting. - CefString(&settings->accept_language_list) = - CefString(&settings_.accept_language_list); - } } void CefContext::AddObserver(Observer* observer) { diff --git a/libcef/browser/net_service/resource_request_handler_wrapper.cc b/libcef/browser/net_service/resource_request_handler_wrapper.cc index 64eb4896c..8977459c9 100644 --- a/libcef/browser/net_service/resource_request_handler_wrapper.cc +++ b/libcef/browser/net_service/resource_request_handler_wrapper.cc @@ -11,6 +11,7 @@ #include "libcef/browser/net_service/proxy_url_loader_factory.h" #include "libcef/browser/net_service/resource_handler_wrapper.h" #include "libcef/browser/net_service/response_filter_wrapper.h" +#include "libcef/browser/prefs/browser_prefs.h" #include "libcef/browser/thread_util.h" #include "libcef/common/app_manager.h" #include "libcef/common/net/scheme_registration.h" @@ -28,7 +29,6 @@ #include "content/public/browser/web_contents.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" -#include "net/http/http_util.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "ui/base/page_transition_types.h" #include "url/origin.h" @@ -78,28 +78,6 @@ class RequestCallbackWrapper : public CefRequestCallback { DISALLOW_COPY_AND_ASSIGN(RequestCallbackWrapper); }; -std::string GetAcceptLanguageList(content::BrowserContext* browser_context, - CefRefPtr browser) { - if (browser) { - const CefBrowserSettings& browser_settings = browser->settings(); - if (browser_settings.accept_language_list.length > 0) { - return CefString(&browser_settings.accept_language_list); - } - } - - // This defaults to the value from CefRequestContextSettings via - // browser_prefs::CreatePrefService(). - auto prefs = Profile::FromBrowserContext(browser_context)->GetPrefs(); - return prefs->GetString(language::prefs::kAcceptLanguages); -} - -// Match the logic in chrome/browser/net/profile_network_context_service.cc. -std::string ComputeAcceptLanguageFromPref(const std::string& language_pref) { - std::string accept_languages_str = - net::HttpUtil::ExpandLanguageList(language_pref); - return net::HttpUtil::GenerateAcceptLanguageHeader(accept_languages_str); -} - class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler { public: struct RequestState { @@ -288,8 +266,8 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler { unhandled_request_callback_ = unhandled_request_callback; // Default values for standard headers. - accept_language_ = ComputeAcceptLanguageFromPref( - GetAcceptLanguageList(browser_context, browser)); + accept_language_ = browser_prefs::GetAcceptLanguageList( + cef_browser_context, browser.get(), /*expand=*/true); 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 b261a3b91..76d7e57df 100644 --- a/libcef/browser/prefs/browser_prefs.cc +++ b/libcef/browser/prefs/browser_prefs.cc @@ -5,6 +5,8 @@ #include "libcef/browser/prefs/browser_prefs.h" #include "libcef/browser/browser_context.h" +#include "libcef/browser/browser_host_base.h" +#include "libcef/browser/context.h" #include "libcef/browser/media_capture_devices_dispatcher.h" #include "libcef/browser/prefs/pref_store.h" #include "libcef/browser/prefs/renderer_prefs.h" @@ -57,6 +59,7 @@ #include "content/public/browser/browser_thread.h" #include "extensions/browser/extension_prefs.h" #include "extensions/buildflags/buildflags.h" +#include "net/http/http_util.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/ui_base_switches.h" @@ -74,12 +77,35 @@ namespace browser_prefs { namespace { -std::string GetAcceptLanguageList(Profile* profile) { - const CefRequestContextSettings& context_settings = - CefBrowserContext::FromBrowserContext(profile)->settings(); - if (context_settings.accept_language_list.length > 0) { - return CefString(&context_settings.accept_language_list); +// Match the logic in chrome/browser/net/profile_network_context_service.cc. +std::string ComputeAcceptLanguageFromPref(const std::string& language_pref) { + std::string accept_languages_str = + net::HttpUtil::ExpandLanguageList(language_pref); + return net::HttpUtil::GenerateAcceptLanguageHeader(accept_languages_str); +} + +// Return the most relevant setting based on |browser_context| and |browser|. +std::string GetAcceptLanguageListSetting(CefBrowserContext* browser_context, + CefBrowserHostBase* browser) { + if (browser) { + const auto& settings = browser->settings(); + if (settings.accept_language_list.length > 0) { + return CefString(&settings.accept_language_list); + } } + + if (browser_context) { + const auto& settings = browser_context->settings(); + if (settings.accept_language_list.length > 0) { + return CefString(&settings.accept_language_list); + } + } + + const auto& settings = CefContext::Get()->settings(); + if (settings.accept_language_list.length > 0) { + return CefString(&settings.accept_language_list); + } + return std::string(); } @@ -295,7 +321,8 @@ std::unique_ptr CreatePrefService(Profile* profile, // Language preferences. Used by ProfileNetworkContextService and // InterceptedRequestHandlerWrapper. - const std::string& accept_language_list = GetAcceptLanguageList(profile); + const std::string& accept_language_list = GetAcceptLanguageListSetting( + CefBrowserContext::FromProfile(profile), /*browser=*/nullptr); if (!accept_language_list.empty()) { registry->SetDefaultPrefValue(language::prefs::kAcceptLanguages, base::Value(accept_language_list)); @@ -307,12 +334,26 @@ std::unique_ptr CreatePrefService(Profile* profile, return factory.CreateSyncable(registry.get()); } -void SetLanguagePrefs(Profile* profile) { - const std::string& accept_language_list = GetAcceptLanguageList(profile); - if (!accept_language_list.empty()) { - profile->GetPrefs()->SetString(language::prefs::kAcceptLanguages, - accept_language_list); +std::string GetAcceptLanguageList(CefBrowserContext* browser_context, + CefBrowserHostBase* browser, + bool expand) { + // Always prefer to the CEF settings configuration, if specified. + std::string accept_language_list = + GetAcceptLanguageListSetting(browser_context, browser); + if (accept_language_list.empty() && browser_context) { + // Fall back to the preference value. For the Alloy runtime the default + // value comes from browser_prefs::CreatePrefService() above. For the Chrome + // runtime the default value comes from the configured locale + // (IDS_ACCEPT_LANGUAGES) which is then overridden by the user preference in + // chrome://settings/languages, all managed by language::LanguagePrefs. + auto prefs = browser_context->AsProfile()->GetPrefs(); + accept_language_list = prefs->GetString(language::prefs::kAcceptLanguages); } + + if (!accept_language_list.empty() && expand) { + return ComputeAcceptLanguageFromPref(accept_language_list); + } + return std::string(); } } // namespace browser_prefs diff --git a/libcef/browser/prefs/browser_prefs.h b/libcef/browser/prefs/browser_prefs.h index fdc442307..78da04d1f 100644 --- a/libcef/browser/prefs/browser_prefs.h +++ b/libcef/browser/prefs/browser_prefs.h @@ -11,6 +11,8 @@ namespace base { class FilePath; } +class CefBrowserContext; +class CefBrowserHostBase; class PrefRegistrySimple; class PrefService; class Profile; @@ -29,8 +31,12 @@ std::unique_ptr CreatePrefService(Profile* profile, const base::FilePath& cache_path, bool persist_user_preferences); -// Set language preferences on |profile|. -void SetLanguagePrefs(Profile* profile); +// Returns the value for populating the accept-language HTTP request header. +// |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); } // namespace browser_prefs diff --git a/tests/cefclient/browser/main_context_impl.cc b/tests/cefclient/browser/main_context_impl.cc index 980c51ff3..21ffeae08 100644 --- a/tests/cefclient/browser/main_context_impl.cc +++ b/tests/cefclient/browser/main_context_impl.cc @@ -202,6 +202,12 @@ void MainContextImpl::PopulateSettings(CefSettings* settings) { if (browser_background_color_ != 0) settings->background_color = browser_background_color_; + + if (command_line_->HasSwitch("lang")) { + // Use the same locale for the Accept-Language HTTP request header. + CefString(&settings->accept_language_list) = + command_line_->GetSwitchValue("lang"); + } } void MainContextImpl::PopulateBrowserSettings(CefBrowserSettings* settings) {