X-Chrome-Variations refactoring.

Caveats:
 (1) I had to add a lock since both AC and RDH run on different threads
 (2) Because the cache is lazily initialized, it's possible that a few AC requests will run without headers
 (3) SP doesn't have access to ResourceContext and in turn we can't get ProfileIOData, so we can't transmit "UMA is enabled" header
 (4) I used a singleton
 
BUG=163999
TEST=hand tested by adding LOG(INFO) and checking headers sent on autocomplete/search requests
Also, ran tcpdump and observed transmitted headers.

Review URL: https://chromiumcodereview.appspot.com/11522009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173740 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
index db2a9b1..5fae4b5 100644
--- a/chrome/browser/autocomplete/search_provider.cc
+++ b/chrome/browser/autocomplete/search_provider.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/autocomplete/history_url_provider.h"
 #include "chrome/browser/autocomplete/keyword_provider.h"
 #include "chrome/browser/autocomplete/url_prefix.h"
+#include "chrome/browser/chrome_metrics_helper.h"
 #include "chrome/browser/history/history.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history/in_memory_database.h"
@@ -45,6 +46,7 @@
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_util.h"
+#include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
 #include "net/url_request/url_fetcher.h"
 #include "net/url_request/url_request_status.h"
@@ -649,6 +651,11 @@
       net::URLFetcher::Create(id, suggest_url, net::URLFetcher::GET, this);
   fetcher->SetRequestContext(profile_->GetRequestContext());
   fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES);
+  // Add Chrome experiment state to the request headers.
+  net::HttpRequestHeaders headers;
+  ChromeMetricsHelper::GetInstance()->AppendHeaders(
+      fetcher->GetOriginalURL(), profile_->IsOffTheRecord(), false, &headers);
+  fetcher->SetExtraRequestHeaders(headers.ToString());
   fetcher->Start();
   return fetcher;
 }