| OLD | NEW |
| 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 namespace { | 44 namespace { |
| 45 | 45 |
| 46 class MockAutofillMetrics : public AutofillMetrics { | 46 class MockAutofillMetrics : public AutofillMetrics { |
| 47 public: | 47 public: |
| 48 MockAutofillMetrics() {} | 48 MockAutofillMetrics() {} |
| 49 MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric)); | 49 MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric)); |
| 50 MOCK_CONST_METHOD1(LogDeveloperEngagementMetric, | 50 MOCK_CONST_METHOD1(LogDeveloperEngagementMetric, |
| 51 void(DeveloperEngagementMetric metric)); | 51 void(DeveloperEngagementMetric metric)); |
| 52 MOCK_CONST_METHOD3(LogHeuristicTypePrediction, | 52 MOCK_CONST_METHOD3(LogHeuristicTypePrediction, |
| 53 void(FieldTypeQualityMetric metric, | 53 void(FieldTypeQualityMetric metric, |
| 54 AutofillFieldType field_type, | 54 ServerFieldType field_type, |
| 55 const std::string& experiment_id)); | 55 const std::string& experiment_id)); |
| 56 MOCK_CONST_METHOD3(LogOverallTypePrediction, | 56 MOCK_CONST_METHOD3(LogOverallTypePrediction, |
| 57 void(FieldTypeQualityMetric metric, | 57 void(FieldTypeQualityMetric metric, |
| 58 AutofillFieldType field_type, | 58 ServerFieldType field_type, |
| 59 const std::string& experiment_id)); | 59 const std::string& experiment_id)); |
| 60 MOCK_CONST_METHOD3(LogServerTypePrediction, | 60 MOCK_CONST_METHOD3(LogServerTypePrediction, |
| 61 void(FieldTypeQualityMetric metric, | 61 void(FieldTypeQualityMetric metric, |
| 62 AutofillFieldType field_type, | 62 ServerFieldType field_type, |
| 63 const std::string& experiment_id)); | 63 const std::string& experiment_id)); |
| 64 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, | 64 MOCK_CONST_METHOD2(LogQualityMetric, void(QualityMetric metric, |
| 65 const std::string& experiment_id)); | 65 const std::string& experiment_id)); |
| 66 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); | 66 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); |
| 67 MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric)); | 67 MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric)); |
| 68 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithAutofill, | 68 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithAutofill, |
| 69 void(const TimeDelta& duration)); | 69 void(const TimeDelta& duration)); |
| 70 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithoutAutofill, | 70 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithoutAutofill, |
| 71 void(const TimeDelta& duration)); | 71 void(const TimeDelta& duration)); |
| 72 MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithAutofill, | 72 MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithAutofill, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 151 |
| 152 DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); | 152 DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); |
| 153 }; | 153 }; |
| 154 | 154 |
| 155 class TestFormStructure : public FormStructure { | 155 class TestFormStructure : public FormStructure { |
| 156 public: | 156 public: |
| 157 explicit TestFormStructure(const FormData& form) | 157 explicit TestFormStructure(const FormData& form) |
| 158 : FormStructure(form, std::string()) {} | 158 : FormStructure(form, std::string()) {} |
| 159 virtual ~TestFormStructure() {} | 159 virtual ~TestFormStructure() {} |
| 160 | 160 |
| 161 void SetFieldTypes(const std::vector<AutofillFieldType>& heuristic_types, | 161 void SetFieldTypes(const std::vector<ServerFieldType>& heuristic_types, |
| 162 const std::vector<AutofillFieldType>& server_types) { | 162 const std::vector<ServerFieldType>& server_types) { |
| 163 ASSERT_EQ(field_count(), heuristic_types.size()); | 163 ASSERT_EQ(field_count(), heuristic_types.size()); |
| 164 ASSERT_EQ(field_count(), server_types.size()); | 164 ASSERT_EQ(field_count(), server_types.size()); |
| 165 | 165 |
| 166 for (size_t i = 0; i < field_count(); ++i) { | 166 for (size_t i = 0; i < field_count(); ++i) { |
| 167 AutofillField* form_field = field(i); | 167 AutofillField* form_field = field(i); |
| 168 ASSERT_TRUE(form_field); | 168 ASSERT_TRUE(form_field); |
| 169 form_field->set_heuristic_type(heuristic_types[i]); | 169 form_field->set_heuristic_type(heuristic_types[i]); |
| 170 form_field->set_server_type(server_types[i]); | 170 form_field->set_server_type(server_types[i]); |
| 171 } | 171 } |
| 172 | 172 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 void set_autofill_enabled(bool autofill_enabled) { | 205 void set_autofill_enabled(bool autofill_enabled) { |
| 206 autofill_enabled_ = autofill_enabled; | 206 autofill_enabled_ = autofill_enabled; |
| 207 } | 207 } |
| 208 | 208 |
| 209 MockAutofillMetrics* metric_logger() { | 209 MockAutofillMetrics* metric_logger() { |
| 210 return static_cast<MockAutofillMetrics*>(const_cast<AutofillMetrics*>( | 210 return static_cast<MockAutofillMetrics*>(const_cast<AutofillMetrics*>( |
| 211 AutofillManager::metric_logger())); | 211 AutofillManager::metric_logger())); |
| 212 } | 212 } |
| 213 | 213 |
| 214 void AddSeenForm(const FormData& form, | 214 void AddSeenForm(const FormData& form, |
| 215 const std::vector<AutofillFieldType>& heuristic_types, | 215 const std::vector<ServerFieldType>& heuristic_types, |
| 216 const std::vector<AutofillFieldType>& server_types, | 216 const std::vector<ServerFieldType>& server_types, |
| 217 const std::string& experiment_id) { | 217 const std::string& experiment_id) { |
| 218 FormData empty_form = form; | 218 FormData empty_form = form; |
| 219 for (size_t i = 0; i < empty_form.fields.size(); ++i) { | 219 for (size_t i = 0; i < empty_form.fields.size(); ++i) { |
| 220 empty_form.fields[i].value = base::string16(); | 220 empty_form.fields[i].value = base::string16(); |
| 221 } | 221 } |
| 222 | 222 |
| 223 // |form_structure| will be owned by |form_structures()|. | 223 // |form_structure| will be owned by |form_structures()|. |
| 224 TestFormStructure* form_structure = new TestFormStructure(empty_form); | 224 TestFormStructure* form_structure = new TestFormStructure(empty_form); |
| 225 form_structure->SetFieldTypes(heuristic_types, server_types); | 225 form_structure->SetFieldTypes(heuristic_types, server_types); |
| 226 form_structure->set_server_experiment_id(experiment_id); | 226 form_structure->set_server_experiment_id(experiment_id); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 // Test that we log quality metrics appropriately. | 332 // Test that we log quality metrics appropriately. |
| 333 TEST_F(AutofillMetricsTest, QualityMetrics) { | 333 TEST_F(AutofillMetricsTest, QualityMetrics) { |
| 334 // Set up our form data. | 334 // Set up our form data. |
| 335 FormData form; | 335 FormData form; |
| 336 form.name = ASCIIToUTF16("TestForm"); | 336 form.name = ASCIIToUTF16("TestForm"); |
| 337 form.method = ASCIIToUTF16("POST"); | 337 form.method = ASCIIToUTF16("POST"); |
| 338 form.origin = GURL("http://example.com/form.html"); | 338 form.origin = GURL("http://example.com/form.html"); |
| 339 form.action = GURL("http://example.com/submit.html"); | 339 form.action = GURL("http://example.com/submit.html"); |
| 340 form.user_submitted = true; | 340 form.user_submitted = true; |
| 341 | 341 |
| 342 std::vector<AutofillFieldType> heuristic_types, server_types; | 342 std::vector<ServerFieldType> heuristic_types, server_types; |
| 343 FormFieldData field; | 343 FormFieldData field; |
| 344 | 344 |
| 345 test::CreateTestFormField( | 345 test::CreateTestFormField( |
| 346 "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field); | 346 "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field); |
| 347 field.is_autofilled = true; | 347 field.is_autofilled = true; |
| 348 form.fields.push_back(field); | 348 form.fields.push_back(field); |
| 349 heuristic_types.push_back(NAME_FULL); | 349 heuristic_types.push_back(NAME_FULL); |
| 350 server_types.push_back(NAME_FIRST); | 350 server_types.push_back(NAME_FIRST); |
| 351 | 351 |
| 352 test::CreateTestFormField( | 352 test::CreateTestFormField( |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 form.name = ASCIIToUTF16("TestForm"); | 481 form.name = ASCIIToUTF16("TestForm"); |
| 482 form.method = ASCIIToUTF16("POST"); | 482 form.method = ASCIIToUTF16("POST"); |
| 483 form.origin = GURL("http://example.com/form.html"); | 483 form.origin = GURL("http://example.com/form.html"); |
| 484 form.action = GURL("http://example.com/submit.html"); | 484 form.action = GURL("http://example.com/submit.html"); |
| 485 form.user_submitted = true; | 485 form.user_submitted = true; |
| 486 | 486 |
| 487 struct { | 487 struct { |
| 488 const char* label; | 488 const char* label; |
| 489 const char* name; | 489 const char* name; |
| 490 const char* value; | 490 const char* value; |
| 491 AutofillFieldType heuristic_type; | 491 ServerFieldType heuristic_type; |
| 492 AutofillFieldType server_type; | 492 ServerFieldType server_type; |
| 493 AutofillMetrics::QualityMetric heuristic_metric; | 493 AutofillMetrics::QualityMetric heuristic_metric; |
| 494 AutofillMetrics::QualityMetric server_metric; | 494 AutofillMetrics::QualityMetric server_metric; |
| 495 } failure_cases[] = { | 495 } failure_cases[] = { |
| 496 { | 496 { |
| 497 "Heuristics unknown, server unknown", "0,0", "Elvis", | 497 "Heuristics unknown, server unknown", "0,0", "Elvis", |
| 498 UNKNOWN_TYPE, NO_SERVER_DATA, | 498 UNKNOWN_TYPE, NO_SERVER_DATA, |
| 499 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, | 499 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, |
| 500 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN | 500 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN |
| 501 }, | 501 }, |
| 502 { | 502 { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH | 542 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH |
| 543 }, | 543 }, |
| 544 { | 544 { |
| 545 "Heuristics mismatch, server mismatch", "2,2", "38116", | 545 "Heuristics mismatch, server mismatch", "2,2", "38116", |
| 546 PHONE_HOME_NUMBER, PHONE_HOME_NUMBER, | 546 PHONE_HOME_NUMBER, PHONE_HOME_NUMBER, |
| 547 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, | 547 AutofillMetrics::NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, |
| 548 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH | 548 AutofillMetrics::NOT_AUTOFILLED_SERVER_TYPE_MISMATCH |
| 549 } | 549 } |
| 550 }; | 550 }; |
| 551 | 551 |
| 552 std::vector<AutofillFieldType> heuristic_types, server_types; | 552 std::vector<ServerFieldType> heuristic_types, server_types; |
| 553 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { | 553 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(failure_cases); ++i) { |
| 554 FormFieldData field; | 554 FormFieldData field; |
| 555 test::CreateTestFormField(failure_cases[i].label, | 555 test::CreateTestFormField(failure_cases[i].label, |
| 556 failure_cases[i].name, | 556 failure_cases[i].name, |
| 557 failure_cases[i].value, "text", &field); | 557 failure_cases[i].value, "text", &field); |
| 558 form.fields.push_back(field); | 558 form.fields.push_back(field); |
| 559 heuristic_types.push_back(failure_cases[i].heuristic_type); | 559 heuristic_types.push_back(failure_cases[i].heuristic_type); |
| 560 server_types.push_back(failure_cases[i].server_type); | 560 server_types.push_back(failure_cases[i].server_type); |
| 561 | 561 |
| 562 } | 562 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 // one. | 595 // one. |
| 596 TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) { | 596 TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) { |
| 597 // Set up our form data. | 597 // Set up our form data. |
| 598 FormData form; | 598 FormData form; |
| 599 form.name = ASCIIToUTF16("TestForm"); | 599 form.name = ASCIIToUTF16("TestForm"); |
| 600 form.method = ASCIIToUTF16("POST"); | 600 form.method = ASCIIToUTF16("POST"); |
| 601 form.origin = GURL("http://example.com/form.html"); | 601 form.origin = GURL("http://example.com/form.html"); |
| 602 form.action = GURL("http://example.com/submit.html"); | 602 form.action = GURL("http://example.com/submit.html"); |
| 603 form.user_submitted = true; | 603 form.user_submitted = true; |
| 604 | 604 |
| 605 std::vector<AutofillFieldType> heuristic_types, server_types; | 605 std::vector<ServerFieldType> heuristic_types, server_types; |
| 606 | 606 |
| 607 FormFieldData field; | 607 FormFieldData field; |
| 608 test::CreateTestFormField( | 608 test::CreateTestFormField( |
| 609 "Both match", "match", "Elvis Aaron Presley", "text", &field); | 609 "Both match", "match", "Elvis Aaron Presley", "text", &field); |
| 610 field.is_autofilled = true; | 610 field.is_autofilled = true; |
| 611 form.fields.push_back(field); | 611 form.fields.push_back(field); |
| 612 heuristic_types.push_back(NAME_FULL); | 612 heuristic_types.push_back(NAME_FULL); |
| 613 server_types.push_back(NAME_FULL); | 613 server_types.push_back(NAME_FULL); |
| 614 test::CreateTestFormField( | 614 test::CreateTestFormField( |
| 615 "Both mismatch", "mismatch", "buddy@gmail.com", "text", &field); | 615 "Both mismatch", "mismatch", "buddy@gmail.com", "text", &field); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 871 // Test that we recored the experiment id appropriately. | 871 // Test that we recored the experiment id appropriately. |
| 872 TEST_F(AutofillMetricsTest, QualityMetricsWithExperimentId) { | 872 TEST_F(AutofillMetricsTest, QualityMetricsWithExperimentId) { |
| 873 // Set up our form data. | 873 // Set up our form data. |
| 874 FormData form; | 874 FormData form; |
| 875 form.name = ASCIIToUTF16("TestForm"); | 875 form.name = ASCIIToUTF16("TestForm"); |
| 876 form.method = ASCIIToUTF16("POST"); | 876 form.method = ASCIIToUTF16("POST"); |
| 877 form.origin = GURL("http://example.com/form.html"); | 877 form.origin = GURL("http://example.com/form.html"); |
| 878 form.action = GURL("http://example.com/submit.html"); | 878 form.action = GURL("http://example.com/submit.html"); |
| 879 form.user_submitted = true; | 879 form.user_submitted = true; |
| 880 | 880 |
| 881 std::vector<AutofillFieldType> heuristic_types, server_types; | 881 std::vector<ServerFieldType> heuristic_types, server_types; |
| 882 FormFieldData field; | 882 FormFieldData field; |
| 883 | 883 |
| 884 test::CreateTestFormField( | 884 test::CreateTestFormField( |
| 885 "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field); | 885 "Autofilled", "autofilled", "Elvis Aaron Presley", "text", &field); |
| 886 field.is_autofilled = true; | 886 field.is_autofilled = true; |
| 887 form.fields.push_back(field); | 887 form.fields.push_back(field); |
| 888 heuristic_types.push_back(NAME_FULL); | 888 heuristic_types.push_back(NAME_FULL); |
| 889 server_types.push_back(NAME_FIRST); | 889 server_types.push_back(NAME_FIRST); |
| 890 | 890 |
| 891 test::CreateTestFormField( | 891 test::CreateTestFormField( |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { | 1024 TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { |
| 1025 // Set up our form data. | 1025 // Set up our form data. |
| 1026 FormData form; | 1026 FormData form; |
| 1027 form.name = ASCIIToUTF16("TestForm"); | 1027 form.name = ASCIIToUTF16("TestForm"); |
| 1028 form.method = ASCIIToUTF16("POST"); | 1028 form.method = ASCIIToUTF16("POST"); |
| 1029 form.origin = GURL("http://example.com/form.html"); | 1029 form.origin = GURL("http://example.com/form.html"); |
| 1030 form.action = GURL("http://example.com/submit.html"); | 1030 form.action = GURL("http://example.com/submit.html"); |
| 1031 form.user_submitted = true; | 1031 form.user_submitted = true; |
| 1032 | 1032 |
| 1033 FormFieldData field; | 1033 FormFieldData field; |
| 1034 std::vector<AutofillFieldType> field_types; | 1034 std::vector<ServerFieldType> field_types; |
| 1035 test::CreateTestFormField("Name", "name", "", "text", &field); | 1035 test::CreateTestFormField("Name", "name", "", "text", &field); |
| 1036 form.fields.push_back(field); | 1036 form.fields.push_back(field); |
| 1037 field_types.push_back(NAME_FULL); | 1037 field_types.push_back(NAME_FULL); |
| 1038 test::CreateTestFormField("Email", "email", "", "email", &field); | 1038 test::CreateTestFormField("Email", "email", "", "email", &field); |
| 1039 form.fields.push_back(field); | 1039 form.fields.push_back(field); |
| 1040 field_types.push_back(EMAIL_ADDRESS); | 1040 field_types.push_back(EMAIL_ADDRESS); |
| 1041 test::CreateTestFormField("Phone", "phone", "", "tel", &field); | 1041 test::CreateTestFormField("Phone", "phone", "", "tel", &field); |
| 1042 form.fields.push_back(field); | 1042 form.fields.push_back(field); |
| 1043 field_types.push_back(PHONE_HOME_NUMBER); | 1043 field_types.push_back(PHONE_HOME_NUMBER); |
| 1044 | 1044 |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 TimeTicks::FromInternalValue(5)); | 1555 TimeTicks::FromInternalValue(5)); |
| 1556 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 1556 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 1557 TimeTicks::FromInternalValue(3)); | 1557 TimeTicks::FromInternalValue(3)); |
| 1558 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); | 1558 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
| 1559 autofill_manager_->Reset(); | 1559 autofill_manager_->Reset(); |
| 1560 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | 1560 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); |
| 1561 } | 1561 } |
| 1562 } | 1562 } |
| 1563 | 1563 |
| 1564 } // namespace autofill | 1564 } // namespace autofill |
| OLD | NEW |