Fix command-line override of the User-Agent product component (see issue #2622).

When the NetworkService is enabled the U-A string is configured via
SystemNetworkContextManager::CreateDefaultNetworkContextParams, which calls
chrome_content_browser_client.cc GetUserAgent(). This change modifies the Chrome
implementation to match CEF, so that the U-A product component can still be
overridden via the `--product-version` command-line flag.

To test: Verify that chrome://version, navigator.userAgent (JS executed from
DevTools console) and network requests (headers shown in DevTools Network tab)
show the expected User-Agent value in the following cases:
- Running `cefclient --enable-network-service --user-agent="<value>"`
- Running `cefclient --enable-network-service --product-version="<value>"`
This commit is contained in:
Marshall Greenblatt 2019-05-02 14:06:48 -04:00
parent b1018ad64b
commit 4592cba19f
3 changed files with 51 additions and 15 deletions

View File

@ -56,6 +56,7 @@
#include "base/threading/thread_restrictions.h" #include "base/threading/thread_restrictions.h"
#include "cef/grit/cef_resources.h" #include "cef/grit/cef_resources.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/chrome_service.h" #include "chrome/browser/chrome_service.h"
#include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/plugins/plugin_info_host_impl.h" #include "chrome/browser/plugins/plugin_info_host_impl.h"
@ -1371,27 +1372,19 @@ bool CefContentBrowserClient::HandleExternalProtocol(
} }
std::string CefContentBrowserClient::GetProduct() const { std::string CefContentBrowserClient::GetProduct() const {
const base::CommandLine* command_line = // Match the logic in chrome_content_browser_client.cc GetProduct() which
base::CommandLine::ForCurrentProcess(); // will be called when the NetworkService is enabled.
if (command_line->HasSwitch(switches::kProductVersion)) return ::GetProduct();
return command_line->GetSwitchValueASCII(switches::kProductVersion);
return GetChromeProduct();
} }
std::string CefContentBrowserClient::GetChromeProduct() const { std::string CefContentBrowserClient::GetChromeProduct() const {
return base::StringPrintf("Chrome/%d.%d.%d.%d", CHROME_VERSION_MAJOR, return version_info::GetProductNameAndVersionForUserAgent();
CHROME_VERSION_MINOR, CHROME_VERSION_BUILD,
CHROME_VERSION_PATCH);
} }
std::string CefContentBrowserClient::GetUserAgent() const { std::string CefContentBrowserClient::GetUserAgent() const {
const base::CommandLine* command_line = // Match the logic in chrome_content_browser_client.cc GetUserAgent() which
base::CommandLine::ForCurrentProcess(); // will be called when the NetworkService is enabled.
if (command_line->HasSwitch(switches::kUserAgent)) return ::GetUserAgent();
return command_line->GetSwitchValueASCII(switches::kUserAgent);
return content::BuildUserAgentFromProduct(GetProduct());
} }
blink::UserAgentMetadata CefContentBrowserClient::GetUserAgentMetadata() const { blink::UserAgentMetadata CefContentBrowserClient::GetUserAgentMetadata() const {

View File

@ -244,6 +244,12 @@ patches = [
# https://bitbucket.org/chromiumembedded/cef/issues/2613 # https://bitbucket.org/chromiumembedded/cef/issues/2613
'name': 'chrome_browser_net_export', 'name': 'chrome_browser_net_export',
}, },
{
# Support override of the User-Agent product component when NetworkService
# is enabled.
# https://bitbucket.org/chromiumembedded/cef/issues/2622
'name': 'chrome_browser_product_override',
},
{ {
# Allow CEF to share Chrome plugin loading code. # Allow CEF to share Chrome plugin loading code.
'name': 'chrome_plugins', 'name': 'chrome_plugins',

View File

@ -0,0 +1,37 @@
diff --git chrome/browser/chrome_content_browser_client.cc chrome/browser/chrome_content_browser_client.cc
index 52a1a31ee131..5a1e29fec9c8 100644
--- chrome/browser/chrome_content_browser_client.cc
+++ chrome/browser/chrome_content_browser_client.cc
@@ -1033,12 +1033,16 @@ void LaunchURL(
}
}
+} // namespace
+
std::string GetProduct() {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kProductVersion))
+ return command_line->GetSwitchValueASCII(switches::kProductVersion);
+
return version_info::GetProductNameAndVersionForUserAgent();
}
-} // namespace
-
std::string GetUserAgent() {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(switches::kUserAgent)) {
diff --git chrome/browser/chrome_content_browser_client.h chrome/browser/chrome_content_browser_client.h
index cbf1e2218e91..a42d2a4d71bb 100644
--- chrome/browser/chrome_content_browser_client.h
+++ chrome/browser/chrome_content_browser_client.h
@@ -77,7 +77,8 @@ class Origin;
class ChromeSerialDelegate;
-// Returns the user agent of Chrome.
+// Returns the product and user agent of Chrome.
+std::string GetProduct();
std::string GetUserAgent();
blink::UserAgentMetadata GetUserAgentMetadata();