OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/autofill/core/browser/autofill_metrics.h" | 5 #include "components/autofill/core/browser/autofill_metrics.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> |
8 | 9 |
9 #include "base/logging.h" | 10 #include "base/logging.h" |
10 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
11 #include "base/metrics/sparse_histogram.h" | 12 #include "base/metrics/sparse_histogram.h" |
12 #include "base/metrics/user_metrics.h" | 13 #include "base/metrics/user_metrics.h" |
13 #include "base/time/time.h" | 14 #include "base/time/time.h" |
14 #include "components/autofill/core/browser/autofill_experiments.h" | 15 #include "components/autofill/core/browser/autofill_experiments.h" |
15 #include "components/autofill/core/browser/autofill_type.h" | 16 #include "components/autofill/core/browser/autofill_type.h" |
16 #include "components/autofill/core/browser/form_structure.h" | 17 #include "components/autofill/core/browser/form_structure.h" |
17 #include "components/autofill/core/common/form_data.h" | 18 #include "components/autofill/core/common/form_data.h" |
18 #include "components/ukm/ukm_entry_builder.h" | 19 #include "components/ukm/ukm_entry_builder.h" |
19 | 20 |
20 namespace internal { | 21 namespace internal { |
21 const char kUKMCardUploadDecisionEntryName[] = "Autofill.CardUploadDecision"; | 22 const char kUKMCardUploadDecisionEntryName[] = "Autofill.CardUploadDecision"; |
22 const char kUKMCardUploadDecisionMetricName[] = "UploadDecision"; | 23 const char kUKMCardUploadDecisionMetricName[] = "UploadDecision"; |
23 const char kUKMDeveloperEngagementEntryName[] = "Autofill.DeveloperEngagement"; | 24 const char kUKMDeveloperEngagementEntryName[] = "Autofill.DeveloperEngagement"; |
24 const char kUKMDeveloperEngagementMetricName[] = "DeveloperEngagement"; | 25 const char kUKMDeveloperEngagementMetricName[] = "DeveloperEngagement"; |
| 26 const char kUKMFormInteractionsEntryName[] = "Autofill.FormInteractions"; |
| 27 const char kUKMFormInteractionsAutofillFormSubmittedStateMetricName[] = |
| 28 "AutofillFormSubmittedState"; |
| 29 const char kUKMFormInteractionsUserHappinessMetricMetricName[] = |
| 30 "UserHappinessMetric"; |
| 31 const char kUKMFormInteractionsAddressFormEventMetricName[] = |
| 32 "FormEvent.Address"; |
| 33 const char kUKMFormInteractionsCreditCardFormEventMetricName[] = |
| 34 "FormEvent.CreditCard"; |
| 35 const char kUKMFormInteractionsUnmaskPromptEventMetricName[] = |
| 36 "UnmaskPromptEvent"; |
25 } // namespace internal | 37 } // namespace internal |
26 | 38 |
27 namespace autofill { | 39 namespace autofill { |
28 | 40 |
29 namespace { | 41 namespace { |
30 | 42 |
31 // Note: if adding an enum value here, update the corresponding description for | 43 // Note: if adding an enum value here, update the corresponding description for |
32 // AutofillTypeQualityByFieldType in histograms.xml. | 44 // AutofillTypeQualityByFieldType in histograms.xml. |
33 enum FieldTypeGroupForMetrics { | 45 enum FieldTypeGroupForMetrics { |
34 GROUP_AMBIGUOUS = 0, | 46 GROUP_AMBIGUOUS = 0, |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 std::unique_ptr<ukm::UkmEntryBuilder> builder = | 750 std::unique_ptr<ukm::UkmEntryBuilder> builder = |
739 ukm_service->GetEntryBuilder(source_id, ukm_entry_name.c_str()); | 751 ukm_service->GetEntryBuilder(source_id, ukm_entry_name.c_str()); |
740 | 752 |
741 for (auto it = metrics.begin(); it != metrics.end(); ++it) { | 753 for (auto it = metrics.begin(); it != metrics.end(); ++it) { |
742 builder->AddMetric(it->first.c_str(), it->second); | 754 builder->AddMetric(it->first.c_str(), it->second); |
743 } | 755 } |
744 | 756 |
745 return true; | 757 return true; |
746 } | 758 } |
747 | 759 |
748 AutofillMetrics::FormEventLogger::FormEventLogger(bool is_for_credit_card) | 760 AutofillMetrics::FormEventLogger::FormEventLogger( |
| 761 bool is_for_credit_card, |
| 762 AutofillMetrics::UkmLogger* ukm_logger) |
749 : is_for_credit_card_(is_for_credit_card), | 763 : is_for_credit_card_(is_for_credit_card), |
750 is_server_data_available_(false), | 764 is_server_data_available_(false), |
751 is_local_data_available_(false), | 765 is_local_data_available_(false), |
752 is_context_secure_(false), | 766 is_context_secure_(false), |
753 has_logged_interacted_(false), | 767 has_logged_interacted_(false), |
754 has_logged_suggestions_shown_(false), | 768 has_logged_suggestions_shown_(false), |
755 has_logged_masked_server_card_suggestion_selected_(false), | 769 has_logged_masked_server_card_suggestion_selected_(false), |
756 has_logged_suggestion_filled_(false), | 770 has_logged_suggestion_filled_(false), |
757 has_logged_will_submit_(false), | 771 has_logged_will_submit_(false), |
758 has_logged_submitted_(false), | 772 has_logged_submitted_(false), |
759 logged_suggestion_filled_was_server_data_(false), | 773 logged_suggestion_filled_was_server_data_(false), |
760 logged_suggestion_filled_was_masked_server_card_(false) {} | 774 logged_suggestion_filled_was_masked_server_card_(false), |
| 775 ukm_logger_(ukm_logger) {} |
761 | 776 |
762 void AutofillMetrics::FormEventLogger::OnDidInteractWithAutofillableForm() { | 777 void AutofillMetrics::FormEventLogger::OnDidInteractWithAutofillableForm() { |
763 if (!has_logged_interacted_) { | 778 if (!has_logged_interacted_) { |
764 has_logged_interacted_ = true; | 779 has_logged_interacted_ = true; |
765 Log(AutofillMetrics::FORM_EVENT_INTERACTED_ONCE); | 780 Log(AutofillMetrics::FORM_EVENT_INTERACTED_ONCE); |
766 } | 781 } |
767 } | 782 } |
768 | 783 |
769 void AutofillMetrics::FormEventLogger::OnDidPollSuggestions( | 784 void AutofillMetrics::FormEventLogger::OnDidPollSuggestions( |
770 const FormFieldData& field) { | 785 const FormFieldData& field) { |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 // segmentation. http://crbug.com/454018 | 954 // segmentation. http://crbug.com/454018 |
940 if (!is_server_data_available_ && !is_local_data_available_) | 955 if (!is_server_data_available_ && !is_local_data_available_) |
941 name += ".WithNoData"; | 956 name += ".WithNoData"; |
942 else if (is_server_data_available_ && !is_local_data_available_) | 957 else if (is_server_data_available_ && !is_local_data_available_) |
943 name += ".WithOnlyServerData"; | 958 name += ".WithOnlyServerData"; |
944 else if (!is_server_data_available_ && is_local_data_available_) | 959 else if (!is_server_data_available_ && is_local_data_available_) |
945 name += ".WithOnlyLocalData"; | 960 name += ".WithOnlyLocalData"; |
946 else | 961 else |
947 name += ".WithBothServerAndLocalData"; | 962 name += ".WithBothServerAndLocalData"; |
948 LogUMAHistogramEnumeration(name, event, NUM_FORM_EVENTS); | 963 LogUMAHistogramEnumeration(name, event, NUM_FORM_EVENTS); |
| 964 |
| 965 if (is_for_credit_card_) |
| 966 ukm_logger_->LogCreditCardFormEvent(event); |
| 967 else |
| 968 ukm_logger_->LogAddressFormEvent(event); |
| 969 } |
| 970 |
| 971 AutofillMetrics::UkmLogger::UkmLogger(ukm::UkmService* ukm_service) |
| 972 : ukm_service_(ukm_service) {} |
| 973 |
| 974 AutofillMetrics::UkmLogger::~UkmLogger() { |
| 975 LogUkm(); |
| 976 } |
| 977 |
| 978 void AutofillMetrics::UkmLogger::LogAutofillFormSubmittedState( |
| 979 const GURL& source_url, |
| 980 AutofillFormSubmittedState state) { |
| 981 if (source_url != url_) { |
| 982 LOG(ERROR) << "source_url=" << source_url << ", url_=" << url_; |
| 983 url_ = source_url; |
| 984 } |
| 985 metrics_.push_back( |
| 986 std::make_pair(AUTOFILL_FORM_SUBMITTED_STATE, static_cast<int>(state))); |
| 987 } |
| 988 |
| 989 void AutofillMetrics::UkmLogger::LogUserHappinessMetric( |
| 990 UserHappinessMetric metric) { |
| 991 metrics_.push_back( |
| 992 std::make_pair(USER_HAPPINESS_METRIC, static_cast<int>(metric))); |
| 993 } |
| 994 |
| 995 void AutofillMetrics::UkmLogger::LogAddressFormEvent(FormEvent event) { |
| 996 metrics_.push_back( |
| 997 std::make_pair(ADDRESS_FORM_EVENT, static_cast<int>(event))); |
| 998 } |
| 999 |
| 1000 void AutofillMetrics::UkmLogger::LogCreditCardFormEvent(FormEvent event) { |
| 1001 metrics_.push_back( |
| 1002 std::make_pair(CREDIT_CARD_FORM_EVENT, static_cast<int>(event))); |
| 1003 } |
| 1004 |
| 1005 void AutofillMetrics::UkmLogger::LogUnmaskPromptEvent(UnmaskPromptEvent event) { |
| 1006 metrics_.push_back( |
| 1007 std::make_pair(UNMASK_PROMPT_EVENT, static_cast<int>(event))); |
| 1008 } |
| 1009 |
| 1010 void AutofillMetrics::UkmLogger::LogUkm() { |
| 1011 if (!IsUkmLoggingEnabled() || !ukm_service_ || !url_.is_valid() || |
| 1012 metrics_.empty()) { |
| 1013 return; |
| 1014 } |
| 1015 |
| 1016 int32_t source_id = ukm_service_->GetNewSourceID(); |
| 1017 ukm_service_->UpdateSourceURL(source_id, url_); |
| 1018 std::unique_ptr<ukm::UkmEntryBuilder> builder = ukm_service_->GetEntryBuilder( |
| 1019 source_id, internal::kUKMFormInteractionsEntryName); |
| 1020 |
| 1021 for (auto it = metrics_.begin(); it != metrics_.end(); ++it) { |
| 1022 const char* metric_name = nullptr; |
| 1023 switch (it->first) { |
| 1024 case AutofillMetrics::UkmLogger::AUTOFILL_FORM_SUBMITTED_STATE: |
| 1025 metric_name = |
| 1026 internal::kUKMFormInteractionsAutofillFormSubmittedStateMetricName; |
| 1027 break; |
| 1028 case AutofillMetrics::UkmLogger::USER_HAPPINESS_METRIC: |
| 1029 metric_name = |
| 1030 internal::kUKMFormInteractionsUserHappinessMetricMetricName; |
| 1031 break; |
| 1032 case AutofillMetrics::UkmLogger::ADDRESS_FORM_EVENT: |
| 1033 metric_name = internal::kUKMFormInteractionsAddressFormEventMetricName; |
| 1034 break; |
| 1035 case AutofillMetrics::UkmLogger::CREDIT_CARD_FORM_EVENT: |
| 1036 metric_name = |
| 1037 internal::kUKMFormInteractionsCreditCardFormEventMetricName; |
| 1038 break; |
| 1039 case AutofillMetrics::UkmLogger::UNMASK_PROMPT_EVENT: |
| 1040 metric_name = internal::kUKMFormInteractionsUnmaskPromptEventMetricName; |
| 1041 break; |
| 1042 default: |
| 1043 NOTREACHED(); |
| 1044 } |
| 1045 builder->AddMetric(metric_name, it->second); |
| 1046 } |
949 } | 1047 } |
950 | 1048 |
951 } // namespace autofill | 1049 } // namespace autofill |
OLD | NEW |