chrome: Support configuration of user agent and locale (see issue #2969)

This change adds support for CefSettings and command-line configuration of
user_agent, user_agent_product (formerly product_version) and locale.
This commit is contained in:
Marshall Greenblatt 2021-04-27 12:39:09 -04:00
parent 328de502ac
commit c03a6f4386
10 changed files with 53 additions and 18 deletions

View File

@ -42,13 +42,13 @@
// way that may cause binary incompatibility with other builds. The universal // way that may cause binary incompatibility with other builds. The universal
// hash value will change if any platform is affected whereas the platform hash // hash value will change if any platform is affected whereas the platform hash
// values will change only if that particular platform is affected. // values will change only if that particular platform is affected.
#define CEF_API_HASH_UNIVERSAL "d128245052a84dd90cd38fed0e6be65824d37de5" #define CEF_API_HASH_UNIVERSAL "d026196d35d8894a836ab3a3d033b84195cdb835"
#if defined(OS_WIN) #if defined(OS_WIN)
#define CEF_API_HASH_PLATFORM "9b1a4706bf1fca26d542aa5f8b05d222f483c872" #define CEF_API_HASH_PLATFORM "4150bd26e7bf639a9b1f3e5860af8c76eeae8570"
#elif defined(OS_MAC) #elif defined(OS_MAC)
#define CEF_API_HASH_PLATFORM "0038a822915e3567f2434053ebc49723fe6951d5" #define CEF_API_HASH_PLATFORM "5cc32f88bd134410eff86b21095138b339d572f2"
#elif defined(OS_LINUX) #elif defined(OS_LINUX)
#define CEF_API_HASH_PLATFORM "66613a535ec6a1aafce6ece8e98cd3876f79633b" #define CEF_API_HASH_PLATFORM "b227b3fdd6142a9d8ff0f2252a71425f15960800"
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -304,9 +304,9 @@ typedef struct _cef_settings_t {
// Value that will be inserted as the product portion of the default // Value that will be inserted as the product portion of the default
// User-Agent string. If empty the Chromium product version will be used. If // User-Agent string. If empty the Chromium product version will be used. If
// |userAgent| is specified this value will be ignored. Also configurable // |userAgent| is specified this value will be ignored. Also configurable
// using the "product-version" command-line switch. // using the "user-agent-product" command-line switch.
/// ///
cef_string_t product_version; cef_string_t user_agent_product;
/// ///
// The locale string that will be passed to WebKit. If empty the default // The locale string that will be passed to WebKit. If empty the default

View File

@ -548,7 +548,7 @@ struct CefSettingsTraits {
cef_string_clear(&s->root_cache_path); cef_string_clear(&s->root_cache_path);
cef_string_clear(&s->user_data_path); cef_string_clear(&s->user_data_path);
cef_string_clear(&s->user_agent); cef_string_clear(&s->user_agent);
cef_string_clear(&s->product_version); cef_string_clear(&s->user_agent_product);
cef_string_clear(&s->locale); cef_string_clear(&s->locale);
cef_string_clear(&s->log_file); cef_string_clear(&s->log_file);
cef_string_clear(&s->javascript_flags); cef_string_clear(&s->javascript_flags);
@ -587,8 +587,8 @@ struct CefSettingsTraits {
cef_string_set(src->user_agent.str, src->user_agent.length, cef_string_set(src->user_agent.str, src->user_agent.length,
&target->user_agent, copy); &target->user_agent, copy);
cef_string_set(src->product_version.str, src->product_version.length, cef_string_set(src->user_agent_product.str, src->user_agent_product.length,
&target->product_version, copy); &target->user_agent_product, copy);
cef_string_set(src->locale.str, src->locale.length, &target->locale, copy); cef_string_set(src->locale.str, src->locale.length, &target->locale, copy);
cef_string_set(src->log_file.str, src->log_file.length, &target->log_file, cef_string_set(src->log_file.str, src->log_file.length, &target->log_file,

View File

@ -695,9 +695,9 @@ void AlloyContentBrowserClient::AppendExtraCommandLineSwitches(
switches::kLocalesDirPath, switches::kLocalesDirPath,
switches::kLogFile, switches::kLogFile,
switches::kLogSeverity, switches::kLogSeverity,
switches::kProductVersion,
switches::kResourcesDirPath, switches::kResourcesDirPath,
embedder_support::kUserAgent, embedder_support::kUserAgent,
switches::kUserAgentProductAndVersion,
}; };
command_line->CopySwitchesFrom(*browser_cmd, kSwitchNames, command_line->CopySwitchesFrom(*browser_cmd, kSwitchNames,
base::size(kSwitchNames)); base::size(kSwitchNames));

View File

@ -91,6 +91,16 @@ void ChromeContentBrowserClientCef::AppendExtraCommandLineSwitches(
const base::CommandLine* browser_cmd = base::CommandLine::ForCurrentProcess(); const base::CommandLine* browser_cmd = base::CommandLine::ForCurrentProcess();
{
// Propagate the following switches to all command lines (along with any
// associated values) if present in the browser command line.
static const char* const kSwitchNames[] = {
switches::kUserAgentProductAndVersion,
};
command_line->CopySwitchesFrom(*browser_cmd, kSwitchNames,
base::size(kSwitchNames));
}
const std::string& process_type = const std::string& process_type =
command_line->GetSwitchValueASCII(switches::kProcessType); command_line->GetSwitchValueASCII(switches::kProcessType);
if (process_type == switches::kRendererProcess) { if (process_type == switches::kRendererProcess) {

View File

@ -150,9 +150,10 @@ bool AlloyMainDelegate::BasicStartupComplete(int* exit_code) {
if (settings_->user_agent.length > 0) { if (settings_->user_agent.length > 0) {
command_line->AppendSwitchASCII(embedder_support::kUserAgent, command_line->AppendSwitchASCII(embedder_support::kUserAgent,
CefString(&settings_->user_agent)); CefString(&settings_->user_agent));
} else if (settings_->product_version.length > 0) { } else if (settings_->user_agent_product.length > 0) {
command_line->AppendSwitchASCII(switches::kProductVersion, command_line->AppendSwitchASCII(
CefString(&settings_->product_version)); switches::kUserAgentProductAndVersion,
CefString(&settings_->user_agent_product));
} }
if (settings_->locale.length > 0) { if (settings_->locale.length > 0) {

View File

@ -126,6 +126,9 @@ const char kEnableChromeRuntime[] = "enable-chrome-runtime";
// using the Chrome runtime. // using the Chrome runtime.
const char kDisableChromeLoginPrompt[] = "disable-chrome-login-prompt"; const char kDisableChromeLoginPrompt[] = "disable-chrome-login-prompt";
// Override the product component of the default User-Agent string.
const char kUserAgentProductAndVersion[] = "user-agent-product";
#if defined(OS_MAC) #if defined(OS_MAC)
// Path to the framework directory. // Path to the framework directory.
const char kFrameworkDirPath[] = "framework-dir-path"; const char kFrameworkDirPath[] = "framework-dir-path";

View File

@ -55,6 +55,7 @@ extern const char kDisableNewBrowserInfoTimeout[];
extern const char kDevToolsProtocolLogFile[]; extern const char kDevToolsProtocolLogFile[];
extern const char kEnableChromeRuntime[]; extern const char kEnableChromeRuntime[];
extern const char kDisableChromeLoginPrompt[]; extern const char kDisableChromeLoginPrompt[];
extern const char kUserAgentProductAndVersion[];
#if defined(OS_MAC) #if defined(OS_MAC)
extern const char kFrameworkDirPath[]; extern const char kFrameworkDirPath[];

View File

@ -16,8 +16,10 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "components/embedder_support/switches.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "sandbox/policy/switches.h" #include "sandbox/policy/switches.h"
#include "ui/base/ui_base_switches.h"
#if defined(OS_MAC) #if defined(OS_MAC)
#include "libcef/common/util_mac.h" #include "libcef/common/util_mac.h"
@ -79,6 +81,22 @@ bool ChromeMainDelegateCef::BasicStartupComplete(int* exit_code) {
command_line->AppendSwitch(sandbox::policy::switches::kNoSandbox); command_line->AppendSwitch(sandbox::policy::switches::kNoSandbox);
} }
if (settings_->user_agent.length > 0) {
command_line->AppendSwitchASCII(embedder_support::kUserAgent,
CefString(&settings_->user_agent));
} else if (settings_->user_agent_product.length > 0) {
command_line->AppendSwitchASCII(
switches::kUserAgentProductAndVersion,
CefString(&settings_->user_agent_product));
}
if (settings_->locale.length > 0) {
command_line->AppendSwitchASCII(switches::kLang,
CefString(&settings_->locale));
} else if (!command_line->HasSwitch(switches::kLang)) {
command_line->AppendSwitchASCII(switches::kLang, "en-US");
}
if (settings_->javascript_flags.length > 0) { if (settings_->javascript_flags.length > 0) {
command_line->AppendSwitchASCII(switches::kJavaScriptFlags, command_line->AppendSwitchASCII(switches::kJavaScriptFlags,
CefString(&settings_->javascript_flags)); CefString(&settings_->javascript_flags));

View File

@ -1,22 +1,24 @@
diff --git components/embedder_support/user_agent_utils.cc components/embedder_support/user_agent_utils.cc diff --git components/embedder_support/user_agent_utils.cc components/embedder_support/user_agent_utils.cc
index 569518f209aeb..a4944e7060570 100644 index 569518f209aeb..0cf7c2cc23c43 100644
--- components/embedder_support/user_agent_utils.cc --- components/embedder_support/user_agent_utils.cc
+++ components/embedder_support/user_agent_utils.cc +++ components/embedder_support/user_agent_utils.cc
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/strings/strcat.h" #include "base/strings/strcat.h"
#include "build/branding_buildflags.h" #include "build/branding_buildflags.h"
+#include "chrome/common/chrome_switches.h" +#include "cef/libcef/common/cef_switches.h"
#include "components/embedder_support/switches.h" #include "components/embedder_support/switches.h"
#include "components/version_info/version_info.h" #include "components/version_info/version_info.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
@@ -20,6 +21,10 @@ @@ -20,6 +21,12 @@
namespace embedder_support { namespace embedder_support {
std::string GetProduct() { std::string GetProduct() {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kProductVersion)) + if (command_line->HasSwitch(switches::kUserAgentProductAndVersion)) {
+ return command_line->GetSwitchValueASCII(switches::kProductVersion); + return command_line->GetSwitchValueASCII(
+ switches::kUserAgentProductAndVersion);
+ }
+ +
return version_info::GetProductNameAndVersionForUserAgent(); return version_info::GetProductNameAndVersionForUserAgent();
} }