Index: chrome/browser/autofill/autofill_metrics_unittest.cc |
diff --git a/chrome/browser/autofill/autofill_metrics_unittest.cc b/chrome/browser/autofill/autofill_metrics_unittest.cc |
index 95eb844550616229d11bb5e19e8d8133ba0fe1e2..76a953d18ad80d5e5ce4af8a007ac0d9fd00c8a2 100644 |
--- a/chrome/browser/autofill/autofill_metrics_unittest.cc |
+++ b/chrome/browser/autofill/autofill_metrics_unittest.cc |
@@ -46,6 +46,7 @@ class MockAutofillMetrics : public AutofillMetrics { |
MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, |
const std::string& experiment_id)); |
MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); |
+ MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric)); |
MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); |
MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); |
MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); |
@@ -389,6 +390,9 @@ TEST_F(AutofillMetricsTest, QualityMetrics) { |
EXPECT_CALL(*autofill_manager_->metric_logger(), |
LogQualityMetric(AutofillMetrics::FIELD_AUTOFILLED, |
std::string())); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); |
// Simulate form submission. |
EXPECT_NO_FATAL_FAILURE(autofill_manager_->OnFormSubmitted(form)); |
@@ -1026,3 +1030,240 @@ TEST_F(AutofillMetricsTest, ServerQueryExperimentIdForQuery) { |
"<autofillqueryresponse experimentid=\"ar1\"></autofillqueryresponse>", |
std::vector<FormStructure*>(), metric_logger); |
} |
+ |
+// Verify that we correctly log user happiness metrics dealing with form loading |
+// and form submission. |
+TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) { |
+ // Start with a form with insufficiently many fields. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.method = ASCIIToUTF16("POST"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ FormField field; |
+ autofill_test::CreateTestFormField("Name", "name", "", "text", &field); |
+ form.fields.push_back(field); |
+ autofill_test::CreateTestFormField("Email", "email", "", "text", &field); |
+ form.fields.push_back(field); |
+ |
+ std::vector<FormData> forms(1, form); |
+ |
+ // Expect no notifications when the form is first seen. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)).Times(0); |
+ autofill_manager_->OnFormsSeen(forms); |
+ } |
+ |
+ |
+ // Expect no notifications when the form is submitted. |
+ { |
+ EXPECT_CALL( |
+ *autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)).Times(0); |
+ EXPECT_CALL( |
+ *autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)).Times(0); |
+ EXPECT_CALL( |
+ *autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)).Times(0); |
+ EXPECT_CALL( |
+ *autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)).Times(0); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+ |
+ // Add more fields to the form. |
+ autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field); |
+ form.fields.push_back(field); |
+ autofill_test::CreateTestFormField("Unknown", "unknown", "", "text", &field); |
+ form.fields.push_back(field); |
+ forms.front() = form; |
+ |
+ // Expect a notification when the form is first seen. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); |
+ autofill_manager_->OnFormsSeen(forms); |
+ } |
+ |
+ // Expect a notification when the form is submitted. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+ |
+ // Fill in two of the fields. |
+ form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); |
+ form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); |
+ forms.front() = form; |
+ |
+ // Expect a notification when the form is submitted. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+ |
+ // Fill in the third field. |
+ form.fields[2].value = ASCIIToUTF16("12345678901"); |
+ forms.front() = form; |
+ |
+ // Expect notifications when the form is submitted. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+ |
+ |
+ // Mark one of the fields as autofilled. |
+ form.fields[1].is_autofilled = true; |
+ forms.front() = form; |
+ |
+ // Expect notifications when the form is submitted. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+ |
+ // Mark all of the fillable fields as autofilled. |
+ form.fields[0].is_autofilled = true; |
+ form.fields[2].is_autofilled = true; |
+ forms.front() = form; |
+ |
+ // Expect notifications when the form is submitted. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+ |
+ // Clear out the third field's value. |
+ form.fields[2].value = string16(); |
+ forms.front() = form; |
+ |
+ // Expect notifications when the form is submitted. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); |
+ autofill_manager_->OnFormSubmitted(form); |
+ } |
+} |
+ |
+// Verify that we correctly log user happiness metrics dealing with form |
+// interaction. |
+TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { |
+ // Load a fillable form. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.method = ASCIIToUTF16("POST"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ FormField field; |
+ autofill_test::CreateTestFormField("Name", "name", "", "text", &field); |
+ form.fields.push_back(field); |
+ autofill_test::CreateTestFormField("Email", "email", "", "text", &field); |
+ form.fields.push_back(field); |
+ autofill_test::CreateTestFormField("Phone", "phone", "", "text", &field); |
+ form.fields.push_back(field); |
+ |
+ std::vector<FormData> forms(1, form); |
+ |
+ // Expect a notification when the form is first seen. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); |
+ autofill_manager_->OnFormsSeen(forms); |
+ } |
+ |
+ // Simulate typing. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE)); |
+ autofill_manager_->OnTextFieldDidChange(form, form.fields.front()); |
+ } |
+ |
+ // Simulate suggestions shown twice for a single edit (i.e. multiple |
+ // keystrokes in a single field). |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUGGESTIONS_SHOWN)).Times(1); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(1); |
+ autofill_manager_->OnDidShowAutofillSuggestions(true); |
+ autofill_manager_->OnDidShowAutofillSuggestions(false); |
+ } |
+ |
+ // Simulate suggestions shown for a different field. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(0); |
+ autofill_manager_->OnDidShowAutofillSuggestions(true); |
+ } |
+ |
+ // Simulate invoking autofill. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_AUTOFILL_ONCE)); |
+ autofill_manager_->OnDidFillAutofillFormData(); |
+ } |
+ |
+ // Simulate editing an autofilled field. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE)); |
+ AutofillManager::GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); |
+ AutofillManager::GUIDPair empty(std::string(), 0); |
+ autofill_manager_->OnFillAutofillFormData( |
+ 0, form, form.fields.front(), |
+ autofill_manager_->PackGUIDs(empty, guid)); |
+ autofill_manager_->OnTextFieldDidChange(form, form.fields.front()); |
+ // Simulate a second keystroke; make sure we don't log the metric twice. |
+ autofill_manager_->OnTextFieldDidChange(form, form.fields.front()); |
+ } |
+ |
+ // Simulate invoking autofill again. |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_AUTOFILL_ONCE)).Times(0); |
+ autofill_manager_->OnDidFillAutofillFormData(); |
+ |
+ // Simulate editing another autofilled field. |
+ { |
+ EXPECT_CALL(*autofill_manager_->metric_logger(), |
+ LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); |
+ autofill_manager_->OnTextFieldDidChange(form, form.fields[1]); |
+ } |
+} |