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..45b404d17dcde5e13efde692906d62b101adcdce 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) |
+ BrowserVisibility visibility, |
+ BooleanPrefMember* enable_referrers, |
+ BooleanPrefMember* enable_metrics) |
: event_router_(event_router), |
profile_(profile), |
cookie_settings_(cookie_settings), |
+ visibility_(visibility), |
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_ && visibility_ == NORMAL && enable_metrics_ && |
+ enable_metrics_->GetValue()) { |
+ headers->SetHeader("X-Chrome-UMA-Enabled", "1"); |
+ } |
+} |