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..f29f82cf0f47d9ab1281c565ec9bf4dd56c414c4 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" |
@@ -111,10 +113,12 @@ ChromeNetworkDelegate::ChromeNetworkDelegate( |
const policy::URLBlacklistManager* url_blacklist_manager, |
void* profile, |
CookieSettings* cookie_settings, |
+ bool is_incognito, |
BooleanPrefMember* enable_referrers) |
: event_router_(event_router), |
profile_(profile), |
cookie_settings_(cookie_settings), |
+ is_incognito_(is_incognito), |
extension_info_map_(extension_info_map), |
enable_referrers_(enable_referrers), |
url_blacklist_manager_(url_blacklist_manager) { |
@@ -165,6 +169,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 +312,25 @@ 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 Off The Record profiles. |
Ilya Sherman
2012/04/17 20:55:39
nit: s/Off The Record/Incognito
SteveT
2012/04/19 18:38:01
Done.
|
+ // 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_ && !is_incognito_ && |
+ MetricsServiceHelper::IsMetricsReportingEnabled()) { |
battre
2012/04/17 20:33:02
Here we still have a threading problem. The Metric
SteveT
2012/04/17 23:26:44
Ah, yes. I see that we do something similar with t
Ilya Sherman
2012/04/17 23:33:13
I think it's probably ok to use a PrefMember, and
battre
2012/04/18 17:05:05
We could probably also put the PrefMember in Metri
SteveT
2012/04/19 18:38:01
Turns out letting the PrefMember live in ProfileIO
|
+ headers->SetHeader("X-Chrome-UMA-Enabled", "1"); |
+ } |
+} |