Add histograms for HTTP authentication token generation times.

BUG=None
TEST=None

Review URL: http://codereview.chromium.org/2838018

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51357 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/http/http_auth_handler.cc b/net/http/http_auth_handler.cc
index a1e6c39..207232b 100644
--- a/net/http/http_auth_handler.cc
+++ b/net/http/http_auth_handler.cc
@@ -4,7 +4,9 @@
 
 #include "net/http/http_auth_handler.h"
 
+#include "base/histogram.h"
 #include "base/logging.h"
+#include "base/string_util.h"
 #include "net/base/net_errors.h"
 
 namespace net {
@@ -19,6 +21,15 @@
               this, &HttpAuthHandler::OnGenerateAuthTokenComplete)) {
 }
 
+HttpAuthHandler::~HttpAuthHandler() {
+}
+
+//static
+std::string HttpAuthHandler::GenerateHistogramNameFromScheme(
+    const std::string& scheme) {
+  return StringPrintf("Net.AuthGenerateToken_%s", scheme.c_str());
+}
+
 bool HttpAuthHandler::InitFromChallenge(
     HttpAuth::ChallengeTokenizer* challenge,
     HttpAuth::Target target,
@@ -39,6 +50,13 @@
   DCHECK(!ok || score_ != -1);
   DCHECK(!ok || properties_ != -1);
 
+  if (ok)
+    histogram_ = Histogram::FactoryTimeGet(
+        GenerateHistogramNameFromScheme(scheme()),
+        base::TimeDelta::FromMilliseconds(1),
+        base::TimeDelta::FromSeconds(10), 50,
+        Histogram::kUmaTargetedHistogramFlag);
+
   return ok;
 }
 
@@ -69,8 +87,10 @@
   DCHECK(username != NULL || AllowsDefaultCredentials());
   DCHECK(auth_token != NULL);
   DCHECK(original_callback_ == NULL);
+  DCHECK(histogram_.get());
   original_callback_ = callback;
   net_log_.BeginEvent(EventTypeFromAuthTarget(target_), NULL);
+  generate_auth_token_start_ =  base::TimeTicks::Now();
   int rv = GenerateAuthTokenImpl(username, password, request,
                                  &wrapper_callback_, auth_token);
   if (rv != ERR_IO_PENDING)
@@ -86,6 +106,11 @@
 }
 
 void HttpAuthHandler::FinishGenerateAuthToken() {
+  // TOOD(cbentzel): Should this be done in OK case only?
+  DCHECK(histogram_.get());
+  base::TimeDelta generate_auth_token_duration =
+      base::TimeTicks::Now() - generate_auth_token_start_;
+  histogram_->AddTime(generate_auth_token_duration);
   net_log_.EndEvent(EventTypeFromAuthTarget(target_), NULL);
   original_callback_ = NULL;
 }