OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/string16.h" | 9 #include "base/string16.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 void(FieldTypeQualityMetric metric, | 39 void(FieldTypeQualityMetric metric, |
40 AutofillFieldType field_type, | 40 AutofillFieldType field_type, |
41 const std::string& experiment_id)); | 41 const std::string& experiment_id)); |
42 MOCK_CONST_METHOD3(LogServerTypePrediction, | 42 MOCK_CONST_METHOD3(LogServerTypePrediction, |
43 void(FieldTypeQualityMetric metric, | 43 void(FieldTypeQualityMetric metric, |
44 AutofillFieldType field_type, | 44 AutofillFieldType field_type, |
45 const std::string& experiment_id)); | 45 const std::string& experiment_id)); |
46 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, | 46 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, |
47 const std::string& experiment_id)); | 47 const std::string& experiment_id)); |
48 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); | 48 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); |
| 49 MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric)); |
49 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); | 50 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); |
50 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); | 51 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); |
51 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); | 52 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); |
52 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions)); | 53 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions)); |
53 MOCK_CONST_METHOD1(LogServerExperimentIdForQuery, | 54 MOCK_CONST_METHOD1(LogServerExperimentIdForQuery, |
54 void(const std::string& experiment_id)); | 55 void(const std::string& experiment_id)); |
55 MOCK_CONST_METHOD1(LogServerExperimentIdForUpload, | 56 MOCK_CONST_METHOD1(LogServerExperimentIdForUpload, |
56 void(const std::string& experiment_id)); | 57 void(const std::string& experiment_id)); |
57 | 58 |
58 private: | 59 private: |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 PHONE_HOME_WHOLE_NUMBER, std::string())); | 383 PHONE_HOME_WHOLE_NUMBER, std::string())); |
383 EXPECT_CALL(*autofill_manager_->metric_logger(), | 384 EXPECT_CALL(*autofill_manager_->metric_logger(), |
384 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, | 385 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, |
385 PHONE_HOME_WHOLE_NUMBER, std::string())); | 386 PHONE_HOME_WHOLE_NUMBER, std::string())); |
386 EXPECT_CALL(*autofill_manager_->metric_logger(), | 387 EXPECT_CALL(*autofill_manager_->metric_logger(), |
387 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, | 388 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, |
388 PHONE_HOME_WHOLE_NUMBER, std::string())); | 389 PHONE_HOME_WHOLE_NUMBER, std::string())); |
389 EXPECT_CALL(*autofill_manager_->metric_logger(), | 390 EXPECT_CALL(*autofill_manager_->metric_logger(), |
390 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, | 391 LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, |
391 std::string())); | 392 std::string())); |
| 393 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 394 LogUserHappinessMetric( |
| 395 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); |
392 | 396 |
393 // Simulate form submission. | 397 // Simulate form submission. |
394 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); | 398 EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); |
395 } | 399 } |
396 | 400 |
397 // Test that we log the appropriate additional metrics when Autofill failed. | 401 // Test that we log the appropriate additional metrics when Autofill failed. |
398 TEST_F(AutofillMetricsTest, QualityMetricsForFailure) { | 402 TEST_F(AutofillMetricsTest, QualityMetricsForFailure) { |
399 // Set up our form data. | 403 // Set up our form data. |
400 FormData form; | 404 FormData form; |
401 form.name = ASCIIToUTF16("TestForm"); | 405 form.name = ASCIIToUTF16("TestForm"); |
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED)); | 1023 LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED)); |
1020 EXPECT_CALL(metric_logger, | 1024 EXPECT_CALL(metric_logger, |
1021 LogServerExperimentIdForQuery("ar1")); | 1025 LogServerExperimentIdForQuery("ar1")); |
1022 EXPECT_CALL(metric_logger, | 1026 EXPECT_CALL(metric_logger, |
1023 LogServerQueryMetric( | 1027 LogServerQueryMetric( |
1024 AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS)); | 1028 AutofillMetrics::QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS)); |
1025 FormStructure::ParseQueryResponse( | 1029 FormStructure::ParseQueryResponse( |
1026 "<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>", | 1030 "<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>", |
1027 std::vector<FormStructure*>(), metric_logger); | 1031 std::vector<FormStructure*>(), metric_logger); |
1028 } | 1032 } |
| 1033 |
| 1034 // Verify that we correctly log user happiness metrics dealing with form loading |
| 1035 // and form submission. |
| 1036 TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) { |
| 1037 // Start with a form with insufficiently many fields. |
| 1038 FormData form; |
| 1039 form.name = ASCIIToUTF16("TestForm"); |
| 1040 form.method = ASCIIToUTF16("POST"); |
| 1041 form.origin = GURL("http://example.com/form.html"); |
| 1042 form.action = GURL("http://example.com/submit.html"); |
| 1043 form.user_submitted = true; |
| 1044 |
| 1045 FormField field; |
| 1046 autofill_test::CreateTestFormField("Name", "name", "", "text", &field); |
| 1047 form.fields.push_back(field); |
| 1048 autofill_test::CreateTestFormField("Email", "email", "", "text", &field); |
| 1049 form.fields.push_back(field); |
| 1050 |
| 1051 std::vector<FormData> forms(1, form); |
| 1052 |
| 1053 // Expect no notifications when the form is first seen. |
| 1054 { |
| 1055 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1056 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)).Times(0); |
| 1057 autofill_manager_->OnFormsSeen(forms); |
| 1058 } |
| 1059 |
| 1060 |
| 1061 // Expect no notifications when the form is submitted. |
| 1062 { |
| 1063 EXPECT_CALL( |
| 1064 *autofill_manager_->metric_logger(), |
| 1065 LogUserHappinessMetric( |
| 1066 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)).Times(0); |
| 1067 EXPECT_CALL( |
| 1068 *autofill_manager_->metric_logger(), |
| 1069 LogUserHappinessMetric( |
| 1070 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)).Times(0); |
| 1071 EXPECT_CALL( |
| 1072 *autofill_manager_->metric_logger(), |
| 1073 LogUserHappinessMetric( |
| 1074 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)).Times(0); |
| 1075 EXPECT_CALL( |
| 1076 *autofill_manager_->metric_logger(), |
| 1077 LogUserHappinessMetric( |
| 1078 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)).Times(0); |
| 1079 autofill_manager_->OnFormSubmitted(form); |
| 1080 } |
| 1081 |
| 1082 // Add more fields to the form. |
| 1083 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field); |
| 1084 form.fields.push_back(field); |
| 1085 autofill_test::CreateTestFormField("Unknown", "unknown", "", "text", &field); |
| 1086 form.fields.push_back(field); |
| 1087 forms.front() = form; |
| 1088 |
| 1089 // Expect a notification when the form is first seen. |
| 1090 { |
| 1091 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1092 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); |
| 1093 autofill_manager_->OnFormsSeen(forms); |
| 1094 } |
| 1095 |
| 1096 // Expect a notification when the form is submitted. |
| 1097 { |
| 1098 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1099 LogUserHappinessMetric( |
| 1100 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
| 1101 autofill_manager_->OnFormSubmitted(form); |
| 1102 } |
| 1103 |
| 1104 // Fill in two of the fields. |
| 1105 form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); |
| 1106 form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); |
| 1107 forms.front() = form; |
| 1108 |
| 1109 // Expect a notification when the form is submitted. |
| 1110 { |
| 1111 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1112 LogUserHappinessMetric( |
| 1113 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
| 1114 autofill_manager_->OnFormSubmitted(form); |
| 1115 } |
| 1116 |
| 1117 // Fill in the third field. |
| 1118 form.fields[2].value = ASCIIToUTF16("12345678901"); |
| 1119 forms.front() = form; |
| 1120 |
| 1121 // Expect notifications when the form is submitted. |
| 1122 { |
| 1123 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1124 LogUserHappinessMetric( |
| 1125 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)); |
| 1126 autofill_manager_->OnFormSubmitted(form); |
| 1127 } |
| 1128 |
| 1129 |
| 1130 // Mark one of the fields as autofilled. |
| 1131 form.fields[1].is_autofilled = true; |
| 1132 forms.front() = form; |
| 1133 |
| 1134 // Expect notifications when the form is submitted. |
| 1135 { |
| 1136 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1137 LogUserHappinessMetric( |
| 1138 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); |
| 1139 autofill_manager_->OnFormSubmitted(form); |
| 1140 } |
| 1141 |
| 1142 // Mark all of the fillable fields as autofilled. |
| 1143 form.fields[0].is_autofilled = true; |
| 1144 form.fields[2].is_autofilled = true; |
| 1145 forms.front() = form; |
| 1146 |
| 1147 // Expect notifications when the form is submitted. |
| 1148 { |
| 1149 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1150 LogUserHappinessMetric( |
| 1151 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)); |
| 1152 autofill_manager_->OnFormSubmitted(form); |
| 1153 } |
| 1154 |
| 1155 // Clear out the third field's value. |
| 1156 form.fields[2].value = string16(); |
| 1157 forms.front() = form; |
| 1158 |
| 1159 // Expect notifications when the form is submitted. |
| 1160 { |
| 1161 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1162 LogUserHappinessMetric( |
| 1163 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
| 1164 autofill_manager_->OnFormSubmitted(form); |
| 1165 } |
| 1166 } |
| 1167 |
| 1168 // Verify that we correctly log user happiness metrics dealing with form |
| 1169 // interaction. |
| 1170 TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { |
| 1171 // Load a fillable form. |
| 1172 FormData form; |
| 1173 form.name = ASCIIToUTF16("TestForm"); |
| 1174 form.method = ASCIIToUTF16("POST"); |
| 1175 form.origin = GURL("http://example.com/form.html"); |
| 1176 form.action = GURL("http://example.com/submit.html"); |
| 1177 form.user_submitted = true; |
| 1178 |
| 1179 FormField field; |
| 1180 autofill_test::CreateTestFormField("Name", "name", "", "text", &field); |
| 1181 form.fields.push_back(field); |
| 1182 autofill_test::CreateTestFormField("Email", "email", "", "text", &field); |
| 1183 form.fields.push_back(field); |
| 1184 autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field); |
| 1185 form.fields.push_back(field); |
| 1186 |
| 1187 std::vector<FormData> forms(1, form); |
| 1188 |
| 1189 // Expect a notification when the form is first seen. |
| 1190 { |
| 1191 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1192 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); |
| 1193 autofill_manager_->OnFormsSeen(forms); |
| 1194 } |
| 1195 |
| 1196 // Simulate typing. |
| 1197 { |
| 1198 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1199 LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE)); |
| 1200 autofill_manager_->OnTextFieldDidChange(form, form.fields.front()); |
| 1201 } |
| 1202 |
| 1203 // Simulate suggestions shown twice for a single edit (i.e. multiple |
| 1204 // keystrokes in a single field). |
| 1205 { |
| 1206 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1207 LogUserHappinessMetric( |
| 1208 AutofillMetrics::SUGGESTIONS_SHOWN)).Times(1); |
| 1209 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1210 LogUserHappinessMetric( |
| 1211 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(1); |
| 1212 autofill_manager_->OnDidShowAutofillSuggestions(true); |
| 1213 autofill_manager_->OnDidShowAutofillSuggestions(false); |
| 1214 } |
| 1215 |
| 1216 // Simulate suggestions shown for a different field. |
| 1217 { |
| 1218 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1219 LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN)); |
| 1220 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1221 LogUserHappinessMetric( |
| 1222 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(0); |
| 1223 autofill_manager_->OnDidShowAutofillSuggestions(true); |
| 1224 } |
| 1225 |
| 1226 // Simulate invoking autofill. |
| 1227 { |
| 1228 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1229 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); |
| 1230 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1231 LogUserHappinessMetric( |
| 1232 AutofillMetrics::USER_DID_AUTOFILL_ONCE)); |
| 1233 autofill_manager_->OnDidFillAutofillFormData(); |
| 1234 } |
| 1235 |
| 1236 // Simulate editing an autofilled field. |
| 1237 { |
| 1238 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1239 LogUserHappinessMetric( |
| 1240 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); |
| 1241 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1242 LogUserHappinessMetric( |
| 1243 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE)); |
| 1244 AutofillManager::GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); |
| 1245 AutofillManager::GUIDPair empty(std::string(), 0); |
| 1246 autofill_manager_->OnFillAutofillFormData( |
| 1247 0, form, form.fields.front(), |
| 1248 autofill_manager_->PackGUIDs(empty, guid)); |
| 1249 autofill_manager_->OnTextFieldDidChange(form, form.fields.front()); |
| 1250 // Simulate a second keystroke; make sure we don't log the metric twice. |
| 1251 autofill_manager_->OnTextFieldDidChange(form, form.fields.front()); |
| 1252 } |
| 1253 |
| 1254 // Simulate invoking autofill again. |
| 1255 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1256 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); |
| 1257 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1258 LogUserHappinessMetric( |
| 1259 AutofillMetrics::USER_DID_AUTOFILL_ONCE)).Times(0); |
| 1260 autofill_manager_->OnDidFillAutofillFormData(); |
| 1261 |
| 1262 // Simulate editing another autofilled field. |
| 1263 { |
| 1264 EXPECT_CALL(*autofill_manager_->metric_logger(), |
| 1265 LogUserHappinessMetric( |
| 1266 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); |
| 1267 autofill_manager_->OnTextFieldDidChange(form, form.fields[1]); |
| 1268 } |
| 1269 } |
OLD | NEW |