Index: components/password_manager/core/browser/affiliation_fetcher.cc |
diff --git a/components/password_manager/core/browser/affiliation_fetcher.cc b/components/password_manager/core/browser/affiliation_fetcher.cc |
index 9e6bfd04405dc9131fa047266d1e2592215140a7..53069fa9fbaa3689b43aa367574dfdaf207db405 100644 |
--- a/components/password_manager/core/browser/affiliation_fetcher.cc |
+++ b/components/password_manager/core/browser/affiliation_fetcher.cc |
@@ -4,6 +4,8 @@ |
#include "components/password_manager/core/browser/affiliation_fetcher.h" |
+#include "base/metrics/histogram_macros.h" |
+#include "base/metrics/sparse_histogram.h" |
#include "components/password_manager/core/browser/affiliation_api.pb.h" |
#include "components/password_manager/core/browser/affiliation_utils.h" |
#include "components/password_manager/core/browser/test_affiliation_fetcher_factory.h" |
@@ -17,6 +19,37 @@ |
namespace password_manager { |
+namespace { |
+ |
+// Enumeration listing the possible outcomes of fetching affiliation information |
+// from the Affiliation API. This is used in UMA histograms, so do not change |
+// existing values, only add new values at the end. |
+enum AffiliationFetchResult { |
+ AFFILIATION_FETCH_RESULT_SUCCESS, |
+ AFFILIATION_FETCH_RESULT_FAILURE, |
+ AFFILIATION_FETCH_RESULT_MALFORMED, |
+ AFFILIATION_FETCH_RESULT_MAX |
+}; |
+ |
+// Records the given fetch |result| into the respective UMA histogram, as well |
+// as the response and error codes of |fetcher| if it is non-null. |
+void ReportStatistics(AffiliationFetchResult result, |
+ const net::URLFetcher* fetcher) { |
+ UMA_HISTOGRAM_ENUMERATION("PasswordManager.AffiliationFetcher.FetchResult", |
+ result, AFFILIATION_FETCH_RESULT_MAX); |
+ if (fetcher) { |
+ UMA_HISTOGRAM_SPARSE_SLOWLY( |
+ "PasswordManager.AffiliationFetcher.FetchHttpResponseCode", |
+ fetcher->GetResponseCode()); |
+ // Network error codes are negative. See: src/net/base/net_error_list.h. |
+ UMA_HISTOGRAM_SPARSE_SLOWLY( |
+ "PasswordManager.AffiliationFetcher.FetchErrorCode", |
+ -fetcher->GetStatus().error()); |
+ } |
+} |
+ |
+} // namespace |
+ |
static TestAffiliationFetcherFactory* g_testing_factory = nullptr; |
AffiliationFetcher::AffiliationFetcher( |
@@ -161,15 +194,21 @@ bool AffiliationFetcher::ParseResponse( |
void AffiliationFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
DCHECK_EQ(source, fetcher_.get()); |
- scoped_ptr<AffiliationFetcherDelegate::Result> result( |
+ // Note that invoking the |delegate_| may destroy |this| synchronously, so the |
+ // invocation must happen last. |
+ scoped_ptr<AffiliationFetcherDelegate::Result> result_data( |
new AffiliationFetcherDelegate::Result); |
if (fetcher_->GetStatus().status() == net::URLRequestStatus::SUCCESS && |
fetcher_->GetResponseCode() == net::HTTP_OK) { |
- if (ParseResponse(result.get())) |
- delegate_->OnFetchSucceeded(result.Pass()); |
- else |
+ if (ParseResponse(result_data.get())) { |
+ ReportStatistics(AFFILIATION_FETCH_RESULT_SUCCESS, nullptr); |
+ delegate_->OnFetchSucceeded(result_data.Pass()); |
+ } else { |
+ ReportStatistics(AFFILIATION_FETCH_RESULT_MALFORMED, nullptr); |
delegate_->OnMalformedResponse(); |
+ } |
} else { |
+ ReportStatistics(AFFILIATION_FETCH_RESULT_FAILURE, fetcher_.get()); |
delegate_->OnFetchFailed(); |
} |
} |