Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(680)

Unified Diff: chrome/browser/net/chrome_network_delegate.cc

Issue 10108026: Transmit a X-Chrome-UMA-Enabled bit to Google domains from clients that have UMA enabled. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: prefmember for metrics enabled Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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");
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698