| 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 |