Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: components/autofill/core/browser/autofill_metrics.cc

Issue 2800853004: UKM that threads together multiple form interaction events. (Closed)
Patch Set: Logs each form interaction event in a separate UkmEntry, includes time_delta as a metric. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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>
9 #include <vector>
8 10
9 #include "base/logging.h" 11 #include "base/logging.h"
10 #include "base/metrics/histogram_macros.h" 12 #include "base/metrics/histogram_macros.h"
11 #include "base/metrics/sparse_histogram.h" 13 #include "base/metrics/sparse_histogram.h"
12 #include "base/metrics/user_metrics.h" 14 #include "base/metrics/user_metrics.h"
13 #include "base/time/time.h" 15 #include "base/time/time.h"
14 #include "components/autofill/core/browser/autofill_experiments.h" 16 #include "components/autofill/core/browser/autofill_experiments.h"
15 #include "components/autofill/core/browser/autofill_type.h" 17 #include "components/autofill/core/browser/autofill_type.h"
16 #include "components/autofill/core/browser/form_structure.h" 18 #include "components/autofill/core/browser/form_structure.h"
17 #include "components/autofill/core/common/form_data.h" 19 #include "components/autofill/core/common/form_data.h"
18 #include "components/ukm/ukm_entry_builder.h" 20 #include "components/ukm/ukm_entry_builder.h"
19 21
20 namespace internal { 22 namespace internal {
21 const char kUKMCardUploadDecisionEntryName[] = "Autofill.CardUploadDecision"; 23 const char kUKMCardUploadDecisionEntryName[] = "Autofill.CardUploadDecision";
22 const char kUKMCardUploadDecisionMetricName[] = "UploadDecision"; 24 const char kUKMCardUploadDecisionMetricName[] = "UploadDecision";
23 const char kUKMDeveloperEngagementEntryName[] = "Autofill.DeveloperEngagement"; 25 const char kUKMDeveloperEngagementEntryName[] = "Autofill.DeveloperEngagement";
24 const char kUKMDeveloperEngagementMetricName[] = "DeveloperEngagement"; 26 const char kUKMDeveloperEngagementMetricName[] = "DeveloperEngagement";
27 const char kUKMAutofillFormSubmittedStateName[] = "AutofillFormSubmittedState";
28 const char kUKMUserHappinessMetricName[] = "UserHappinessMetric";
29 const char kUKMAddressFormEventName[] = "FormEvent.Address";
30 const char kUKMCreditCardFormEventName[] = "FormEvent.CreditCard";
31 const char kUKMUnmaskPromptEventName[] = "UnmaskPromptEvent";
32 const char kUKMMillisecondsSinceFormLoadedMetricName[] =
33 "MillisecondsSinceFormLoaded";
25 } // namespace internal 34 } // namespace internal
26 35
27 namespace autofill { 36 namespace autofill {
28 37
29 namespace { 38 namespace {
30 39
31 // Note: if adding an enum value here, update the corresponding description for 40 // Note: if adding an enum value here, update the corresponding description for
32 // AutofillTypeQualityByFieldType in histograms.xml. 41 // AutofillTypeQualityByFieldType in histograms.xml.
33 enum FieldTypeGroupForMetrics { 42 enum FieldTypeGroupForMetrics {
34 GROUP_AMBIGUOUS = 0, 43 GROUP_AMBIGUOUS = 0,
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 618
610 // static 619 // static
611 void AutofillMetrics::LogProfileActionOnFormSubmitted( 620 void AutofillMetrics::LogProfileActionOnFormSubmitted(
612 AutofillProfileAction action) { 621 AutofillProfileAction action) {
613 UMA_HISTOGRAM_ENUMERATION("Autofill.ProfileActionOnFormSubmitted", action, 622 UMA_HISTOGRAM_ENUMERATION("Autofill.ProfileActionOnFormSubmitted", action,
614 AUTOFILL_PROFILE_ACTION_ENUM_SIZE); 623 AUTOFILL_PROFILE_ACTION_ENUM_SIZE);
615 } 624 }
616 625
617 // static 626 // static
618 void AutofillMetrics::LogAutofillFormSubmittedState( 627 void AutofillMetrics::LogAutofillFormSubmittedState(
619 AutofillFormSubmittedState state) { 628 AutofillFormSubmittedState state,
629 AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger) {
620 UMA_HISTOGRAM_ENUMERATION("Autofill.FormSubmittedState", state, 630 UMA_HISTOGRAM_ENUMERATION("Autofill.FormSubmittedState", state,
621 AUTOFILL_FORM_SUBMITTED_STATE_ENUM_SIZE); 631 AUTOFILL_FORM_SUBMITTED_STATE_ENUM_SIZE);
622 632
623 switch (state) { 633 switch (state) {
624 case NON_FILLABLE_FORM_OR_NEW_DATA: 634 case NON_FILLABLE_FORM_OR_NEW_DATA:
625 base::RecordAction( 635 base::RecordAction(
626 base::UserMetricsAction("Autofill_FormSubmitted_NonFillable")); 636 base::UserMetricsAction("Autofill_FormSubmitted_NonFillable"));
627 break; 637 break;
628 638
629 case FILLABLE_FORM_AUTOFILLED_ALL: 639 case FILLABLE_FORM_AUTOFILLED_ALL:
(...skipping 13 matching lines...) Expand all
643 653
644 case FILLABLE_FORM_AUTOFILLED_NONE_DID_NOT_SHOW_SUGGESTIONS: 654 case FILLABLE_FORM_AUTOFILLED_NONE_DID_NOT_SHOW_SUGGESTIONS:
645 base::RecordAction(base::UserMetricsAction( 655 base::RecordAction(base::UserMetricsAction(
646 "Autofill_FormSubmitted_FilledNone_SuggestionsNotShown")); 656 "Autofill_FormSubmitted_FilledNone_SuggestionsNotShown"));
647 break; 657 break;
648 658
649 default: 659 default:
650 NOTREACHED(); 660 NOTREACHED();
651 break; 661 break;
652 } 662 }
663 form_interactions_ukm_logger->LogAutofillFormSubmittedState(state);
653 } 664 }
654 665
655 // static 666 // static
656 void AutofillMetrics::LogDetermineHeuristicTypesTiming( 667 void AutofillMetrics::LogDetermineHeuristicTypesTiming(
657 const base::TimeDelta& duration) { 668 const base::TimeDelta& duration) {
658 UMA_HISTOGRAM_TIMES("Autofill.Timing.DetermineHeuristicTypes", duration); 669 UMA_HISTOGRAM_TIMES("Autofill.Timing.DetermineHeuristicTypes", duration);
659 } 670 }
660 671
661 // static 672 // static
662 void AutofillMetrics::LogParseFormTiming(const base::TimeDelta& duration) { 673 void AutofillMetrics::LogParseFormTiming(const base::TimeDelta& duration) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 } 710 }
700 711
701 // static 712 // static
702 void AutofillMetrics::LogCardUploadDecisionUkm( 713 void AutofillMetrics::LogCardUploadDecisionUkm(
703 ukm::UkmService* ukm_service, 714 ukm::UkmService* ukm_service,
704 const GURL& url, 715 const GURL& url,
705 AutofillMetrics::CardUploadDecisionMetric upload_decision) { 716 AutofillMetrics::CardUploadDecisionMetric upload_decision) {
706 if (upload_decision >= AutofillMetrics::NUM_CARD_UPLOAD_DECISION_METRICS) 717 if (upload_decision >= AutofillMetrics::NUM_CARD_UPLOAD_DECISION_METRICS)
707 return; 718 return;
708 719
709 const std::map<std::string, int> metrics = { 720 const std::vector<std::pair<const char*, int>> metrics = {
710 {internal::kUKMCardUploadDecisionMetricName, 721 {internal::kUKMCardUploadDecisionMetricName,
711 static_cast<int>(upload_decision)}}; 722 static_cast<int>(upload_decision)}};
712 LogUkm(ukm_service, url, internal::kUKMCardUploadDecisionEntryName, metrics); 723 LogUkm(ukm_service, url, internal::kUKMCardUploadDecisionEntryName, metrics);
713 } 724 }
714 725
715 // static 726 // static
716 void AutofillMetrics::LogDeveloperEngagementUkm( 727 void AutofillMetrics::LogDeveloperEngagementUkm(
717 ukm::UkmService* ukm_service, 728 ukm::UkmService* ukm_service,
718 const GURL& url, 729 const GURL& url,
719 AutofillMetrics::DeveloperEngagementMetric metric) { 730 std::vector<AutofillMetrics::DeveloperEngagementMetric> metrics) {
720 const std::map<std::string, int> form_structure_metrics = { 731 std::vector<std::pair<const char*, int>> form_structure_metrics;
721 {internal::kUKMDeveloperEngagementMetricName, static_cast<int>(metric)}}; 732 for (const auto it : metrics)
733 form_structure_metrics.push_back(
734 {internal::kUKMDeveloperEngagementMetricName, static_cast<int>(it)});
735
722 LogUkm(ukm_service, url, internal::kUKMDeveloperEngagementEntryName, 736 LogUkm(ukm_service, url, internal::kUKMDeveloperEngagementEntryName,
723 form_structure_metrics); 737 form_structure_metrics);
724 } 738 }
725 739
726 // static 740 // static
727 bool AutofillMetrics::LogUkm(ukm::UkmService* ukm_service, 741 bool AutofillMetrics::LogUkm(
728 const GURL& url, 742 ukm::UkmService* ukm_service,
729 const std::string& ukm_entry_name, 743 const GURL& url,
730 const std::map<std::string, int>& metrics) { 744 const std::string& ukm_entry_name,
745 const std::vector<std::pair<const char*, int>>& metrics) {
731 if (!IsUkmLoggingEnabled() || !ukm_service || !url.is_valid() || 746 if (!IsUkmLoggingEnabled() || !ukm_service || !url.is_valid() ||
732 metrics.empty()) { 747 metrics.empty()) {
733 return false; 748 return false;
734 } 749 }
735 750
736 int32_t source_id = ukm_service->GetNewSourceID(); 751 int32_t source_id = ukm_service->GetNewSourceID();
737 ukm_service->UpdateSourceURL(source_id, url); 752 ukm_service->UpdateSourceURL(source_id, url);
738 std::unique_ptr<ukm::UkmEntryBuilder> builder = 753 std::unique_ptr<ukm::UkmEntryBuilder> builder =
739 ukm_service->GetEntryBuilder(source_id, ukm_entry_name.c_str()); 754 ukm_service->GetEntryBuilder(source_id, ukm_entry_name.c_str());
740 755
741 for (auto it = metrics.begin(); it != metrics.end(); ++it) { 756 for (auto it = metrics.begin(); it != metrics.end(); ++it) {
742 builder->AddMetric(it->first.c_str(), it->second); 757 builder->AddMetric(it->first, it->second);
743 } 758 }
744 759
745 return true; 760 return true;
746 } 761 }
747 762
748 AutofillMetrics::FormEventLogger::FormEventLogger(bool is_for_credit_card) 763 AutofillMetrics::FormEventLogger::FormEventLogger(
764 bool is_for_credit_card,
765 AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger)
749 : is_for_credit_card_(is_for_credit_card), 766 : is_for_credit_card_(is_for_credit_card),
750 is_server_data_available_(false), 767 is_server_data_available_(false),
751 is_local_data_available_(false), 768 is_local_data_available_(false),
752 is_context_secure_(false), 769 is_context_secure_(false),
753 has_logged_interacted_(false), 770 has_logged_interacted_(false),
754 has_logged_suggestions_shown_(false), 771 has_logged_suggestions_shown_(false),
755 has_logged_masked_server_card_suggestion_selected_(false), 772 has_logged_masked_server_card_suggestion_selected_(false),
756 has_logged_suggestion_filled_(false), 773 has_logged_suggestion_filled_(false),
757 has_logged_will_submit_(false), 774 has_logged_will_submit_(false),
758 has_logged_submitted_(false), 775 has_logged_submitted_(false),
759 logged_suggestion_filled_was_server_data_(false), 776 logged_suggestion_filled_was_server_data_(false),
760 logged_suggestion_filled_was_masked_server_card_(false) {} 777 logged_suggestion_filled_was_masked_server_card_(false),
778 form_interactions_ukm_logger_(form_interactions_ukm_logger) {}
761 779
762 void AutofillMetrics::FormEventLogger::OnDidInteractWithAutofillableForm() { 780 void AutofillMetrics::FormEventLogger::OnDidInteractWithAutofillableForm() {
763 if (!has_logged_interacted_) { 781 if (!has_logged_interacted_) {
764 has_logged_interacted_ = true; 782 has_logged_interacted_ = true;
765 Log(AutofillMetrics::FORM_EVENT_INTERACTED_ONCE); 783 Log(AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, false /* log_ukm */);
766 } 784 }
767 } 785 }
768 786
769 void AutofillMetrics::FormEventLogger::OnDidPollSuggestions( 787 void AutofillMetrics::FormEventLogger::OnDidPollSuggestions(
770 const FormFieldData& field) { 788 const FormFieldData& field) {
771 // Record only one poll user action for consecutive polls of the same field. 789 // Record only one poll user action for consecutive polls of the same field.
772 // This is to avoid recording too many poll actions (for example when a user 790 // This is to avoid recording too many poll actions (for example when a user
773 // types in a field, triggering multiple queries) to make the analysis more 791 // types in a field, triggering multiple queries) to make the analysis more
774 // simple. 792 // simple.
775 if (!field.SameFieldAs(last_polled_field_)) { 793 if (!field.SameFieldAs(last_polled_field_)) {
776 if (is_for_credit_card_) { 794 if (is_for_credit_card_) {
777 base::RecordAction( 795 base::RecordAction(
778 base::UserMetricsAction("Autofill_PolledCreditCardSuggestions")); 796 base::UserMetricsAction("Autofill_PolledCreditCardSuggestions"));
779 } else { 797 } else {
780 base::RecordAction( 798 base::RecordAction(
781 base::UserMetricsAction("Autofill_PolledProfileSuggestions")); 799 base::UserMetricsAction("Autofill_PolledProfileSuggestions"));
782 } 800 }
783 801
784 last_polled_field_ = field; 802 last_polled_field_ = field;
785 } 803 }
786 } 804 }
787 805
788 void AutofillMetrics::FormEventLogger::OnDidShowSuggestions() { 806 void AutofillMetrics::FormEventLogger::OnDidShowSuggestions() {
789 Log(AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN); 807 Log(AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN, true /* log_ukm */);
790 if (!has_logged_suggestions_shown_) { 808 if (!has_logged_suggestions_shown_) {
791 has_logged_suggestions_shown_ = true; 809 has_logged_suggestions_shown_ = true;
792 Log(AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN_ONCE); 810 Log(AutofillMetrics::FORM_EVENT_SUGGESTIONS_SHOWN_ONCE,
811 false /* log_ukm */);
793 } 812 }
794 813
795 if (is_for_credit_card_) { 814 if (is_for_credit_card_) {
796 base::RecordAction( 815 base::RecordAction(
797 base::UserMetricsAction("Autofill_ShowedCreditCardSuggestions")); 816 base::UserMetricsAction("Autofill_ShowedCreditCardSuggestions"));
798 } else { 817 } else {
799 base::RecordAction( 818 base::RecordAction(
800 base::UserMetricsAction("Autofill_ShowedProfileSuggestions")); 819 base::UserMetricsAction("Autofill_ShowedProfileSuggestions"));
801 } 820 }
802 } 821 }
803 822
804 void AutofillMetrics::FormEventLogger::OnDidSelectMaskedServerCardSuggestion() { 823 void AutofillMetrics::FormEventLogger::OnDidSelectMaskedServerCardSuggestion() {
805 DCHECK(is_for_credit_card_); 824 DCHECK(is_for_credit_card_);
806 Log(AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SELECTED); 825 Log(AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SELECTED,
826 true /* log_ukm */);
807 if (!has_logged_masked_server_card_suggestion_selected_) { 827 if (!has_logged_masked_server_card_suggestion_selected_) {
808 has_logged_masked_server_card_suggestion_selected_ = true; 828 has_logged_masked_server_card_suggestion_selected_ = true;
809 Log(AutofillMetrics 829 Log(AutofillMetrics ::
810 ::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SELECTED_ONCE); 830 FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SELECTED_ONCE,
831 false /* log_ukm */);
811 } 832 }
812 } 833 }
813 834
814 void AutofillMetrics::FormEventLogger::OnDidFillSuggestion( 835 void AutofillMetrics::FormEventLogger::OnDidFillSuggestion(
815 const CreditCard& credit_card) { 836 const CreditCard& credit_card) {
816 DCHECK(is_for_credit_card_); 837 DCHECK(is_for_credit_card_);
Steven Holte 2017/04/12 02:26:30 This seems like a much more natural place to log t
csashi 2017/04/12 05:53:58 Done.
817 if (credit_card.record_type() == CreditCard::MASKED_SERVER_CARD) 838 if (credit_card.record_type() == CreditCard::MASKED_SERVER_CARD)
818 Log(AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED); 839 Log(AutofillMetrics::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED,
840 true /* log_ukm */);
819 else if (credit_card.record_type() == CreditCard::FULL_SERVER_CARD) 841 else if (credit_card.record_type() == CreditCard::FULL_SERVER_CARD)
820 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED); 842 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED,
843 true /* log_ukm */);
821 else 844 else
822 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED); 845 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED,
846 true /* log_ukm */);
823 847
824 if (!has_logged_suggestion_filled_) { 848 if (!has_logged_suggestion_filled_) {
825 has_logged_suggestion_filled_ = true; 849 has_logged_suggestion_filled_ = true;
826 logged_suggestion_filled_was_server_data_ = 850 logged_suggestion_filled_was_server_data_ =
827 credit_card.record_type() == CreditCard::MASKED_SERVER_CARD || 851 credit_card.record_type() == CreditCard::MASKED_SERVER_CARD ||
828 credit_card.record_type() == CreditCard::FULL_SERVER_CARD; 852 credit_card.record_type() == CreditCard::FULL_SERVER_CARD;
829 logged_suggestion_filled_was_masked_server_card_ = 853 logged_suggestion_filled_was_masked_server_card_ =
830 credit_card.record_type() == CreditCard::MASKED_SERVER_CARD; 854 credit_card.record_type() == CreditCard::MASKED_SERVER_CARD;
831 if (credit_card.record_type() == CreditCard::MASKED_SERVER_CARD) { 855 if (credit_card.record_type() == CreditCard::MASKED_SERVER_CARD) {
832 Log(AutofillMetrics 856 Log(AutofillMetrics ::
833 ::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED_ONCE); 857 FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_FILLED_ONCE,
858 false /* log_ukm */);
834 } else if (credit_card.record_type() == CreditCard::FULL_SERVER_CARD) { 859 } else if (credit_card.record_type() == CreditCard::FULL_SERVER_CARD) {
835 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED_ONCE); 860 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED_ONCE,
861 false /* log_ukm */);
836 } else { 862 } else {
837 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED_ONCE); 863 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED_ONCE,
864 false /* log_ukm */);
838 } 865 }
839 } 866 }
840 867
841 base::RecordAction( 868 base::RecordAction(
842 base::UserMetricsAction("Autofill_FilledCreditCardSuggestion")); 869 base::UserMetricsAction("Autofill_FilledCreditCardSuggestion"));
843 } 870 }
844 871
845 void AutofillMetrics::FormEventLogger::OnDidFillSuggestion( 872 void AutofillMetrics::FormEventLogger::OnDidFillSuggestion(
846 const AutofillProfile& profile) { 873 const AutofillProfile& profile) {
847 DCHECK(!is_for_credit_card_); 874 DCHECK(!is_for_credit_card_);
848 if (profile.record_type() == AutofillProfile::SERVER_PROFILE) 875 if (profile.record_type() == AutofillProfile::SERVER_PROFILE)
849 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED); 876 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED,
877 true /* log_ukm */);
850 else 878 else
851 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED); 879 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED,
880 true /* log_ukm */);
852 881
853 if (!has_logged_suggestion_filled_) { 882 if (!has_logged_suggestion_filled_) {
854 has_logged_suggestion_filled_ = true; 883 has_logged_suggestion_filled_ = true;
855 logged_suggestion_filled_was_server_data_ = 884 logged_suggestion_filled_was_server_data_ =
856 profile.record_type() == AutofillProfile::SERVER_PROFILE; 885 profile.record_type() == AutofillProfile::SERVER_PROFILE;
857 Log(profile.record_type() == AutofillProfile::SERVER_PROFILE 886 Log(profile.record_type() == AutofillProfile::SERVER_PROFILE
858 ? AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED_ONCE 887 ? AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_FILLED_ONCE
859 : AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED_ONCE); 888 : AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_FILLED_ONCE,
889 false /* log_ukm */);
860 } 890 }
861 891
862 base::RecordAction( 892 base::RecordAction(
863 base::UserMetricsAction("Autofill_FilledProfileSuggestion")); 893 base::UserMetricsAction("Autofill_FilledProfileSuggestion"));
864 } 894 }
865 895
866 void AutofillMetrics::FormEventLogger::OnWillSubmitForm() { 896 void AutofillMetrics::FormEventLogger::OnWillSubmitForm() {
867 // Not logging this kind of form if we haven't logged a user interaction. 897 // Not logging this kind of form if we haven't logged a user interaction.
868 if (!has_logged_interacted_) 898 if (!has_logged_interacted_)
869 return; 899 return;
870 900
871 // Not logging twice. 901 // Not logging twice.
872 if (has_logged_will_submit_) 902 if (has_logged_will_submit_)
873 return; 903 return;
874 has_logged_will_submit_ = true; 904 has_logged_will_submit_ = true;
875 905
876 if (!has_logged_suggestion_filled_) { 906 if (!has_logged_suggestion_filled_) {
877 Log(AutofillMetrics::FORM_EVENT_NO_SUGGESTION_WILL_SUBMIT_ONCE); 907 Log(AutofillMetrics::FORM_EVENT_NO_SUGGESTION_WILL_SUBMIT_ONCE,
908 false /* log_ukm */);
878 } else if (logged_suggestion_filled_was_masked_server_card_) { 909 } else if (logged_suggestion_filled_was_masked_server_card_) {
879 Log(AutofillMetrics:: 910 Log(AutofillMetrics::
880 FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_WILL_SUBMIT_ONCE); 911 FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_WILL_SUBMIT_ONCE,
912 false /* log_ukm */);
881 } else if (logged_suggestion_filled_was_server_data_) { 913 } else if (logged_suggestion_filled_was_server_data_) {
882 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_WILL_SUBMIT_ONCE); 914 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_WILL_SUBMIT_ONCE,
915 false /* log_ukm */);
883 } else { 916 } else {
884 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_WILL_SUBMIT_ONCE); 917 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_WILL_SUBMIT_ONCE,
918 false /* log_ukm */);
885 } 919 }
886 920
887 if (has_logged_suggestions_shown_) { 921 if (has_logged_suggestions_shown_) {
888 Log(AutofillMetrics::FORM_EVENT_SUGGESTION_SHOWN_WILL_SUBMIT_ONCE); 922 Log(AutofillMetrics::FORM_EVENT_SUGGESTION_SHOWN_WILL_SUBMIT_ONCE,
923 false /* log_ukm */);
889 } 924 }
890 925
891 base::RecordAction(base::UserMetricsAction("Autofill_OnWillSubmitForm")); 926 base::RecordAction(base::UserMetricsAction("Autofill_OnWillSubmitForm"));
892 } 927 }
893 928
894 void AutofillMetrics::FormEventLogger::OnFormSubmitted() { 929 void AutofillMetrics::FormEventLogger::OnFormSubmitted() {
895 // Not logging this kind of form if we haven't logged a user interaction. 930 // Not logging this kind of form if we haven't logged a user interaction.
896 if (!has_logged_interacted_) 931 if (!has_logged_interacted_)
897 return; 932 return;
898 933
899 // Not logging twice. 934 // Not logging twice.
900 if (has_logged_submitted_) 935 if (has_logged_submitted_)
901 return; 936 return;
902 has_logged_submitted_ = true; 937 has_logged_submitted_ = true;
903 938
904 if (!has_logged_suggestion_filled_) { 939 if (!has_logged_suggestion_filled_) {
905 Log(AutofillMetrics::FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE); 940 Log(AutofillMetrics::FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE,
941 false /* log_ukm */);
906 } else if (logged_suggestion_filled_was_masked_server_card_) { 942 } else if (logged_suggestion_filled_was_masked_server_card_) {
907 Log(AutofillMetrics 943 Log(AutofillMetrics ::
908 ::FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SUBMITTED_ONCE); 944 FORM_EVENT_MASKED_SERVER_CARD_SUGGESTION_SUBMITTED_ONCE,
945 false /* log_ukm */);
909 } else if (logged_suggestion_filled_was_server_data_) { 946 } else if (logged_suggestion_filled_was_server_data_) {
910 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_SUBMITTED_ONCE); 947 Log(AutofillMetrics::FORM_EVENT_SERVER_SUGGESTION_SUBMITTED_ONCE,
948 false /* log_ukm */);
911 } else { 949 } else {
912 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_SUBMITTED_ONCE); 950 Log(AutofillMetrics::FORM_EVENT_LOCAL_SUGGESTION_SUBMITTED_ONCE,
951 false /* log_ukm */);
913 } 952 }
914 953
915 if (has_logged_suggestions_shown_) { 954 if (has_logged_suggestions_shown_) {
916 Log(AutofillMetrics::FORM_EVENT_SUGGESTION_SHOWN_SUBMITTED_ONCE); 955 Log(AutofillMetrics::FORM_EVENT_SUGGESTION_SHOWN_SUBMITTED_ONCE,
956 false /* log_ukm */);
917 } 957 }
918 } 958 }
919 959
920 void AutofillMetrics::FormEventLogger::Log(FormEvent event) const { 960 void AutofillMetrics::FormEventLogger::Log(FormEvent event,
961 bool log_ukm) const {
921 DCHECK_LT(event, NUM_FORM_EVENTS); 962 DCHECK_LT(event, NUM_FORM_EVENTS);
922 std::string name("Autofill.FormEvents."); 963 std::string name("Autofill.FormEvents.");
923 if (is_for_credit_card_) 964 if (is_for_credit_card_)
924 name += "CreditCard"; 965 name += "CreditCard";
925 else 966 else
926 name += "Address"; 967 name += "Address";
927 LogUMAHistogramEnumeration(name, event, NUM_FORM_EVENTS); 968 LogUMAHistogramEnumeration(name, event, NUM_FORM_EVENTS);
928 969
929 // Log again in a different histogram for credit card forms on nonsecure 970 // Log again in a different histogram for credit card forms on nonsecure
930 // pages, so that form interactions on nonsecure pages can be analyzed on 971 // pages, so that form interactions on nonsecure pages can be analyzed on
931 // their own. 972 // their own.
932 if (is_for_credit_card_ && !is_context_secure_) { 973 if (is_for_credit_card_ && !is_context_secure_) {
933 LogUMAHistogramEnumeration(name + ".OnNonsecurePage", event, 974 LogUMAHistogramEnumeration(name + ".OnNonsecurePage", event,
934 NUM_FORM_EVENTS); 975 NUM_FORM_EVENTS);
935 } 976 }
936 977
937 // Logging again in a different histogram for segmentation purposes. 978 // Logging again in a different histogram for segmentation purposes.
938 // TODO(waltercacau): Re-evaluate if we still need such fine grained 979 // TODO(waltercacau): Re-evaluate if we still need such fine grained
939 // segmentation. http://crbug.com/454018 980 // segmentation. http://crbug.com/454018
940 if (!is_server_data_available_ && !is_local_data_available_) 981 if (!is_server_data_available_ && !is_local_data_available_)
941 name += ".WithNoData"; 982 name += ".WithNoData";
942 else if (is_server_data_available_ && !is_local_data_available_) 983 else if (is_server_data_available_ && !is_local_data_available_)
943 name += ".WithOnlyServerData"; 984 name += ".WithOnlyServerData";
944 else if (!is_server_data_available_ && is_local_data_available_) 985 else if (!is_server_data_available_ && is_local_data_available_)
945 name += ".WithOnlyLocalData"; 986 name += ".WithOnlyLocalData";
946 else 987 else
947 name += ".WithBothServerAndLocalData"; 988 name += ".WithBothServerAndLocalData";
948 LogUMAHistogramEnumeration(name, event, NUM_FORM_EVENTS); 989 LogUMAHistogramEnumeration(name, event, NUM_FORM_EVENTS);
990
991 if (log_ukm) {
992 if (is_for_credit_card_)
993 form_interactions_ukm_logger_->LogCreditCardFormEvent(event);
994 else
995 form_interactions_ukm_logger_->LogAddressFormEvent(event);
996 }
997 }
998
999 AutofillMetrics::FormInteractionsUkmLogger::FormInteractionsUkmLogger(
1000 ukm::UkmService* ukm_service)
1001 : ukm_service_(ukm_service) {}
1002
1003 AutofillMetrics::FormInteractionsUkmLogger::~FormInteractionsUkmLogger() {
1004 // Submit pending events, if any. If the browser tab starts loading a new page
1005 // when the user types a new URL prior to form submission,
1006 // |LogAutofillFormSubmittedState| would not be invoked.
1007 SubmitUkm();
1008 }
1009
1010 void AutofillMetrics::FormInteractionsUkmLogger::LogAutofillFormSubmittedState(
1011 AutofillFormSubmittedState state) {
1012 AddEvent(internal::kUKMAutofillFormSubmittedStateName,
1013 static_cast<int>(state));
1014
1015 // User submitted form, we can submit the events for this form.
1016 SubmitUkm();
1017 }
1018
1019 void AutofillMetrics::FormInteractionsUkmLogger::LogUserHappinessMetric(
1020 UserHappinessMetric metric) {
1021 AddEvent(internal::kUKMUserHappinessMetricName, static_cast<int>(metric));
1022 }
1023
1024 void AutofillMetrics::FormInteractionsUkmLogger::LogAddressFormEvent(
1025 FormEvent event) {
1026 AddEvent(internal::kUKMAddressFormEventName, static_cast<int>(event));
1027 }
1028
1029 void AutofillMetrics::FormInteractionsUkmLogger::LogCreditCardFormEvent(
1030 FormEvent event) {
1031 AddEvent(internal::kUKMCreditCardFormEventName, static_cast<int>(event));
1032 }
1033
1034 void AutofillMetrics::FormInteractionsUkmLogger::LogUnmaskPromptEvent(
1035 UnmaskPromptEvent event) {
1036 AddEvent(internal::kUKMUnmaskPromptEventName, static_cast<int>(event));
1037 }
1038
1039 void AutofillMetrics::FormInteractionsUkmLogger::SubmitUkm() {
1040 if (!IsUkmLoggingEnabled() || !ukm_service_ || !url_.is_valid() ||
1041 events_.empty())
1042 return;
1043
1044 const int32_t source_id = ukm_service_->GetNewSourceID();
Steven Holte 2017/04/12 02:26:30 Maybe call GetNewSourceID() in your constructor, C
csashi 2017/04/12 05:53:58 Done. I wasn't sure of when the logs will get "fl
Steven Holte 2017/04/12 19:42:15 It is possible that the Entry and Source will be s
1045 ukm_service_->UpdateSourceURL(source_id, url_);
1046 for (const auto& it : events_) {
1047 std::unique_ptr<ukm::UkmEntryBuilder> builder =
1048 ukm_service_->GetEntryBuilder(source_id, it.name);
1049 builder->AddMetric(it.name, it.value);
1050 builder->AddMetric(internal::kUKMMillisecondsSinceFormLoadedMetricName,
1051 it.time_delta_millis);
1052 }
1053 events_.clear();
1054 form_loaded_timestamp_ = base::TimeTicks();
1055 }
1056
1057 void AutofillMetrics::FormInteractionsUkmLogger::AddEvent(
1058 const char* const name,
1059 int value) {
1060 DCHECK(!form_loaded_timestamp_.is_null());
1061 events_.push_back(Event(
1062 name, value,
1063 (base::TimeTicks::Now() - form_loaded_timestamp_).InMilliseconds()));
949 } 1064 }
950 1065
951 } // namespace autofill 1066 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698