mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-23 23:47:43 +01:00
chrome: Support configuration of accept language (see issue #2969)
This change adds support for CEF settings configuration of accept_language_list. If specified, this value will take precedence over the "intl.accept_languages" preference which is controlled by chrome://settings/languages.
This commit is contained in:
parent
c03a6f4386
commit
3ab91a45c9
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#include "libcef/browser/chrome/chrome_browser_context.h"
|
#include "libcef/browser/chrome/chrome_browser_context.h"
|
||||||
|
|
||||||
#include "libcef/browser/prefs/browser_prefs.h"
|
|
||||||
#include "libcef/browser/thread_util.h"
|
#include "libcef/browser/thread_util.h"
|
||||||
|
|
||||||
#include "chrome/browser/browser_process.h"
|
#include "chrome/browser/browser_process.h"
|
||||||
@ -110,7 +109,6 @@ void ChromeBrowserContext::ProfileCreated(Profile* profile,
|
|||||||
|
|
||||||
if (status == Profile::CreateStatus::CREATE_STATUS_INITIALIZED) {
|
if (status == Profile::CreateStatus::CREATE_STATUS_INITIALIZED) {
|
||||||
CHECK(profile_);
|
CHECK(profile_);
|
||||||
browser_prefs::SetLanguagePrefs(profile_);
|
|
||||||
|
|
||||||
// Must set |profile_| before Init() calls
|
// Must set |profile_| before Init() calls
|
||||||
// ChromeContentBrowserClientCef::ConfigureNetworkContextParams so that
|
// ChromeContentBrowserClientCef::ConfigureNetworkContextParams so that
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "libcef/browser/net_service/login_delegate.h"
|
#include "libcef/browser/net_service/login_delegate.h"
|
||||||
#include "libcef/browser/net_service/proxy_url_loader_factory.h"
|
#include "libcef/browser/net_service/proxy_url_loader_factory.h"
|
||||||
#include "libcef/browser/net_service/resource_request_handler_wrapper.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/browser/prefs/renderer_prefs.h"
|
||||||
#include "libcef/common/app_manager.h"
|
#include "libcef/common/app_manager.h"
|
||||||
#include "libcef/common/cef_switches.h"
|
#include "libcef/common/cef_switches.h"
|
||||||
@ -307,6 +308,17 @@ void ChromeContentBrowserClientCef::ConfigureNetworkContextParams(
|
|||||||
network_context_params->cookieable_schemes =
|
network_context_params->cookieable_schemes =
|
||||||
cef_context ? cef_context->GetCookieableSchemes()
|
cef_context ? cef_context->GetCookieableSchemes()
|
||||||
: CefBrowserContext::GetGlobalCookieableSchemes();
|
: 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<content::LoginDelegate>
|
std::unique_ptr<content::LoginDelegate>
|
||||||
|
@ -435,8 +435,6 @@ void CefContext::PopulateGlobalRequestContextSettings(
|
|||||||
settings->ignore_certificate_errors =
|
settings->ignore_certificate_errors =
|
||||||
settings_.ignore_certificate_errors ||
|
settings_.ignore_certificate_errors ||
|
||||||
command_line->HasSwitch(switches::kIgnoreCertificateErrors);
|
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) =
|
||||||
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.
|
// The |root_cache_path| value was already normalized in Initialize.
|
||||||
const base::FilePath& root_cache_path = CefString(&settings_.root_cache_path);
|
const base::FilePath& root_cache_path = CefString(&settings_.root_cache_path);
|
||||||
NormalizeCachePathAndSet(settings->cache_path, 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) {
|
void CefContext::AddObserver(Observer* observer) {
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "libcef/browser/net_service/proxy_url_loader_factory.h"
|
#include "libcef/browser/net_service/proxy_url_loader_factory.h"
|
||||||
#include "libcef/browser/net_service/resource_handler_wrapper.h"
|
#include "libcef/browser/net_service/resource_handler_wrapper.h"
|
||||||
#include "libcef/browser/net_service/response_filter_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/browser/thread_util.h"
|
||||||
#include "libcef/common/app_manager.h"
|
#include "libcef/common/app_manager.h"
|
||||||
#include "libcef/common/net/scheme_registration.h"
|
#include "libcef/common/net/scheme_registration.h"
|
||||||
@ -28,7 +29,6 @@
|
|||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "net/base/load_flags.h"
|
#include "net/base/load_flags.h"
|
||||||
#include "net/http/http_status_code.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 "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
|
||||||
#include "ui/base/page_transition_types.h"
|
#include "ui/base/page_transition_types.h"
|
||||||
#include "url/origin.h"
|
#include "url/origin.h"
|
||||||
@ -78,28 +78,6 @@ class RequestCallbackWrapper : public CefRequestCallback {
|
|||||||
DISALLOW_COPY_AND_ASSIGN(RequestCallbackWrapper);
|
DISALLOW_COPY_AND_ASSIGN(RequestCallbackWrapper);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string GetAcceptLanguageList(content::BrowserContext* browser_context,
|
|
||||||
CefRefPtr<CefBrowserHostBase> 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 {
|
class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
public:
|
public:
|
||||||
struct RequestState {
|
struct RequestState {
|
||||||
@ -286,8 +264,8 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
|||||||
unhandled_request_callback_ = unhandled_request_callback;
|
unhandled_request_callback_ = unhandled_request_callback;
|
||||||
|
|
||||||
// Default values for standard headers.
|
// Default values for standard headers.
|
||||||
accept_language_ = ComputeAcceptLanguageFromPref(
|
accept_language_ = browser_prefs::GetAcceptLanguageList(
|
||||||
GetAcceptLanguageList(browser_context, browser));
|
cef_browser_context, browser.get(), /*expand=*/true);
|
||||||
DCHECK(!accept_language_.empty());
|
DCHECK(!accept_language_.empty());
|
||||||
user_agent_ =
|
user_agent_ =
|
||||||
CefAppManager::Get()->GetContentClient()->browser()->GetUserAgent();
|
CefAppManager::Get()->GetContentClient()->browser()->GetUserAgent();
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
#include "libcef/browser/prefs/browser_prefs.h"
|
#include "libcef/browser/prefs/browser_prefs.h"
|
||||||
|
|
||||||
#include "libcef/browser/browser_context.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/media_capture_devices_dispatcher.h"
|
||||||
#include "libcef/browser/prefs/pref_store.h"
|
#include "libcef/browser/prefs/pref_store.h"
|
||||||
#include "libcef/browser/prefs/renderer_prefs.h"
|
#include "libcef/browser/prefs/renderer_prefs.h"
|
||||||
@ -58,6 +60,7 @@
|
|||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "extensions/browser/extension_prefs.h"
|
#include "extensions/browser/extension_prefs.h"
|
||||||
#include "extensions/buildflags/buildflags.h"
|
#include "extensions/buildflags/buildflags.h"
|
||||||
|
#include "net/http/http_util.h"
|
||||||
#include "ui/base/l10n/l10n_util.h"
|
#include "ui/base/l10n/l10n_util.h"
|
||||||
#include "ui/base/ui_base_switches.h"
|
#include "ui/base/ui_base_switches.h"
|
||||||
|
|
||||||
@ -75,12 +78,35 @@ namespace browser_prefs {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
std::string GetAcceptLanguageList(Profile* profile) {
|
// Match the logic in chrome/browser/net/profile_network_context_service.cc.
|
||||||
const CefRequestContextSettings& context_settings =
|
std::string ComputeAcceptLanguageFromPref(const std::string& language_pref) {
|
||||||
CefBrowserContext::FromBrowserContext(profile)->settings();
|
std::string accept_languages_str =
|
||||||
if (context_settings.accept_language_list.length > 0) {
|
net::HttpUtil::ExpandLanguageList(language_pref);
|
||||||
return CefString(&context_settings.accept_language_list);
|
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();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,7 +321,8 @@ std::unique_ptr<PrefService> CreatePrefService(Profile* profile,
|
|||||||
|
|
||||||
// Language preferences. Used by ProfileNetworkContextService and
|
// Language preferences. Used by ProfileNetworkContextService and
|
||||||
// InterceptedRequestHandlerWrapper.
|
// 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()) {
|
if (!accept_language_list.empty()) {
|
||||||
registry->SetDefaultPrefValue(language::prefs::kAcceptLanguages,
|
registry->SetDefaultPrefValue(language::prefs::kAcceptLanguages,
|
||||||
base::Value(accept_language_list));
|
base::Value(accept_language_list));
|
||||||
@ -307,12 +334,26 @@ std::unique_ptr<PrefService> CreatePrefService(Profile* profile,
|
|||||||
return factory.CreateSyncable(registry.get());
|
return factory.CreateSyncable(registry.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetLanguagePrefs(Profile* profile) {
|
std::string GetAcceptLanguageList(CefBrowserContext* browser_context,
|
||||||
const std::string& accept_language_list = GetAcceptLanguageList(profile);
|
CefBrowserHostBase* browser,
|
||||||
if (!accept_language_list.empty()) {
|
bool expand) {
|
||||||
profile->GetPrefs()->SetString(language::prefs::kAcceptLanguages,
|
// Always prefer to the CEF settings configuration, if specified.
|
||||||
accept_language_list);
|
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
|
} // namespace browser_prefs
|
||||||
|
@ -11,6 +11,8 @@ namespace base {
|
|||||||
class FilePath;
|
class FilePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CefBrowserContext;
|
||||||
|
class CefBrowserHostBase;
|
||||||
class PrefRegistrySimple;
|
class PrefRegistrySimple;
|
||||||
class PrefService;
|
class PrefService;
|
||||||
class Profile;
|
class Profile;
|
||||||
@ -29,8 +31,12 @@ std::unique_ptr<PrefService> CreatePrefService(Profile* profile,
|
|||||||
const base::FilePath& cache_path,
|
const base::FilePath& cache_path,
|
||||||
bool persist_user_preferences);
|
bool persist_user_preferences);
|
||||||
|
|
||||||
// Set language preferences on |profile|.
|
// Returns the value for populating the accept-language HTTP request header.
|
||||||
void SetLanguagePrefs(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);
|
||||||
|
|
||||||
} // namespace browser_prefs
|
} // namespace browser_prefs
|
||||||
|
|
||||||
|
@ -202,6 +202,12 @@ void MainContextImpl::PopulateSettings(CefSettings* settings) {
|
|||||||
|
|
||||||
if (browser_background_color_ != 0)
|
if (browser_background_color_ != 0)
|
||||||
settings->background_color = browser_background_color_;
|
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) {
|
void MainContextImpl::PopulateBrowserSettings(CefBrowserSettings* settings) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user