Index: chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
index fb6e707047efaab34e74c40a4005edac0bfc58d2..ecc8b37564d8ff6e7e34aa800e39b365c4379d77 100644 |
--- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
+++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
@@ -9,6 +9,7 @@ |
#include "base/base64.h" |
#include "base/logging.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/chrome_metrics_helper.h" |
#include "chrome/browser/content_settings/host_content_settings_map.h" |
#include "chrome/browser/download/download_request_limiter.h" |
#include "chrome/browser/download/download_resource_throttle.h" |
@@ -30,8 +31,6 @@ |
#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/extensions/extension_constants.h" |
#include "chrome/common/extensions/user_script.h" |
-#include "chrome/common/metrics/variations/variations_util.h" |
-#include "chrome/common/metrics/proto/chrome_experiments.pb.h" |
#include "chrome/common/render_messages.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_service.h" |
@@ -87,8 +86,7 @@ ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate( |
: download_request_limiter_(g_browser_process->download_request_limiter()), |
safe_browsing_(g_browser_process->safe_browsing_service()), |
user_script_listener_(new extensions::UserScriptListener()), |
- prerender_tracker_(prerender_tracker), |
- variation_ids_cache_initialized_(false) { |
+ prerender_tracker_(prerender_tracker) { |
} |
ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() { |
@@ -164,7 +162,19 @@ void ChromeResourceDispatcherHostDelegate::RequestBeginning( |
} |
#endif |
- AppendChromeMetricsHeaders(request, resource_context, resource_type); |
+ // Don't attempt to append headers to requests that have already started. |
+ // TODO(stevet): Remove this once the request ordering issues are resolved |
+ // in crbug.com/128048. |
+ if (!request->is_pending()) { |
+ net::HttpRequestHeaders headers; |
+ headers.CopyFrom(request->extra_request_headers()); |
+ ProfileIOData* io_data = ProfileIOData::FromResourceContext( |
+ resource_context); |
+ ChromeMetricsHelper::GetInstance()->AppendHeaders( |
+ request->url(), io_data->is_incognito(), |
+ io_data->GetMetricsEnabledStateOnIOThread(), &headers); |
+ request->SetExtraRequestHeaders(headers); |
+ } |
#if defined(ENABLE_ONE_CLICK_SIGNIN) |
AppendChromeSyncGaiaHeader(request, resource_context); |
@@ -312,45 +322,6 @@ void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles( |
throttles->push_back(throttle); |
} |
-void ChromeResourceDispatcherHostDelegate::AppendChromeMetricsHeaders( |
- net::URLRequest* request, |
- content::ResourceContext* resource_context, |
- ResourceType::Type resource_type) { |
- // Don't attempt to append headers to requests that have already started. |
- // TODO(stevet): Remove this once the request ordering issues are resolved |
- // in crbug.com/128048. |
- if (request->is_pending()) |
- return; |
- |
- // Note the 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. Only transmit for non-Incognito profiles. |
- // 3. For the X-Chrome-UMA-Enabled bit, only set it if UMA is in fact enabled |
- // for this install of Chrome. |
- // 4. For the X-Chrome-Variations, only include non-empty variation IDs. |
- ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); |
- if (io_data->is_incognito() || |
- !google_util::IsGoogleDomainUrl(request->url().spec(), |
- google_util::ALLOW_SUBDOMAIN, |
- google_util::ALLOW_NON_STANDARD_PORTS)) |
- return; |
- |
- if (io_data->GetMetricsEnabledStateOnIOThread()) |
- request->SetExtraRequestHeaderByName("X-Chrome-UMA-Enabled", "1", false); |
- |
- // Lazily initialize the header, if not already done, before attempting to |
- // transmit it. |
- InitVariationIDsCacheIfNeeded(); |
- if (!variation_ids_header_.empty()) { |
- request->SetExtraRequestHeaderByName("X-Chrome-Variations", |
- variation_ids_header_, |
- false); |
- } |
-} |
- |
#if defined(ENABLE_ONE_CLICK_SIGNIN) |
void ChromeResourceDispatcherHostDelegate::AppendChromeSyncGaiaHeader( |
net::URLRequest* request, |
@@ -458,76 +429,3 @@ void ChromeResourceDispatcherHostDelegate::OnRequestRedirected( |
redirect_url, request); |
} |
} |
- |
-void ChromeResourceDispatcherHostDelegate::OnFieldTrialGroupFinalized( |
- const std::string& trial_name, |
- const std::string& group_name) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- chrome_variations::VariationID new_id = |
- chrome_variations::GetGoogleVariationID( |
- chrome_variations::GOOGLE_WEB_PROPERTIES, trial_name, group_name); |
- if (new_id == chrome_variations::kEmptyID) |
- return; |
- variation_ids_set_.insert(new_id); |
- UpdateVariationIDsHeaderValue(); |
-} |
- |
-void ChromeResourceDispatcherHostDelegate::InitVariationIDsCacheIfNeeded() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- if (variation_ids_cache_initialized_) |
- return; |
- |
- // Register for additional cache updates. This is done first to avoid a race |
- // that could cause registered FieldTrials to be missed. |
- base::FieldTrialList::AddObserver(this); |
- |
- base::FieldTrial::ActiveGroups initial_groups; |
- base::FieldTrialList::GetActiveFieldTrialGroups(&initial_groups); |
- for (base::FieldTrial::ActiveGroups::const_iterator it = |
- initial_groups.begin(); it != initial_groups.end(); ++it) { |
- const chrome_variations::VariationID id = |
- chrome_variations::GetGoogleVariationID( |
- chrome_variations::GOOGLE_WEB_PROPERTIES, it->trial_name, |
- it->group_name); |
- if (id != chrome_variations::kEmptyID) |
- variation_ids_set_.insert(id); |
- } |
- UpdateVariationIDsHeaderValue(); |
- |
- variation_ids_cache_initialized_ = true; |
-} |
- |
-void ChromeResourceDispatcherHostDelegate::UpdateVariationIDsHeaderValue() { |
- // The header value is a serialized protobuffer of Variation IDs which is |
- // base64 encoded before transmitting as a string. |
- if (variation_ids_set_.empty()) |
- return; |
- |
- // This is the bottleneck for the creation of the header, so validate the size |
- // here. Force a hard maximum on the ID count in case the Variations server |
- // returns too many IDs and DOSs receiving servers with large requests. |
- DCHECK_LE(variation_ids_set_.size(), 10U); |
- if (variation_ids_set_.size() > 20) { |
- variation_ids_header_.clear(); |
- return; |
- } |
- |
- metrics::ChromeVariations proto; |
- for (std::set<chrome_variations::VariationID>::const_iterator it = |
- variation_ids_set_.begin(); it != variation_ids_set_.end(); ++it) |
- proto.add_variation_id(*it); |
- |
- std::string serialized; |
- proto.SerializeToString(&serialized); |
- |
- std::string hashed; |
- if (base::Base64Encode(serialized, &hashed)) { |
- // If successful, swap the header value with the new one. |
- // Note that the list of IDs and the header could be temporarily out of sync |
- // if IDs are added as the header is recreated. The receiving servers are OK |
- // with such descrepancies. |
- variation_ids_header_ = hashed; |
- } else { |
- DVLOG(1) << "Failed to base64 encode Variation IDs value: " << serialized; |
- } |
-} |