Index: components/autofill/core/browser/autofill_metrics_unittest.cc |
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc |
index d101f879395c0cfd9de4ca60d87252e3ed1a4b3f..46d4581cb34f82455439f4777cc52e1e150e57df 100644 |
--- a/components/autofill/core/browser/autofill_metrics_unittest.cc |
+++ b/components/autofill/core/browser/autofill_metrics_unittest.cc |
@@ -6,6 +6,7 @@ |
#include <vector> |
+#include "base/command_line.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/prefs/pref_service.h" |
#include "base/run_loop.h" |
@@ -20,6 +21,8 @@ |
#include "components/autofill/core/browser/test_autofill_client.h" |
#include "components/autofill/core/browser/test_autofill_driver.h" |
#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" |
+#include "components/autofill/core/common/autofill_pref_names.h" |
+#include "components/autofill/core/common/autofill_switches.h" |
#include "components/autofill/core/common/form_data.h" |
#include "components/autofill/core/common/form_field_data.h" |
#include "components/webdata/common/web_data_results.h" |
@@ -36,7 +39,8 @@ namespace { |
class TestPersonalDataManager : public PersonalDataManager { |
public: |
TestPersonalDataManager() |
- : PersonalDataManager("en-US"), autofill_enabled_(true) { |
+ : PersonalDataManager("en-US"), |
+ autofill_enabled_(true) { |
CreateTestAutofillProfiles(&web_profiles_); |
} |
@@ -46,21 +50,104 @@ class TestPersonalDataManager : public PersonalDataManager { |
// Overridden to avoid a trip to the database. This should be a no-op except |
// for the side-effect of logging the profile count. |
void LoadProfiles() override { |
- std::vector<AutofillProfile*> profiles; |
- web_profiles_.release(&profiles); |
- WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, |
- profiles); |
- pending_profiles_query_ = 123; |
- OnWebDataServiceRequestDone(pending_profiles_query_, &result); |
+ { |
+ std::vector<AutofillProfile*> profiles; |
+ web_profiles_.release(&profiles); |
+ WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, |
+ profiles); |
+ pending_profiles_query_ = 123; |
+ OnWebDataServiceRequestDone(pending_profiles_query_, &result); |
+ } |
+ { |
+ std::vector<AutofillProfile*> profiles; |
+ server_profiles_.release(&profiles); |
+ WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, |
+ profiles); |
+ pending_server_profiles_query_ = 124; |
+ OnWebDataServiceRequestDone(pending_server_profiles_query_, &result); |
+ } |
} |
// Overridden to avoid a trip to the database. |
- void LoadCreditCards() override {} |
+ void LoadCreditCards() override { |
+ { |
+ std::vector<CreditCard*> credit_cards; |
+ local_credit_cards_.release(&credit_cards); |
+ WDResult<std::vector<CreditCard*> > result( |
+ AUTOFILL_CREDITCARDS_RESULT, credit_cards); |
+ pending_creditcards_query_ = 125; |
+ OnWebDataServiceRequestDone(pending_creditcards_query_, &result); |
+ } |
+ { |
+ std::vector<CreditCard*> credit_cards; |
+ server_credit_cards_.release(&credit_cards); |
+ WDResult<std::vector<CreditCard*> > result( |
+ AUTOFILL_CREDITCARDS_RESULT, credit_cards); |
+ pending_server_creditcards_query_ = 126; |
+ OnWebDataServiceRequestDone(pending_server_creditcards_query_, &result); |
+ } |
+ } |
void set_autofill_enabled(bool autofill_enabled) { |
autofill_enabled_ = autofill_enabled; |
} |
+ // Removes all existing profiles and creates 0 or 1 local profiles and 0 or 1 |
+ // server profile according to the paramters. |
+ void RecreateProfiles(bool include_local_profile, |
+ bool include_server_profile) { |
+ web_profiles_.clear(); |
+ server_profiles_.clear(); |
+ if (include_local_profile) { |
+ AutofillProfile* profile = new AutofillProfile; |
+ test::SetProfileInfo(profile, "Elvis", "Aaron", |
+ "Presley", "theking@gmail.com", "RCA", |
+ "3734 Elvis Presley Blvd.", "Apt. 10", |
+ "Memphis", "Tennessee", "38116", "US", |
+ "12345678901"); |
+ profile->set_guid("00000000-0000-0000-0000-000000000001"); |
+ web_profiles_.push_back(profile); |
+ } |
+ if (include_server_profile) { |
+ AutofillProfile* profile = new AutofillProfile( |
+ AutofillProfile::SERVER_PROFILE, "server_id"); |
+ test::SetProfileInfo(profile, "Charles", "Hardin", |
+ "Holley", "buddy@gmail.com", "Decca", |
+ "123 Apple St.", "unit 6", "Lubbock", |
+ "Texas", "79401", "US", "2345678901"); |
+ profile->set_guid("00000000-0000-0000-0000-000000000002"); |
+ server_profiles_.push_back(profile); |
+ } |
+ Refresh(); |
+ } |
+ |
+ // Removes all existing credit cards and creates 0 or 1 local profiles and |
+ // 0 or 1 server profile according to the paramters. |
+ void RecreateCreditCards(bool include_local_credit_card, |
+ bool include_masked_server_credit_card, |
+ bool include_full_server_credit_card) { |
+ local_credit_cards_.clear(); |
+ server_credit_cards_.clear(); |
+ if (include_local_credit_card) { |
+ CreditCard* credit_card = new CreditCard; |
+ credit_card->set_guid("10000000-0000-0000-0000-000000000001"); |
+ local_credit_cards_.push_back(credit_card); |
+ } |
+ if (include_masked_server_credit_card) { |
+ CreditCard* credit_card = new CreditCard( |
+ CreditCard::MASKED_SERVER_CARD, "server_id"); |
+ credit_card->set_guid("10000000-0000-0000-0000-000000000002"); |
+ server_credit_cards_.push_back(credit_card); |
+ } |
+ if (include_full_server_credit_card) { |
+ CreditCard* credit_card = new CreditCard( |
+ CreditCard::FULL_SERVER_CARD, "server_id"); |
+ credit_card->set_guid("10000000-0000-0000-0000-000000000003"); |
+ server_credit_cards_.push_back(credit_card); |
+ } |
+ Refresh(); |
+ } |
+ |
bool IsAutofillEnabled() const override { return autofill_enabled_; } |
private: |
@@ -680,6 +767,314 @@ TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { |
} |
} |
+// Test that we log interacted form event for credit cards only once. |
+TEST_F(AutofillMetricsTest, CreditCardInteractedOnce) { |
+ // Set up our form data. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ FormFieldData field; |
+ std::vector<ServerFieldType> field_types; |
+ test::CreateTestFormField("Month", "card_month", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(CREDIT_CARD_EXP_MONTH); |
+ test::CreateTestFormField("Year", "card_year", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(CREDIT_CARD_EXP_2_DIGIT_YEAR); |
+ test::CreateTestFormField("Credit card", "card", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(CREDIT_CARD_NUMBER); |
+ |
+ // Simulate having seen this form on page load. |
+ // |form_structure| will be owned by |autofill_manager_|. |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field twice. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ autofill_manager_->OnQueryFormFieldAutofill(1, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+} |
+ |
+// Test that we log interacted form event for address only once. |
+TEST_F(AutofillMetricsTest, AddressInteractedOnce) { |
+ // Set up our form data. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ FormFieldData field; |
+ std::vector<ServerFieldType> field_types; |
+ test::CreateTestFormField("State", "state", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(ADDRESS_HOME_STATE); |
+ test::CreateTestFormField("City", "city", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(ADDRESS_HOME_CITY); |
+ test::CreateTestFormField("Street", "street", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(ADDRESS_HOME_STREET_ADDRESS); |
+ |
+ // Simulate having seen this form on page load. |
+ // |form_structure| will be owned by |autofill_manager_|. |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ |
+ { |
+ // Simulate activating the autofill popup for the street field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.Address", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ |
+ { |
+ // Simulate activating the autofill popup for the street field twice. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ autofill_manager_->OnQueryFormFieldAutofill(1, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.Address", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+} |
+ |
+// Test that we log interacted form event for credit cards only once. |
+TEST_F(AutofillMetricsTest, CreditCardFormEventsAreSegmented) { |
+ // Enabling server card. |
+ base::CommandLine::ForCurrentProcess()->AppendSwitch( |
+ ::autofill::switches::kEnableWalletCardImport); |
+ autofill_client_.GetPrefs()->SetBoolean( |
+ ::autofill::prefs::kAutofillWalletImportEnabled, true); |
+ // Set up our form data. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ FormFieldData field; |
+ std::vector<ServerFieldType> field_types; |
+ test::CreateTestFormField("Month", "card_month", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(CREDIT_CARD_EXP_MONTH); |
+ test::CreateTestFormField("Year", "card_year", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(CREDIT_CARD_EXP_2_DIGIT_YEAR); |
+ test::CreateTestFormField("Credit card", "card", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(CREDIT_CARD_NUMBER); |
+ |
+ // Simulate having seen this form on page load. |
+ // |form_structure| will be owned by |autofill_manager_|. |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateCreditCards( |
+ false /* include_local_credit_card */, |
+ false /* include_masked_server_credit_card */, |
+ false /* include_full_server_credit_card */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard.WithNoData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateCreditCards( |
+ true /* include_local_credit_card */, |
+ false /* include_masked_server_credit_card */, |
+ false /* include_full_server_credit_card */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard.WithOnlyLocalData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateCreditCards( |
+ false /* include_local_credit_card */, |
+ true /* include_masked_server_credit_card */, |
+ false /* include_full_server_credit_card */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard.WithOnlyServerData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateCreditCards( |
+ false /* include_local_credit_card */, |
+ false /* include_masked_server_credit_card */, |
+ true /* include_full_server_credit_card */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard.WithOnlyServerData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateCreditCards( |
+ true /* include_local_credit_card */, |
+ false /* include_masked_server_credit_card */, |
+ true /* include_full_server_credit_card */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the credit card field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.CreditCard.WithBothServerAndLocalData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+} |
+ |
+// Test that we log interacted form event for address only once. |
+TEST_F(AutofillMetricsTest, AddressFormEventsAreSegmented) { |
+ // Set up our form data. |
+ FormData form; |
+ form.name = ASCIIToUTF16("TestForm"); |
+ form.origin = GURL("http://example.com/form.html"); |
+ form.action = GURL("http://example.com/submit.html"); |
+ form.user_submitted = true; |
+ |
+ FormFieldData field; |
+ std::vector<ServerFieldType> field_types; |
+ test::CreateTestFormField("State", "state", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(ADDRESS_HOME_STATE); |
+ test::CreateTestFormField("City", "city", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(ADDRESS_HOME_CITY); |
+ test::CreateTestFormField("Street", "street", "", "text", &field); |
+ form.fields.push_back(field); |
+ field_types.push_back(ADDRESS_HOME_STREET_ADDRESS); |
+ |
+ // Simulate having seen this form on page load. |
+ // |form_structure| will be owned by |autofill_manager_|. |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateProfiles(false /* include_local_profile */, |
+ false /* include_server_profile */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the street field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.Address.WithNoData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateProfiles(true /* include_local_profile */, |
+ false /* include_server_profile */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the street field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.Address.WithOnlyLocalData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateProfiles(false /* include_local_profile */, |
+ true /* include_server_profile */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the street field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.Address.WithOnlyServerData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+ |
+ // Reset the autofill manager state. |
+ autofill_manager_->Reset(); |
+ autofill_manager_->AddSeenForm(form, field_types, field_types); |
+ personal_data_->RecreateProfiles(true /* include_local_profile */, |
+ true /* include_server_profile */); |
+ |
+ { |
+ // Simulate activating the autofill popup for the street field. |
+ base::HistogramTester histogram_tester; |
+ autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
+ false); |
+ histogram_tester.ExpectUniqueSample( |
+ "Autofill.FormEvents.Address.WithBothServerAndLocalData", |
+ AutofillMetrics::FORM_EVENT_INTERACTED_ONCE, 1); |
+ } |
+} |
+ |
+ |
// Test that we log that Autofill is enabled when filling a form. |
TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) { |
base::HistogramTester histogram_tester; |