| Index: chrome/browser/net/chrome_network_delegate.cc
|
| diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
|
| index 545d127b789df21079f0aeae4a5142900d437290..858399e64daa667d1ab40f36eb289bbbb0f06370 100644
|
| --- a/chrome/browser/net/chrome_network_delegate.cc
|
| +++ b/chrome/browser/net/chrome_network_delegate.cc
|
| @@ -14,6 +14,8 @@
|
| #include "chrome/browser/extensions/extension_event_router_forwarder.h"
|
| #include "chrome/browser/extensions/extension_info_map.h"
|
| #include "chrome/browser/extensions/extension_process_manager.h"
|
| +#include "chrome/browser/google/google_util.h"
|
| +#include "chrome/browser/metrics/metrics_service.h"
|
| #include "chrome/browser/prefs/pref_member.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/browser/task_manager/task_manager.h"
|
| @@ -103,6 +105,16 @@ void ForwardRequestStatus(
|
| }
|
| }
|
|
|
| +// Prepare a PrefMember for ChromeNetworkDelegate's use by initializing it with
|
| +// a desired pref and moving it to the IO thread.
|
| +void InitializePrefMember(BooleanPrefMember* pref_member,
|
| + PrefService* pref_service,
|
| + const char* pref_name) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + pref_member->Init(pref_name, pref_service, NULL);
|
| + pref_member->MoveToThread(BrowserThread::IO);
|
| +}
|
| +
|
| } // namespace
|
|
|
| ChromeNetworkDelegate::ChromeNetworkDelegate(
|
| @@ -111,12 +123,16 @@ ChromeNetworkDelegate::ChromeNetworkDelegate(
|
| const policy::URLBlacklistManager* url_blacklist_manager,
|
| void* profile,
|
| CookieSettings* cookie_settings,
|
| - BooleanPrefMember* enable_referrers)
|
| + IncognitoState incognito_state,
|
| + BooleanPrefMember* enable_referrers,
|
| + BooleanPrefMember* enable_metrics)
|
| : event_router_(event_router),
|
| profile_(profile),
|
| cookie_settings_(cookie_settings),
|
| + incognito_state_(incognito_state),
|
| extension_info_map_(extension_info_map),
|
| enable_referrers_(enable_referrers),
|
| + enable_metrics_(enable_metrics),
|
| url_blacklist_manager_(url_blacklist_manager) {
|
| DCHECK(event_router);
|
| DCHECK(enable_referrers);
|
| @@ -129,9 +145,15 @@ ChromeNetworkDelegate::~ChromeNetworkDelegate() {}
|
| void ChromeNetworkDelegate::InitializeReferrersEnabled(
|
| BooleanPrefMember* enable_referrers,
|
| PrefService* pref_service) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - enable_referrers->Init(prefs::kEnableReferrers, pref_service, NULL);
|
| - enable_referrers->MoveToThread(BrowserThread::IO);
|
| + InitializePrefMember(enable_referrers, pref_service, prefs::kEnableReferrers);
|
| +}
|
| +
|
| +// static
|
| +void ChromeNetworkDelegate::InitializeMetricsEnabled(
|
| + BooleanPrefMember* enable_metrics,
|
| + PrefService* pref_service) {
|
| + InitializePrefMember(enable_metrics, pref_service,
|
| + prefs::kMetricsReportingEnabled);
|
| }
|
|
|
| int ChromeNetworkDelegate::OnBeforeURLRequest(
|
| @@ -165,6 +187,10 @@ int ChromeNetworkDelegate::OnBeforeSendHeaders(
|
| net::URLRequest* request,
|
| const net::CompletionCallback& callback,
|
| net::HttpRequestHeaders* headers) {
|
| + // Attach any applicable Chrome metrics headers. This is a best-effort attempt
|
| + // where failure will not cause OnBeforeSendHeaders to back out.
|
| + AddChromeMetricsStateHeader(request, headers);
|
| +
|
| return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders(
|
| profile_, extension_info_map_.get(), request, callback, headers);
|
| }
|
| @@ -304,3 +330,26 @@ bool ChromeNetworkDelegate::CanSetCookie(
|
|
|
| return allow;
|
| }
|
| +
|
| +void ChromeNetworkDelegate::AddChromeMetricsStateHeader(
|
| + net::URLRequest* request,
|
| + net::HttpRequestHeaders* headers) {
|
| + // Note our criteria for attaching Chrome experiment headers:
|
| + // 1. We only transmit to *.google.<TLD> domains. NOTE that this use of
|
| + // google_util helpers to check this does not guarantee that the URL is
|
| + // Google-owned, only that it is of the form *.google.<TLD>. In the future
|
| + // we may choose to reinforce this check.
|
| + // 2. We must verify that we are transmitting for a profile network context
|
| + // and not the system context. We do this by checking |profile_|, as it is
|
| + // NULL when we're in the system context.
|
| + // 3. We only transmit for non-Incognito profiles. Ensure that the pref has
|
| + // been passed in and is true.
|
| + // 4. For the X-Chrome-UMA-Enabled bit, we only set it if UMA is in fact
|
| + // enabled for this install of Chrome.
|
| + if (google_util::IsGoogleDomainUrl(request->url().spec(),
|
| + google_util::ALLOW_SUBDOMAIN) &&
|
| + profile_ && incognito_state_ == INCOGNITO_OFF && enable_metrics_ &&
|
| + enable_metrics_->GetValue()) {
|
| + headers->SetHeader("X-Chrome-UMA-Enabled", "1");
|
| + }
|
| +}
|
|
|