| 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" | |
| 10 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| 12 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 13 #include "base/strings/string16.h" | 12 #include "base/strings/string16.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/test/histogram_tester.h" |
| 15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 16 #include "components/autofill/core/browser/autofill_external_delegate.h" | 16 #include "components/autofill/core/browser/autofill_external_delegate.h" |
| 17 #include "components/autofill/core/browser/autofill_manager.h" | 17 #include "components/autofill/core/browser/autofill_manager.h" |
| 18 #include "components/autofill/core/browser/autofill_test_utils.h" | 18 #include "components/autofill/core/browser/autofill_test_utils.h" |
| 19 #include "components/autofill/core/browser/personal_data_manager.h" | 19 #include "components/autofill/core/browser/personal_data_manager.h" |
| 20 #include "components/autofill/core/browser/test_autofill_client.h" | 20 #include "components/autofill/core/browser/test_autofill_client.h" |
| 21 #include "components/autofill/core/browser/test_autofill_driver.h" | 21 #include "components/autofill/core/browser/test_autofill_driver.h" |
| 22 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" | 22 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" |
| 23 #include "components/autofill/core/common/form_data.h" | 23 #include "components/autofill/core/common/form_data.h" |
| 24 #include "components/autofill/core/common/form_field_data.h" | 24 #include "components/autofill/core/common/form_field_data.h" |
| 25 #include "components/webdata/common/web_data_results.h" | 25 #include "components/webdata/common/web_data_results.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "ui/gfx/rect.h" | 27 #include "ui/gfx/rect.h" |
| 29 #include "url/gurl.h" | 28 #include "url/gurl.h" |
| 30 | 29 |
| 31 using base::ASCIIToUTF16; | 30 using base::ASCIIToUTF16; |
| 32 using base::TimeDelta; | |
| 33 using base::TimeTicks; | 31 using base::TimeTicks; |
| 34 using testing::_; | |
| 35 using testing::AnyNumber; | |
| 36 using testing::Mock; | |
| 37 | 32 |
| 38 namespace autofill { | 33 namespace autofill { |
| 39 | |
| 40 namespace { | 34 namespace { |
| 41 | 35 |
| 42 class MockAutofillMetrics : public AutofillMetrics { | |
| 43 public: | |
| 44 MockAutofillMetrics() {} | |
| 45 MOCK_CONST_METHOD1(LogCreditCardInfoBarMetric, void(InfoBarMetric metric)); | |
| 46 MOCK_CONST_METHOD1(LogDeveloperEngagementMetric, | |
| 47 void(DeveloperEngagementMetric metric)); | |
| 48 MOCK_CONST_METHOD2(LogHeuristicTypePrediction, | |
| 49 void(FieldTypeQualityMetric metric, | |
| 50 ServerFieldType field_type)); | |
| 51 MOCK_CONST_METHOD2(LogOverallTypePrediction, | |
| 52 void(FieldTypeQualityMetric metric, | |
| 53 ServerFieldType field_type)); | |
| 54 MOCK_CONST_METHOD2(LogServerTypePrediction, | |
| 55 void(FieldTypeQualityMetric metric, | |
| 56 ServerFieldType field_type)); | |
| 57 MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric)); | |
| 58 MOCK_CONST_METHOD1(LogUserHappinessMetric, void(UserHappinessMetric metric)); | |
| 59 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithAutofill, | |
| 60 void(const TimeDelta& duration)); | |
| 61 MOCK_CONST_METHOD1(LogFormFillDurationFromLoadWithoutAutofill, | |
| 62 void(const TimeDelta& duration)); | |
| 63 MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithAutofill, | |
| 64 void(const TimeDelta& duration)); | |
| 65 MOCK_CONST_METHOD1(LogFormFillDurationFromInteractionWithoutAutofill, | |
| 66 void(const TimeDelta& duration)); | |
| 67 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtPageLoad, void(bool enabled)); | |
| 68 MOCK_CONST_METHOD1(LogIsAutofillEnabledAtStartup, void(bool enabled)); | |
| 69 MOCK_CONST_METHOD1(LogStoredProfileCount, void(size_t num_profiles)); | |
| 70 MOCK_CONST_METHOD1(LogAddressSuggestionsCount, void(size_t num_suggestions)); | |
| 71 | |
| 72 private: | |
| 73 DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); | |
| 74 }; | |
| 75 | |
| 76 class TestPersonalDataManager : public PersonalDataManager { | 36 class TestPersonalDataManager : public PersonalDataManager { |
| 77 public: | 37 public: |
| 78 TestPersonalDataManager() | 38 TestPersonalDataManager() |
| 79 : PersonalDataManager("en-US"), | 39 : PersonalDataManager("en-US"), autofill_enabled_(true) { |
| 80 autofill_enabled_(true) { | |
| 81 set_metric_logger(new testing::NiceMock<MockAutofillMetrics>()); | |
| 82 CreateTestAutofillProfiles(&web_profiles_); | 40 CreateTestAutofillProfiles(&web_profiles_); |
| 83 } | 41 } |
| 84 | 42 |
| 85 using PersonalDataManager::set_database; | 43 using PersonalDataManager::set_database; |
| 86 using PersonalDataManager::SetPrefService; | 44 using PersonalDataManager::SetPrefService; |
| 87 | 45 |
| 88 // Overridden to avoid a trip to the database. This should be a no-op except | 46 // Overridden to avoid a trip to the database. This should be a no-op except |
| 89 // for the side-effect of logging the profile count. | 47 // for the side-effect of logging the profile count. |
| 90 virtual void LoadProfiles() override { | 48 virtual void LoadProfiles() override { |
| 91 std::vector<AutofillProfile*> profiles; | 49 std::vector<AutofillProfile*> profiles; |
| 92 web_profiles_.release(&profiles); | 50 web_profiles_.release(&profiles); |
| 93 WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, | 51 WDResult<std::vector<AutofillProfile*> > result(AUTOFILL_PROFILES_RESULT, |
| 94 profiles); | 52 profiles); |
| 95 ReceiveLoadedProfiles(0, &result); | 53 ReceiveLoadedProfiles(0, &result); |
| 96 } | 54 } |
| 97 | 55 |
| 98 // Overridden to avoid a trip to the database. | 56 // Overridden to avoid a trip to the database. |
| 99 virtual void LoadCreditCards() override {} | 57 virtual void LoadCreditCards() override {} |
| 100 | 58 |
| 101 const MockAutofillMetrics* metric_logger() const { | |
| 102 return static_cast<const MockAutofillMetrics*>( | |
| 103 PersonalDataManager::metric_logger()); | |
| 104 } | |
| 105 | |
| 106 void set_autofill_enabled(bool autofill_enabled) { | 59 void set_autofill_enabled(bool autofill_enabled) { |
| 107 autofill_enabled_ = autofill_enabled; | 60 autofill_enabled_ = autofill_enabled; |
| 108 } | 61 } |
| 109 | 62 |
| 110 virtual bool IsAutofillEnabled() const override { | 63 virtual bool IsAutofillEnabled() const override { |
| 111 return autofill_enabled_; | 64 return autofill_enabled_; |
| 112 } | 65 } |
| 113 | 66 |
| 114 MOCK_METHOD1(SaveImportedCreditCard, | |
| 115 std::string(const CreditCard& imported_credit_card)); | |
| 116 | |
| 117 private: | 67 private: |
| 118 void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) { | 68 void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) { |
| 119 AutofillProfile* profile = new AutofillProfile; | 69 AutofillProfile* profile = new AutofillProfile; |
| 120 test::SetProfileInfo(profile, "Elvis", "Aaron", | 70 test::SetProfileInfo(profile, "Elvis", "Aaron", |
| 121 "Presley", "theking@gmail.com", "RCA", | 71 "Presley", "theking@gmail.com", "RCA", |
| 122 "3734 Elvis Presley Blvd.", "Apt. 10", | 72 "3734 Elvis Presley Blvd.", "Apt. 10", |
| 123 "Memphis", "Tennessee", "38116", "US", | 73 "Memphis", "Tennessee", "38116", "US", |
| 124 "12345678901"); | 74 "12345678901"); |
| 125 profile->set_guid("00000000-0000-0000-0000-000000000001"); | 75 profile->set_guid("00000000-0000-0000-0000-000000000001"); |
| 126 profiles->push_back(profile); | 76 profiles->push_back(profile); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 private: | 111 private: |
| 162 DISALLOW_COPY_AND_ASSIGN(TestFormStructure); | 112 DISALLOW_COPY_AND_ASSIGN(TestFormStructure); |
| 163 }; | 113 }; |
| 164 | 114 |
| 165 class TestAutofillManager : public AutofillManager { | 115 class TestAutofillManager : public AutofillManager { |
| 166 public: | 116 public: |
| 167 TestAutofillManager(AutofillDriver* driver, | 117 TestAutofillManager(AutofillDriver* driver, |
| 168 AutofillClient* autofill_client, | 118 AutofillClient* autofill_client, |
| 169 TestPersonalDataManager* personal_manager) | 119 TestPersonalDataManager* personal_manager) |
| 170 : AutofillManager(driver, autofill_client, personal_manager), | 120 : AutofillManager(driver, autofill_client, personal_manager), |
| 171 autofill_enabled_(true) { | 121 autofill_enabled_(true) {} |
| 172 set_metric_logger(new testing::NiceMock<MockAutofillMetrics>); | |
| 173 } | |
| 174 ~TestAutofillManager() override {} | 122 ~TestAutofillManager() override {} |
| 175 | 123 |
| 176 bool IsAutofillEnabled() const override { return autofill_enabled_; } | 124 bool IsAutofillEnabled() const override { return autofill_enabled_; } |
| 177 | 125 |
| 178 void set_autofill_enabled(bool autofill_enabled) { | 126 void set_autofill_enabled(bool autofill_enabled) { |
| 179 autofill_enabled_ = autofill_enabled; | 127 autofill_enabled_ = autofill_enabled; |
| 180 } | 128 } |
| 181 | 129 |
| 182 MockAutofillMetrics* metric_logger() { | |
| 183 return static_cast<MockAutofillMetrics*>(const_cast<AutofillMetrics*>( | |
| 184 AutofillManager::metric_logger())); | |
| 185 } | |
| 186 | |
| 187 void AddSeenForm(const FormData& form, | 130 void AddSeenForm(const FormData& form, |
| 188 const std::vector<ServerFieldType>& heuristic_types, | 131 const std::vector<ServerFieldType>& heuristic_types, |
| 189 const std::vector<ServerFieldType>& server_types) { | 132 const std::vector<ServerFieldType>& server_types) { |
| 190 FormData empty_form = form; | 133 FormData empty_form = form; |
| 191 for (size_t i = 0; i < empty_form.fields.size(); ++i) { | 134 for (size_t i = 0; i < empty_form.fields.size(); ++i) { |
| 192 empty_form.fields[i].value = base::string16(); | 135 empty_form.fields[i].value = base::string16(); |
| 193 } | 136 } |
| 194 | 137 |
| 195 // |form_structure| will be owned by |form_structures()|. | 138 // |form_structure| will be owned by |form_structures()|. |
| 196 TestFormStructure* form_structure = new TestFormStructure(empty_form); | 139 TestFormStructure* form_structure = new TestFormStructure(empty_form); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 222 | 165 |
| 223 private: | 166 private: |
| 224 bool autofill_enabled_; | 167 bool autofill_enabled_; |
| 225 scoped_ptr<base::RunLoop> run_loop_; | 168 scoped_ptr<base::RunLoop> run_loop_; |
| 226 | 169 |
| 227 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); | 170 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); |
| 228 }; | 171 }; |
| 229 | 172 |
| 230 } // namespace | 173 } // namespace |
| 231 | 174 |
| 175 // This is defined in the autofill_metrics.cc implementation file. |
| 176 int GetFieldTypeGroupMetric(ServerFieldType field_type, |
| 177 AutofillMetrics::FieldTypeQualityMetric metric); |
| 178 |
| 232 class AutofillMetricsTest : public testing::Test { | 179 class AutofillMetricsTest : public testing::Test { |
| 233 public: | 180 public: |
| 234 ~AutofillMetricsTest() override; | 181 ~AutofillMetricsTest() override; |
| 235 | 182 |
| 236 void SetUp() override; | 183 void SetUp() override; |
| 237 void TearDown() override; | 184 void TearDown() override; |
| 238 | 185 |
| 239 protected: | 186 protected: |
| 240 base::MessageLoop message_loop_; | 187 base::MessageLoop message_loop_; |
| 241 TestAutofillClient autofill_client_; | 188 TestAutofillClient autofill_client_; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 | 271 |
| 325 test::CreateTestFormField("Phone", "phone", "2345678901", "tel", &field); | 272 test::CreateTestFormField("Phone", "phone", "2345678901", "tel", &field); |
| 326 field.is_autofilled = true; | 273 field.is_autofilled = true; |
| 327 form.fields.push_back(field); | 274 form.fields.push_back(field); |
| 328 heuristic_types.push_back(PHONE_HOME_CITY_AND_NUMBER); | 275 heuristic_types.push_back(PHONE_HOME_CITY_AND_NUMBER); |
| 329 server_types.push_back(PHONE_HOME_WHOLE_NUMBER); | 276 server_types.push_back(PHONE_HOME_WHOLE_NUMBER); |
| 330 | 277 |
| 331 // Simulate having seen this form on page load. | 278 // Simulate having seen this form on page load. |
| 332 autofill_manager_->AddSeenForm(form, heuristic_types, server_types); | 279 autofill_manager_->AddSeenForm(form, heuristic_types, server_types); |
| 333 | 280 |
| 334 // Establish our expectations. | 281 // Simulate form submission. |
| 335 ::testing::InSequence dummy; | 282 base::HistogramTester histogram_tester; |
| 336 // Autofilled field | 283 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 337 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 338 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 339 NAME_FULL)); | |
| 340 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 341 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 342 NAME_FULL)); | |
| 343 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 344 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 345 NAME_FULL)); | |
| 346 // Non-autofilled field for which we had data | |
| 347 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 348 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 349 EMAIL_ADDRESS)); | |
| 350 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 351 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 352 EMAIL_ADDRESS)); | |
| 353 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 354 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 355 EMAIL_ADDRESS)); | |
| 356 // Empty field | |
| 357 // Unknown field | |
| 358 // <select> field | |
| 359 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 360 LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN, | |
| 361 ADDRESS_HOME_COUNTRY)); | |
| 362 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 363 LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN, | |
| 364 ADDRESS_HOME_COUNTRY)); | |
| 365 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 366 LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN, | |
| 367 ADDRESS_HOME_COUNTRY)); | |
| 368 // Phone field | |
| 369 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 370 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 371 PHONE_HOME_WHOLE_NUMBER)); | |
| 372 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 373 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 374 PHONE_HOME_WHOLE_NUMBER)); | |
| 375 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 376 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 377 PHONE_HOME_WHOLE_NUMBER)); | |
| 378 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 379 LogUserHappinessMetric( | |
| 380 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); | |
| 381 | 284 |
| 382 // Simulate form submission. | 285 // Heuristic predictions. |
| 383 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, | 286 // Unknown: |
| 384 TimeTicks::Now())); | 287 histogram_tester.ExpectBucketCount("Autofill.Quality.HeuristicType", |
| 288 AutofillMetrics::TYPE_UNKNOWN, 1); |
| 289 histogram_tester.ExpectBucketCount( |
| 290 "Autofill.Quality.HeuristicType.ByFieldType", |
| 291 GetFieldTypeGroupMetric(ADDRESS_HOME_COUNTRY, |
| 292 AutofillMetrics::TYPE_UNKNOWN), |
| 293 1); |
| 294 // Match: |
| 295 histogram_tester.ExpectBucketCount("Autofill.Quality.HeuristicType", |
| 296 AutofillMetrics::TYPE_MATCH, 2); |
| 297 histogram_tester.ExpectBucketCount( |
| 298 "Autofill.Quality.HeuristicType.ByFieldType", |
| 299 GetFieldTypeGroupMetric(NAME_FULL, AutofillMetrics::TYPE_MATCH), 1); |
| 300 histogram_tester.ExpectBucketCount( |
| 301 "Autofill.Quality.HeuristicType.ByFieldType", |
| 302 GetFieldTypeGroupMetric(PHONE_HOME_WHOLE_NUMBER, |
| 303 AutofillMetrics::TYPE_MATCH), |
| 304 1); |
| 305 // Mismatch: |
| 306 histogram_tester.ExpectBucketCount("Autofill.Quality.HeuristicType", |
| 307 AutofillMetrics::TYPE_MISMATCH, 1); |
| 308 histogram_tester.ExpectBucketCount( |
| 309 "Autofill.Quality.HeuristicType.ByFieldType", |
| 310 GetFieldTypeGroupMetric(EMAIL_ADDRESS, AutofillMetrics::TYPE_MISMATCH), |
| 311 1); |
| 312 |
| 313 // Server predictions: |
| 314 // Unknown: |
| 315 histogram_tester.ExpectBucketCount("Autofill.Quality.ServerType", |
| 316 AutofillMetrics::TYPE_UNKNOWN, 1); |
| 317 histogram_tester.ExpectBucketCount( |
| 318 "Autofill.Quality.ServerType.ByFieldType", |
| 319 GetFieldTypeGroupMetric(ADDRESS_HOME_COUNTRY, |
| 320 AutofillMetrics::TYPE_UNKNOWN), |
| 321 1); |
| 322 // Match: |
| 323 histogram_tester.ExpectBucketCount("Autofill.Quality.ServerType", |
| 324 AutofillMetrics::TYPE_MATCH, 2); |
| 325 histogram_tester.ExpectBucketCount( |
| 326 "Autofill.Quality.ServerType.ByFieldType", |
| 327 GetFieldTypeGroupMetric(EMAIL_ADDRESS, AutofillMetrics::TYPE_MATCH), 1); |
| 328 histogram_tester.ExpectBucketCount( |
| 329 "Autofill.Quality.ServerType.ByFieldType", |
| 330 GetFieldTypeGroupMetric(PHONE_HOME_WHOLE_NUMBER, |
| 331 AutofillMetrics::TYPE_MATCH), |
| 332 1); |
| 333 // Mismatch: |
| 334 histogram_tester.ExpectBucketCount("Autofill.Quality.ServerType", |
| 335 AutofillMetrics::TYPE_MISMATCH, 1); |
| 336 histogram_tester.ExpectBucketCount( |
| 337 "Autofill.Quality.ServerType.ByFieldType", |
| 338 GetFieldTypeGroupMetric(NAME_FULL, AutofillMetrics::TYPE_MISMATCH), 1); |
| 339 |
| 340 // Overall predictions: |
| 341 // Unknown: |
| 342 histogram_tester.ExpectBucketCount("Autofill.Quality.PredictedType", |
| 343 AutofillMetrics::TYPE_UNKNOWN, 1); |
| 344 histogram_tester.ExpectBucketCount( |
| 345 "Autofill.Quality.PredictedType.ByFieldType", |
| 346 GetFieldTypeGroupMetric(ADDRESS_HOME_COUNTRY, |
| 347 AutofillMetrics::TYPE_UNKNOWN), |
| 348 1); |
| 349 // Match: |
| 350 histogram_tester.ExpectBucketCount("Autofill.Quality.PredictedType", |
| 351 AutofillMetrics::TYPE_MATCH, 2); |
| 352 histogram_tester.ExpectBucketCount( |
| 353 "Autofill.Quality.PredictedType.ByFieldType", |
| 354 GetFieldTypeGroupMetric(EMAIL_ADDRESS, AutofillMetrics::TYPE_MATCH), 1); |
| 355 histogram_tester.ExpectBucketCount( |
| 356 "Autofill.Quality.PredictedType.ByFieldType", |
| 357 GetFieldTypeGroupMetric(PHONE_HOME_WHOLE_NUMBER, |
| 358 AutofillMetrics::TYPE_MATCH), |
| 359 1); |
| 360 // Mismatch: |
| 361 histogram_tester.ExpectBucketCount("Autofill.Quality.PredictedType", |
| 362 AutofillMetrics::TYPE_MISMATCH, 1); |
| 363 histogram_tester.ExpectBucketCount( |
| 364 "Autofill.Quality.PredictedType.ByFieldType", |
| 365 GetFieldTypeGroupMetric(NAME_FULL, AutofillMetrics::TYPE_MISMATCH), 1); |
| 385 } | 366 } |
| 386 | 367 |
| 387 // Test that we behave sanely when the cached form differs from the submitted | 368 // Test that we behave sanely when the cached form differs from the submitted |
| 388 // one. | 369 // one. |
| 389 TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) { | 370 TEST_F(AutofillMetricsTest, SaneMetricsWithCacheMismatch) { |
| 390 // Set up our form data. | 371 // Set up our form data. |
| 391 FormData form; | 372 FormData form; |
| 392 form.name = ASCIIToUTF16("TestForm"); | 373 form.name = ASCIIToUTF16("TestForm"); |
| 393 form.origin = GURL("http://example.com/form.html"); | 374 form.origin = GURL("http://example.com/form.html"); |
| 394 form.action = GURL("http://example.com/submit.html"); | 375 form.action = GURL("http://example.com/submit.html"); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 std::vector<FormFieldData> cached_fields = form.fields; | 411 std::vector<FormFieldData> cached_fields = form.fields; |
| 431 form.fields.clear(); | 412 form.fields.clear(); |
| 432 test::CreateTestFormField( | 413 test::CreateTestFormField( |
| 433 "New field", "new field", "Tennessee", "text", &field); | 414 "New field", "new field", "Tennessee", "text", &field); |
| 434 form.fields.push_back(field); | 415 form.fields.push_back(field); |
| 435 form.fields.push_back(cached_fields[2]); | 416 form.fields.push_back(cached_fields[2]); |
| 436 form.fields.push_back(cached_fields[1]); | 417 form.fields.push_back(cached_fields[1]); |
| 437 form.fields.push_back(cached_fields[3]); | 418 form.fields.push_back(cached_fields[3]); |
| 438 form.fields.push_back(cached_fields[0]); | 419 form.fields.push_back(cached_fields[0]); |
| 439 | 420 |
| 440 // Establish our expectations. | 421 // Simulate form submission. |
| 441 ::testing::InSequence dummy; | 422 base::HistogramTester histogram_tester; |
| 442 // New field | 423 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 443 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 444 LogHeuristicTypePrediction(AutofillMetrics::TYPE_UNKNOWN, | |
| 445 ADDRESS_HOME_STATE)); | |
| 446 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 447 LogServerTypePrediction(AutofillMetrics::TYPE_UNKNOWN, | |
| 448 ADDRESS_HOME_STATE)); | |
| 449 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 450 LogOverallTypePrediction(AutofillMetrics::TYPE_UNKNOWN, | |
| 451 ADDRESS_HOME_STATE)); | |
| 452 // Only heuristics match | |
| 453 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 454 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 455 ADDRESS_HOME_CITY)); | |
| 456 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 457 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 458 ADDRESS_HOME_CITY)); | |
| 459 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 460 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 461 ADDRESS_HOME_CITY)); | |
| 462 // Both mismatch | |
| 463 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 464 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 465 EMAIL_ADDRESS)); | |
| 466 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 467 LogServerTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 468 EMAIL_ADDRESS)); | |
| 469 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 470 LogOverallTypePrediction(AutofillMetrics::TYPE_MISMATCH, | |
| 471 EMAIL_ADDRESS)); | |
| 472 // Unknown | |
| 473 // Both match | |
| 474 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 475 LogHeuristicTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 476 NAME_FULL)); | |
| 477 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 478 LogServerTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 479 NAME_FULL)); | |
| 480 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 481 LogOverallTypePrediction(AutofillMetrics::TYPE_MATCH, | |
| 482 NAME_FULL)); | |
| 483 | 424 |
| 484 // Simulate form submission. | 425 // Heuristic predictions. |
| 485 EXPECT_NO_FATAL_FAILURE(autofill_manager_->FormSubmitted(form, | 426 // Unknown: |
| 486 TimeTicks::Now())); | 427 histogram_tester.ExpectBucketCount("Autofill.Quality.HeuristicType", |
| 428 AutofillMetrics::TYPE_UNKNOWN, 1); |
| 429 histogram_tester.ExpectBucketCount( |
| 430 "Autofill.Quality.HeuristicType.ByFieldType", |
| 431 GetFieldTypeGroupMetric(ADDRESS_HOME_STATE, |
| 432 AutofillMetrics::TYPE_UNKNOWN), |
| 433 1); |
| 434 // Match: |
| 435 histogram_tester.ExpectBucketCount("Autofill.Quality.HeuristicType", |
| 436 AutofillMetrics::TYPE_MATCH, 2); |
| 437 histogram_tester.ExpectBucketCount( |
| 438 "Autofill.Quality.HeuristicType.ByFieldType", |
| 439 GetFieldTypeGroupMetric(ADDRESS_HOME_CITY, AutofillMetrics::TYPE_MATCH), |
| 440 1); |
| 441 histogram_tester.ExpectBucketCount( |
| 442 "Autofill.Quality.HeuristicType.ByFieldType", |
| 443 GetFieldTypeGroupMetric(NAME_FULL, AutofillMetrics::TYPE_MATCH), 1); |
| 444 // Mismatch: |
| 445 histogram_tester.ExpectBucketCount("Autofill.Quality.HeuristicType", |
| 446 AutofillMetrics::TYPE_MISMATCH, 1); |
| 447 histogram_tester.ExpectBucketCount( |
| 448 "Autofill.Quality.HeuristicType.ByFieldType", |
| 449 GetFieldTypeGroupMetric(EMAIL_ADDRESS, AutofillMetrics::TYPE_MISMATCH), |
| 450 1); |
| 451 |
| 452 // Server predictions: |
| 453 // Unknown: |
| 454 histogram_tester.ExpectBucketCount("Autofill.Quality.ServerType", |
| 455 AutofillMetrics::TYPE_UNKNOWN, 1); |
| 456 histogram_tester.ExpectBucketCount( |
| 457 "Autofill.Quality.ServerType.ByFieldType", |
| 458 GetFieldTypeGroupMetric(ADDRESS_HOME_STATE, |
| 459 AutofillMetrics::TYPE_UNKNOWN), |
| 460 1); |
| 461 // Match: |
| 462 histogram_tester.ExpectBucketCount("Autofill.Quality.ServerType", |
| 463 AutofillMetrics::TYPE_MATCH, 1); |
| 464 histogram_tester.ExpectBucketCount( |
| 465 "Autofill.Quality.ServerType.ByFieldType", |
| 466 GetFieldTypeGroupMetric(NAME_FULL, AutofillMetrics::TYPE_MATCH), 1); |
| 467 // Mismatch: |
| 468 histogram_tester.ExpectBucketCount("Autofill.Quality.ServerType", |
| 469 AutofillMetrics::TYPE_MISMATCH, 2); |
| 470 histogram_tester.ExpectBucketCount( |
| 471 "Autofill.Quality.ServerType.ByFieldType", |
| 472 GetFieldTypeGroupMetric(ADDRESS_HOME_CITY, |
| 473 AutofillMetrics::TYPE_MISMATCH), |
| 474 1); |
| 475 histogram_tester.ExpectBucketCount( |
| 476 "Autofill.Quality.ServerType.ByFieldType", |
| 477 GetFieldTypeGroupMetric(EMAIL_ADDRESS, AutofillMetrics::TYPE_MISMATCH), |
| 478 1); |
| 479 |
| 480 // Overall predictions: |
| 481 // Unknown: |
| 482 histogram_tester.ExpectBucketCount("Autofill.Quality.PredictedType", |
| 483 AutofillMetrics::TYPE_UNKNOWN, 1); |
| 484 histogram_tester.ExpectBucketCount( |
| 485 "Autofill.Quality.PredictedType.ByFieldType", |
| 486 GetFieldTypeGroupMetric(ADDRESS_HOME_STATE, |
| 487 AutofillMetrics::TYPE_UNKNOWN), |
| 488 1); |
| 489 // Match: |
| 490 histogram_tester.ExpectBucketCount("Autofill.Quality.PredictedType", |
| 491 AutofillMetrics::TYPE_MATCH, 1); |
| 492 histogram_tester.ExpectBucketCount( |
| 493 "Autofill.Quality.PredictedType.ByFieldType", |
| 494 GetFieldTypeGroupMetric(NAME_FULL, AutofillMetrics::TYPE_MATCH), 1); |
| 495 // Mismatch: |
| 496 histogram_tester.ExpectBucketCount("Autofill.Quality.PredictedType", |
| 497 AutofillMetrics::TYPE_MISMATCH, 2); |
| 498 histogram_tester.ExpectBucketCount( |
| 499 "Autofill.Quality.PredictedType.ByFieldType", |
| 500 GetFieldTypeGroupMetric(ADDRESS_HOME_CITY, |
| 501 AutofillMetrics::TYPE_MISMATCH), |
| 502 1); |
| 503 histogram_tester.ExpectBucketCount( |
| 504 "Autofill.Quality.PredictedType.ByFieldType", |
| 505 GetFieldTypeGroupMetric(EMAIL_ADDRESS, AutofillMetrics::TYPE_MISMATCH), |
| 506 1); |
| 487 } | 507 } |
| 488 | 508 |
| 489 // Verify that we correctly log metrics regarding developer engagement. | 509 // Verify that we correctly log metrics regarding developer engagement. |
| 490 TEST_F(AutofillMetricsTest, DeveloperEngagement) { | 510 TEST_F(AutofillMetricsTest, DeveloperEngagement) { |
| 491 // Start with a non-fillable form. | 511 // Start with a non-fillable form. |
| 492 FormData form; | 512 FormData form; |
| 493 form.name = ASCIIToUTF16("TestForm"); | 513 form.name = ASCIIToUTF16("TestForm"); |
| 494 form.origin = GURL("http://example.com/form.html"); | 514 form.origin = GURL("http://example.com/form.html"); |
| 495 form.action = GURL("http://example.com/submit.html"); | 515 form.action = GURL("http://example.com/submit.html"); |
| 496 | 516 |
| 497 FormFieldData field; | 517 FormFieldData field; |
| 498 test::CreateTestFormField("Name", "name", "", "text", &field); | 518 test::CreateTestFormField("Name", "name", "", "text", &field); |
| 499 form.fields.push_back(field); | 519 form.fields.push_back(field); |
| 500 test::CreateTestFormField("Email", "email", "", "text", &field); | 520 test::CreateTestFormField("Email", "email", "", "text", &field); |
| 501 form.fields.push_back(field); | 521 form.fields.push_back(field); |
| 502 | 522 |
| 503 std::vector<FormData> forms(1, form); | 523 std::vector<FormData> forms(1, form); |
| 504 | 524 |
| 505 // Ensure no metrics are logged when loading a non-fillable form. | 525 // Ensure no metrics are logged when loading a non-fillable form. |
| 506 { | 526 { |
| 507 EXPECT_CALL(*autofill_manager_->metric_logger(), | 527 base::HistogramTester histogram_tester; |
| 508 LogDeveloperEngagementMetric(_)).Times(0); | |
| 509 autofill_manager_->OnFormsSeen(forms, TimeTicks()); | 528 autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
| 510 autofill_manager_->Reset(); | 529 autofill_manager_->Reset(); |
| 511 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | 530 histogram_tester.ExpectTotalCount("Autofill.DeveloperEngagement", 0); |
| 512 } | 531 } |
| 513 | 532 |
| 514 // Add another field to the form, so that it becomes fillable. | 533 // Add another field to the form, so that it becomes fillable. |
| 515 test::CreateTestFormField("Phone", "phone", "", "text", &field); | 534 test::CreateTestFormField("Phone", "phone", "", "text", &field); |
| 516 forms.back().fields.push_back(field); | 535 forms.back().fields.push_back(field); |
| 517 | 536 |
| 518 // Expect only the "form parsed" metric to be logged; no metrics about | 537 // Expect only the "form parsed" metric to be logged; no metrics about |
| 519 // author-specified field type hints. | 538 // author-specified field type hints. |
| 520 { | 539 { |
| 521 EXPECT_CALL( | 540 base::HistogramTester histogram_tester; |
| 522 *autofill_manager_->metric_logger(), | |
| 523 LogDeveloperEngagementMetric( | |
| 524 AutofillMetrics::FILLABLE_FORM_PARSED)).Times(1); | |
| 525 EXPECT_CALL( | |
| 526 *autofill_manager_->metric_logger(), | |
| 527 LogDeveloperEngagementMetric( | |
| 528 AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS)).Times(0); | |
| 529 autofill_manager_->OnFormsSeen(forms, TimeTicks()); | 541 autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
| 530 autofill_manager_->Reset(); | 542 autofill_manager_->Reset(); |
| 531 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | 543 histogram_tester.ExpectUniqueSample("Autofill.DeveloperEngagement", |
| 544 AutofillMetrics::FILLABLE_FORM_PARSED, |
| 545 1); |
| 532 } | 546 } |
| 533 | 547 |
| 534 // Add some fields with an author-specified field type to the form. | 548 // Add some fields with an author-specified field type to the form. |
| 535 // We need to add at least three fields, because a form must have at least | 549 // We need to add at least three fields, because a form must have at least |
| 536 // three fillable fields to be considered to be autofillable; and if at least | 550 // three fillable fields to be considered to be autofillable; and if at least |
| 537 // one field specifies an explicit type hint, we don't apply any of our usual | 551 // one field specifies an explicit type hint, we don't apply any of our usual |
| 538 // local heuristics to detect field types in the rest of the form. | 552 // local heuristics to detect field types in the rest of the form. |
| 539 test::CreateTestFormField("", "", "", "text", &field); | 553 test::CreateTestFormField("", "", "", "text", &field); |
| 540 field.autocomplete_attribute = "given-name"; | 554 field.autocomplete_attribute = "given-name"; |
| 541 forms.back().fields.push_back(field); | 555 forms.back().fields.push_back(field); |
| 542 test::CreateTestFormField("", "", "", "text", &field); | 556 test::CreateTestFormField("", "", "", "text", &field); |
| 543 field.autocomplete_attribute = "email"; | 557 field.autocomplete_attribute = "email"; |
| 544 forms.back().fields.push_back(field); | 558 forms.back().fields.push_back(field); |
| 545 test::CreateTestFormField("", "", "", "text", &field); | 559 test::CreateTestFormField("", "", "", "text", &field); |
| 546 field.autocomplete_attribute = "address-line1"; | 560 field.autocomplete_attribute = "address-line1"; |
| 547 forms.back().fields.push_back(field); | 561 forms.back().fields.push_back(field); |
| 548 | 562 |
| 549 // Expect both the "form parsed" metric and the author-specified field type | 563 // Expect both the "form parsed" metric and the author-specified field type |
| 550 // hints metric to be logged. | 564 // hints metric to be logged. |
| 551 { | 565 { |
| 552 EXPECT_CALL( | 566 base::HistogramTester histogram_tester; |
| 553 *autofill_manager_->metric_logger(), | |
| 554 LogDeveloperEngagementMetric( | |
| 555 AutofillMetrics::FILLABLE_FORM_PARSED)).Times(1); | |
| 556 EXPECT_CALL( | |
| 557 *autofill_manager_->metric_logger(), | |
| 558 LogDeveloperEngagementMetric( | |
| 559 AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS)).Times(1); | |
| 560 autofill_manager_->OnFormsSeen(forms, TimeTicks()); | 567 autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
| 561 autofill_manager_->Reset(); | 568 autofill_manager_->Reset(); |
| 562 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | 569 histogram_tester.ExpectBucketCount("Autofill.DeveloperEngagement", |
| 570 AutofillMetrics::FILLABLE_FORM_PARSED, |
| 571 1); |
| 572 histogram_tester.ExpectBucketCount( |
| 573 "Autofill.DeveloperEngagement", |
| 574 AutofillMetrics::FILLABLE_FORM_CONTAINS_TYPE_HINTS, 1); |
| 563 } | 575 } |
| 564 } | 576 } |
| 565 | 577 |
| 566 // Test that the profile count is logged correctly. | 578 // Test that the profile count is logged correctly. |
| 567 TEST_F(AutofillMetricsTest, StoredProfileCount) { | 579 TEST_F(AutofillMetricsTest, StoredProfileCount) { |
| 568 // The metric should be logged when the profiles are first loaded. | 580 // The metric should be logged when the profiles are first loaded. |
| 569 EXPECT_CALL(*personal_data_->metric_logger(), | 581 { |
| 570 LogStoredProfileCount(2)).Times(1); | 582 base::HistogramTester histogram_tester; |
| 571 personal_data_->LoadProfiles(); | 583 personal_data_->LoadProfiles(); |
| 584 histogram_tester.ExpectUniqueSample("Autofill.StoredProfileCount", 2, 1); |
| 585 } |
| 572 | 586 |
| 573 // The metric should only be logged once. | 587 // The metric should only be logged once. |
| 574 EXPECT_CALL(*personal_data_->metric_logger(), | 588 { |
| 575 LogStoredProfileCount(::testing::_)).Times(0); | 589 base::HistogramTester histogram_tester; |
| 576 personal_data_->LoadProfiles(); | 590 personal_data_->LoadProfiles(); |
| 591 histogram_tester.ExpectTotalCount("Autofill.StoredProfileCount", 0); |
| 592 } |
| 577 } | 593 } |
| 578 | 594 |
| 579 // Test that we correctly log when Autofill is enabled. | 595 // Test that we correctly log when Autofill is enabled. |
| 580 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtStartup) { | 596 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtStartup) { |
| 597 base::HistogramTester histogram_tester; |
| 581 personal_data_->set_autofill_enabled(true); | 598 personal_data_->set_autofill_enabled(true); |
| 582 EXPECT_CALL(*personal_data_->metric_logger(), | |
| 583 LogIsAutofillEnabledAtStartup(true)).Times(1); | |
| 584 personal_data_->Init( | 599 personal_data_->Init( |
| 585 autofill_client_.GetDatabase(), autofill_client_.GetPrefs(), false); | 600 autofill_client_.GetDatabase(), autofill_client_.GetPrefs(), false); |
| 601 histogram_tester.ExpectUniqueSample("Autofill.IsEnabled.Startup", true, 1); |
| 586 } | 602 } |
| 587 | 603 |
| 588 // Test that we correctly log when Autofill is disabled. | 604 // Test that we correctly log when Autofill is disabled. |
| 589 TEST_F(AutofillMetricsTest, AutofillIsDisabledAtStartup) { | 605 TEST_F(AutofillMetricsTest, AutofillIsDisabledAtStartup) { |
| 606 base::HistogramTester histogram_tester; |
| 590 personal_data_->set_autofill_enabled(false); | 607 personal_data_->set_autofill_enabled(false); |
| 591 EXPECT_CALL(*personal_data_->metric_logger(), | |
| 592 LogIsAutofillEnabledAtStartup(false)).Times(1); | |
| 593 personal_data_->Init( | 608 personal_data_->Init( |
| 594 autofill_client_.GetDatabase(), autofill_client_.GetPrefs(), false); | 609 autofill_client_.GetDatabase(), autofill_client_.GetPrefs(), false); |
| 610 histogram_tester.ExpectUniqueSample("Autofill.IsEnabled.Startup", false, 1); |
| 595 } | 611 } |
| 596 | 612 |
| 597 // Test that we log the number of Autofill suggestions when filling a form. | 613 // Test that we log the number of Autofill suggestions when filling a form. |
| 598 TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { | 614 TEST_F(AutofillMetricsTest, AddressSuggestionsCount) { |
| 599 // Set up our form data. | 615 // Set up our form data. |
| 600 FormData form; | 616 FormData form; |
| 601 form.name = ASCIIToUTF16("TestForm"); | 617 form.name = ASCIIToUTF16("TestForm"); |
| 602 form.origin = GURL("http://example.com/form.html"); | 618 form.origin = GURL("http://example.com/form.html"); |
| 603 form.action = GURL("http://example.com/submit.html"); | 619 form.action = GURL("http://example.com/submit.html"); |
| 604 form.user_submitted = true; | 620 form.user_submitted = true; |
| 605 | 621 |
| 606 FormFieldData field; | 622 FormFieldData field; |
| 607 std::vector<ServerFieldType> field_types; | 623 std::vector<ServerFieldType> field_types; |
| 608 test::CreateTestFormField("Name", "name", "", "text", &field); | 624 test::CreateTestFormField("Name", "name", "", "text", &field); |
| 609 form.fields.push_back(field); | 625 form.fields.push_back(field); |
| 610 field_types.push_back(NAME_FULL); | 626 field_types.push_back(NAME_FULL); |
| 611 test::CreateTestFormField("Email", "email", "", "email", &field); | 627 test::CreateTestFormField("Email", "email", "", "email", &field); |
| 612 form.fields.push_back(field); | 628 form.fields.push_back(field); |
| 613 field_types.push_back(EMAIL_ADDRESS); | 629 field_types.push_back(EMAIL_ADDRESS); |
| 614 test::CreateTestFormField("Phone", "phone", "", "tel", &field); | 630 test::CreateTestFormField("Phone", "phone", "", "tel", &field); |
| 615 form.fields.push_back(field); | 631 form.fields.push_back(field); |
| 616 field_types.push_back(PHONE_HOME_NUMBER); | 632 field_types.push_back(PHONE_HOME_NUMBER); |
| 617 | 633 |
| 618 // Simulate having seen this form on page load. | 634 // Simulate having seen this form on page load. |
| 619 // |form_structure| will be owned by |autofill_manager_|. | 635 // |form_structure| will be owned by |autofill_manager_|. |
| 620 autofill_manager_->AddSeenForm(form, field_types, field_types); | 636 autofill_manager_->AddSeenForm(form, field_types, field_types); |
| 621 | 637 |
| 622 // Establish our expectations. | 638 { |
| 623 ::testing::InSequence dummy; | 639 // Simulate activating the autofill popup for the phone field. |
| 624 EXPECT_CALL(*autofill_manager_->metric_logger(), | 640 base::HistogramTester histogram_tester; |
| 625 LogAddressSuggestionsCount(2)).Times(1); | 641 autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
| 642 false); |
| 643 histogram_tester.ExpectUniqueSample("Autofill.AddressSuggestionsCount", 2, |
| 644 1); |
| 645 } |
| 626 | 646 |
| 627 // Simulate activating the autofill popup for the phone field. | 647 { |
| 628 autofill_manager_->OnQueryFormFieldAutofill( | 648 // Simulate activating the autofill popup for the email field after typing. |
| 629 0, form, field, gfx::Rect(), false); | 649 // No new metric should be logged, since we're still on the same page. |
| 630 | 650 test::CreateTestFormField("Email", "email", "b", "email", &field); |
| 631 // Simulate activating the autofill popup for the email field after typing. | 651 base::HistogramTester histogram_tester; |
| 632 // No new metric should be logged, since we're still on the same page. | 652 autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
| 633 test::CreateTestFormField("Email", "email", "b", "email", &field); | 653 false); |
| 634 autofill_manager_->OnQueryFormFieldAutofill( | 654 histogram_tester.ExpectTotalCount("Autofill.AddressSuggestionsCount", 0); |
| 635 0, form, field, gfx::Rect(), false); | 655 } |
| 636 | 656 |
| 637 // Reset the autofill manager state. | 657 // Reset the autofill manager state. |
| 638 autofill_manager_->Reset(); | 658 autofill_manager_->Reset(); |
| 639 autofill_manager_->AddSeenForm(form, field_types, field_types); | 659 autofill_manager_->AddSeenForm(form, field_types, field_types); |
| 640 | 660 |
| 641 // Establish our expectations. | 661 { |
| 642 EXPECT_CALL(*autofill_manager_->metric_logger(), | 662 // Simulate activating the autofill popup for the email field after typing. |
| 643 LogAddressSuggestionsCount(1)).Times(1); | 663 base::HistogramTester histogram_tester; |
| 644 | 664 autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
| 645 // Simulate activating the autofill popup for the email field after typing. | 665 false); |
| 646 autofill_manager_->OnQueryFormFieldAutofill( | 666 histogram_tester.ExpectUniqueSample("Autofill.AddressSuggestionsCount", 1, |
| 647 0, form, field, gfx::Rect(), false); | 667 1); |
| 668 } |
| 648 | 669 |
| 649 // Reset the autofill manager state again. | 670 // Reset the autofill manager state again. |
| 650 autofill_manager_->Reset(); | 671 autofill_manager_->Reset(); |
| 651 autofill_manager_->AddSeenForm(form, field_types, field_types); | 672 autofill_manager_->AddSeenForm(form, field_types, field_types); |
| 652 | 673 |
| 653 // Establish our expectations. | 674 { |
| 654 EXPECT_CALL(*autofill_manager_->metric_logger(), | 675 // Simulate activating the autofill popup for the email field after typing. |
| 655 LogAddressSuggestionsCount(::testing::_)).Times(0); | 676 form.fields[0].is_autofilled = true; |
| 656 | 677 base::HistogramTester histogram_tester; |
| 657 // Simulate activating the autofill popup for the email field after typing. | 678 autofill_manager_->OnQueryFormFieldAutofill(0, form, field, gfx::Rect(), |
| 658 form.fields[0].is_autofilled = true; | 679 false); |
| 659 autofill_manager_->OnQueryFormFieldAutofill( | 680 histogram_tester.ExpectTotalCount("Autofill.AddressSuggestionsCount", 0); |
| 660 0, form, field, gfx::Rect(), false); | 681 } |
| 661 } | 682 } |
| 662 | 683 |
| 663 // Test that we log whether Autofill is enabled when filling a form. | 684 // Test that we log that Autofill is enabled when filling a form. |
| 664 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) { | 685 TEST_F(AutofillMetricsTest, AutofillIsEnabledAtPageLoad) { |
| 665 // Establish our expectations. | 686 base::HistogramTester histogram_tester; |
| 666 ::testing::InSequence dummy; | |
| 667 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 668 LogIsAutofillEnabledAtPageLoad(true)).Times(1); | |
| 669 | |
| 670 autofill_manager_->set_autofill_enabled(true); | 687 autofill_manager_->set_autofill_enabled(true); |
| 671 autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks()); | 688 autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks()); |
| 689 histogram_tester.ExpectUniqueSample("Autofill.IsEnabled.PageLoad", true, 1); |
| 690 } |
| 672 | 691 |
| 673 // Reset the autofill manager state. | 692 // Test that we log that Autofill is disabled when filling a form. |
| 674 autofill_manager_->Reset(); | 693 TEST_F(AutofillMetricsTest, AutofillIsDisabledAtPageLoad) { |
| 675 | 694 base::HistogramTester histogram_tester; |
| 676 // Establish our expectations. | |
| 677 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 678 LogIsAutofillEnabledAtPageLoad(false)).Times(1); | |
| 679 | |
| 680 autofill_manager_->set_autofill_enabled(false); | 695 autofill_manager_->set_autofill_enabled(false); |
| 681 autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks()); | 696 autofill_manager_->OnFormsSeen(std::vector<FormData>(), TimeTicks()); |
| 697 histogram_tester.ExpectUniqueSample("Autofill.IsEnabled.PageLoad", false, 1); |
| 682 } | 698 } |
| 683 | 699 |
| 684 // Verify that we correctly log user happiness metrics dealing with form loading | 700 // Verify that we correctly log user happiness metrics dealing with form loading |
| 685 // and form submission. | 701 // and form submission. |
| 686 TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) { | 702 TEST_F(AutofillMetricsTest, UserHappinessFormLoadAndSubmission) { |
| 687 // Start with a form with insufficiently many fields. | 703 // Start with a form with insufficiently many fields. |
| 688 FormData form; | 704 FormData form; |
| 689 form.name = ASCIIToUTF16("TestForm"); | 705 form.name = ASCIIToUTF16("TestForm"); |
| 690 form.origin = GURL("http://example.com/form.html"); | 706 form.origin = GURL("http://example.com/form.html"); |
| 691 form.action = GURL("http://example.com/submit.html"); | 707 form.action = GURL("http://example.com/submit.html"); |
| 692 form.user_submitted = true; | 708 form.user_submitted = true; |
| 693 | 709 |
| 694 FormFieldData field; | 710 FormFieldData field; |
| 695 test::CreateTestFormField("Name", "name", "", "text", &field); | 711 test::CreateTestFormField("Name", "name", "", "text", &field); |
| 696 form.fields.push_back(field); | 712 form.fields.push_back(field); |
| 697 test::CreateTestFormField("Email", "email", "", "text", &field); | 713 test::CreateTestFormField("Email", "email", "", "text", &field); |
| 698 form.fields.push_back(field); | 714 form.fields.push_back(field); |
| 699 | 715 |
| 700 std::vector<FormData> forms(1, form); | 716 std::vector<FormData> forms(1, form); |
| 701 | 717 |
| 702 // Expect no notifications when the form is first seen. | 718 // Expect no notifications when the form is first seen. |
| 703 { | 719 { |
| 704 EXPECT_CALL(*autofill_manager_->metric_logger(), | 720 base::HistogramTester histogram_tester; |
| 705 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)).Times(0); | |
| 706 autofill_manager_->OnFormsSeen(forms, TimeTicks()); | 721 autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
| 722 histogram_tester.ExpectTotalCount("Autofill.UserHappiness", 0); |
| 707 } | 723 } |
| 708 | 724 |
| 709 | 725 |
| 710 // Expect no notifications when the form is submitted. | 726 // Expect no notifications when the form is submitted. |
| 711 { | 727 { |
| 712 EXPECT_CALL( | 728 base::HistogramTester histogram_tester; |
| 713 *autofill_manager_->metric_logger(), | |
| 714 LogUserHappinessMetric( | |
| 715 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)).Times(0); | |
| 716 EXPECT_CALL( | |
| 717 *autofill_manager_->metric_logger(), | |
| 718 LogUserHappinessMetric( | |
| 719 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)).Times(0); | |
| 720 EXPECT_CALL( | |
| 721 *autofill_manager_->metric_logger(), | |
| 722 LogUserHappinessMetric( | |
| 723 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)).Times(0); | |
| 724 EXPECT_CALL( | |
| 725 *autofill_manager_->metric_logger(), | |
| 726 LogUserHappinessMetric( | |
| 727 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)).Times(0); | |
| 728 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 729 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 730 histogram_tester.ExpectTotalCount("Autofill.UserHappiness", 0); |
| 729 } | 731 } |
| 730 | 732 |
| 731 // Add more fields to the form. | 733 // Add more fields to the form. |
| 732 test::CreateTestFormField("Phone", "phone", "", "text", &field); | 734 test::CreateTestFormField("Phone", "phone", "", "text", &field); |
| 733 form.fields.push_back(field); | 735 form.fields.push_back(field); |
| 734 test::CreateTestFormField("Unknown", "unknown", "", "text", &field); | 736 test::CreateTestFormField("Unknown", "unknown", "", "text", &field); |
| 735 form.fields.push_back(field); | 737 form.fields.push_back(field); |
| 736 forms.front() = form; | 738 forms.front() = form; |
| 737 | 739 |
| 738 // Expect a notification when the form is first seen. | 740 // Expect a notification when the form is first seen. |
| 739 { | 741 { |
| 740 EXPECT_CALL(*autofill_manager_->metric_logger(), | 742 base::HistogramTester histogram_tester; |
| 741 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); | |
| 742 autofill_manager_->OnFormsSeen(forms, TimeTicks()); | 743 autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
| 744 histogram_tester.ExpectUniqueSample("Autofill.UserHappiness", |
| 745 AutofillMetrics::FORMS_LOADED, 1); |
| 743 } | 746 } |
| 744 | 747 |
| 745 // Expect a notification when the form is submitted. | 748 // Expect a notification when the form is submitted. |
| 746 { | 749 { |
| 747 EXPECT_CALL(*autofill_manager_->metric_logger(), | 750 base::HistogramTester histogram_tester; |
| 748 LogUserHappinessMetric( | |
| 749 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); | |
| 750 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 751 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 752 histogram_tester.ExpectUniqueSample( |
| 753 "Autofill.UserHappiness", AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM, |
| 754 1); |
| 751 } | 755 } |
| 752 | 756 |
| 753 // Fill in two of the fields. | 757 // Fill in two of the fields. |
| 754 form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); | 758 form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); |
| 755 form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); | 759 form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); |
| 756 forms.front() = form; | 760 forms.front() = form; |
| 757 | 761 |
| 758 // Expect a notification when the form is submitted. | 762 // Expect a notification when the form is submitted. |
| 759 { | 763 { |
| 760 EXPECT_CALL(*autofill_manager_->metric_logger(), | 764 base::HistogramTester histogram_tester; |
| 761 LogUserHappinessMetric( | |
| 762 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); | |
| 763 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 765 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 766 histogram_tester.ExpectUniqueSample( |
| 767 "Autofill.UserHappiness", AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM, |
| 768 1); |
| 764 } | 769 } |
| 765 | 770 |
| 766 // Fill in the third field. | 771 // Fill in the third field. |
| 767 form.fields[2].value = ASCIIToUTF16("12345678901"); | 772 form.fields[2].value = ASCIIToUTF16("12345678901"); |
| 768 forms.front() = form; | 773 forms.front() = form; |
| 769 | 774 |
| 770 // Expect notifications when the form is submitted. | 775 // Expect notifications when the form is submitted. |
| 771 { | 776 { |
| 772 EXPECT_CALL(*autofill_manager_->metric_logger(), | 777 base::HistogramTester histogram_tester; |
| 773 LogUserHappinessMetric( | |
| 774 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE)); | |
| 775 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 778 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 779 histogram_tester.ExpectUniqueSample( |
| 780 "Autofill.UserHappiness", |
| 781 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE, 1); |
| 776 } | 782 } |
| 777 | 783 |
| 778 | 784 |
| 779 // Mark one of the fields as autofilled. | 785 // Mark one of the fields as autofilled. |
| 780 form.fields[1].is_autofilled = true; | 786 form.fields[1].is_autofilled = true; |
| 781 forms.front() = form; | 787 forms.front() = form; |
| 782 | 788 |
| 783 // Expect notifications when the form is submitted. | 789 // Expect notifications when the form is submitted. |
| 784 { | 790 { |
| 785 EXPECT_CALL(*autofill_manager_->metric_logger(), | 791 base::HistogramTester histogram_tester; |
| 786 LogUserHappinessMetric( | |
| 787 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME)); | |
| 788 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 792 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 793 histogram_tester.ExpectUniqueSample( |
| 794 "Autofill.UserHappiness", |
| 795 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME, 1); |
| 789 } | 796 } |
| 790 | 797 |
| 791 // Mark all of the fillable fields as autofilled. | 798 // Mark all of the fillable fields as autofilled. |
| 792 form.fields[0].is_autofilled = true; | 799 form.fields[0].is_autofilled = true; |
| 793 form.fields[2].is_autofilled = true; | 800 form.fields[2].is_autofilled = true; |
| 794 forms.front() = form; | 801 forms.front() = form; |
| 795 | 802 |
| 796 // Expect notifications when the form is submitted. | 803 // Expect notifications when the form is submitted. |
| 797 { | 804 { |
| 798 EXPECT_CALL(*autofill_manager_->metric_logger(), | 805 base::HistogramTester histogram_tester; |
| 799 LogUserHappinessMetric( | |
| 800 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL)); | |
| 801 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 806 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 807 histogram_tester.ExpectUniqueSample( |
| 808 "Autofill.UserHappiness", |
| 809 AutofillMetrics::SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL, 1); |
| 802 } | 810 } |
| 803 | 811 |
| 804 // Clear out the third field's value. | 812 // Clear out the third field's value. |
| 805 form.fields[2].value = base::string16(); | 813 form.fields[2].value = base::string16(); |
| 806 forms.front() = form; | 814 forms.front() = form; |
| 807 | 815 |
| 808 // Expect notifications when the form is submitted. | 816 // Expect notifications when the form is submitted. |
| 809 { | 817 { |
| 810 EXPECT_CALL(*autofill_manager_->metric_logger(), | 818 base::HistogramTester histogram_tester; |
| 811 LogUserHappinessMetric( | |
| 812 AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM)); | |
| 813 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); | 819 autofill_manager_->FormSubmitted(form, TimeTicks::Now()); |
| 820 histogram_tester.ExpectUniqueSample( |
| 821 "Autofill.UserHappiness", AutofillMetrics::SUBMITTED_NON_FILLABLE_FORM, |
| 822 1); |
| 814 } | 823 } |
| 815 } | 824 } |
| 816 | 825 |
| 817 // Verify that we correctly log user happiness metrics dealing with form | 826 // Verify that we correctly log user happiness metrics dealing with form |
| 818 // interaction. | 827 // interaction. |
| 819 TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { | 828 TEST_F(AutofillMetricsTest, UserHappinessFormInteraction) { |
| 820 // Load a fillable form. | 829 // Load a fillable form. |
| 821 FormData form; | 830 FormData form; |
| 822 form.name = ASCIIToUTF16("TestForm"); | 831 form.name = ASCIIToUTF16("TestForm"); |
| 823 form.origin = GURL("http://example.com/form.html"); | 832 form.origin = GURL("http://example.com/form.html"); |
| 824 form.action = GURL("http://example.com/submit.html"); | 833 form.action = GURL("http://example.com/submit.html"); |
| 825 form.user_submitted = true; | 834 form.user_submitted = true; |
| 826 | 835 |
| 827 FormFieldData field; | 836 FormFieldData field; |
| 828 test::CreateTestFormField("Name", "name", "", "text", &field); | 837 test::CreateTestFormField("Name", "name", "", "text", &field); |
| 829 form.fields.push_back(field); | 838 form.fields.push_back(field); |
| 830 test::CreateTestFormField("Email", "email", "", "text", &field); | 839 test::CreateTestFormField("Email", "email", "", "text", &field); |
| 831 form.fields.push_back(field); | 840 form.fields.push_back(field); |
| 832 test::CreateTestFormField("Phone", "phone", "", "text", &field); | 841 test::CreateTestFormField("Phone", "phone", "", "text", &field); |
| 833 form.fields.push_back(field); | 842 form.fields.push_back(field); |
| 834 | 843 |
| 835 std::vector<FormData> forms(1, form); | 844 std::vector<FormData> forms(1, form); |
| 836 | 845 |
| 837 // Expect a notification when the form is first seen. | 846 // Expect a notification when the form is first seen. |
| 838 { | 847 { |
| 839 EXPECT_CALL(*autofill_manager_->metric_logger(), | 848 base::HistogramTester histogram_tester; |
| 840 LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED)); | |
| 841 autofill_manager_->OnFormsSeen(forms, TimeTicks()); | 849 autofill_manager_->OnFormsSeen(forms, TimeTicks()); |
| 850 histogram_tester.ExpectUniqueSample("Autofill.UserHappiness", |
| 851 AutofillMetrics::FORMS_LOADED, 1); |
| 842 } | 852 } |
| 843 | 853 |
| 844 // Simulate typing. | 854 // Simulate typing. |
| 845 { | 855 { |
| 846 EXPECT_CALL(*autofill_manager_->metric_logger(), | 856 base::HistogramTester histogram_tester; |
| 847 LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE)); | |
| 848 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 857 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 849 TimeTicks()); | 858 TimeTicks()); |
| 859 histogram_tester.ExpectUniqueSample("Autofill.UserHappiness", |
| 860 AutofillMetrics::USER_DID_TYPE, 1); |
| 850 } | 861 } |
| 851 | 862 |
| 852 // Simulate suggestions shown twice for a single edit (i.e. multiple | 863 // Simulate suggestions shown twice for a single edit (i.e. multiple |
| 853 // keystrokes in a single field). | 864 // keystrokes in a single field). |
| 854 { | 865 { |
| 855 EXPECT_CALL(*autofill_manager_->metric_logger(), | 866 base::HistogramTester histogram_tester; |
| 856 LogUserHappinessMetric( | |
| 857 AutofillMetrics::SUGGESTIONS_SHOWN)).Times(1); | |
| 858 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 859 LogUserHappinessMetric( | |
| 860 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(1); | |
| 861 autofill_manager_->DidShowSuggestions(true); | 867 autofill_manager_->DidShowSuggestions(true); |
| 862 autofill_manager_->DidShowSuggestions(false); | 868 autofill_manager_->DidShowSuggestions(false); |
| 869 histogram_tester.ExpectBucketCount("Autofill.UserHappiness", |
| 870 AutofillMetrics::SUGGESTIONS_SHOWN, 1); |
| 871 histogram_tester.ExpectBucketCount( |
| 872 "Autofill.UserHappiness", AutofillMetrics::SUGGESTIONS_SHOWN_ONCE, 1); |
| 863 } | 873 } |
| 864 | 874 |
| 865 // Simulate suggestions shown for a different field. | 875 // Simulate suggestions shown for a different field. |
| 866 { | 876 { |
| 867 EXPECT_CALL(*autofill_manager_->metric_logger(), | 877 base::HistogramTester histogram_tester; |
| 868 LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN)); | |
| 869 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 870 LogUserHappinessMetric( | |
| 871 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE)).Times(0); | |
| 872 autofill_manager_->DidShowSuggestions(true); | 878 autofill_manager_->DidShowSuggestions(true); |
| 879 histogram_tester.ExpectUniqueSample("Autofill.UserHappiness", |
| 880 AutofillMetrics::SUGGESTIONS_SHOWN, 1); |
| 873 } | 881 } |
| 874 | 882 |
| 875 // Simulate invoking autofill. | 883 // Simulate invoking autofill. |
| 876 { | 884 { |
| 877 EXPECT_CALL(*autofill_manager_->metric_logger(), | 885 base::HistogramTester histogram_tester; |
| 878 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); | |
| 879 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 880 LogUserHappinessMetric( | |
| 881 AutofillMetrics::USER_DID_AUTOFILL_ONCE)); | |
| 882 autofill_manager_->OnDidFillAutofillFormData(TimeTicks()); | 886 autofill_manager_->OnDidFillAutofillFormData(TimeTicks()); |
| 887 histogram_tester.ExpectBucketCount("Autofill.UserHappiness", |
| 888 AutofillMetrics::USER_DID_AUTOFILL, 1); |
| 889 histogram_tester.ExpectBucketCount( |
| 890 "Autofill.UserHappiness", AutofillMetrics::USER_DID_AUTOFILL_ONCE, 1); |
| 883 } | 891 } |
| 884 | 892 |
| 885 // Simulate editing an autofilled field. | 893 // Simulate editing an autofilled field. |
| 886 { | 894 { |
| 887 EXPECT_CALL(*autofill_manager_->metric_logger(), | 895 base::HistogramTester histogram_tester; |
| 888 LogUserHappinessMetric( | |
| 889 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); | |
| 890 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 891 LogUserHappinessMetric( | |
| 892 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE)); | |
| 893 PersonalDataManager::GUIDPair guid( | 896 PersonalDataManager::GUIDPair guid( |
| 894 "00000000-0000-0000-0000-000000000001", 0); | 897 "00000000-0000-0000-0000-000000000001", 0); |
| 895 PersonalDataManager::GUIDPair empty(std::string(), 0); | 898 PersonalDataManager::GUIDPair empty(std::string(), 0); |
| 896 autofill_manager_->FillOrPreviewForm( | 899 autofill_manager_->FillOrPreviewForm( |
| 897 AutofillDriver::FORM_DATA_ACTION_FILL, | 900 AutofillDriver::FORM_DATA_ACTION_FILL, |
| 898 0, form, form.fields.front(), | 901 0, form, form.fields.front(), |
| 899 autofill_manager_->PackGUIDs(empty, guid)); | 902 autofill_manager_->PackGUIDs(empty, guid)); |
| 900 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 903 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 901 TimeTicks()); | 904 TimeTicks()); |
| 902 // Simulate a second keystroke; make sure we don't log the metric twice. | 905 // Simulate a second keystroke; make sure we don't log the metric twice. |
| 903 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 906 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 904 TimeTicks()); | 907 TimeTicks()); |
| 908 histogram_tester.ExpectBucketCount( |
| 909 "Autofill.UserHappiness", |
| 910 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD, 1); |
| 911 histogram_tester.ExpectBucketCount( |
| 912 "Autofill.UserHappiness", |
| 913 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE, 1); |
| 905 } | 914 } |
| 906 | 915 |
| 907 // Simulate invoking autofill again. | 916 // Simulate invoking autofill again. |
| 908 EXPECT_CALL(*autofill_manager_->metric_logger(), | 917 { |
| 909 LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL)); | 918 base::HistogramTester histogram_tester; |
| 910 EXPECT_CALL(*autofill_manager_->metric_logger(), | 919 autofill_manager_->OnDidFillAutofillFormData(TimeTicks()); |
| 911 LogUserHappinessMetric( | 920 histogram_tester.ExpectUniqueSample("Autofill.UserHappiness", |
| 912 AutofillMetrics::USER_DID_AUTOFILL_ONCE)).Times(0); | 921 AutofillMetrics::USER_DID_AUTOFILL, 1); |
| 913 autofill_manager_->OnDidFillAutofillFormData(TimeTicks()); | 922 } |
| 914 | 923 |
| 915 // Simulate editing another autofilled field. | 924 // Simulate editing another autofilled field. |
| 916 { | 925 { |
| 917 EXPECT_CALL(*autofill_manager_->metric_logger(), | 926 base::HistogramTester histogram_tester; |
| 918 LogUserHappinessMetric( | |
| 919 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD)); | |
| 920 autofill_manager_->OnTextFieldDidChange(form, form.fields[1], TimeTicks()); | 927 autofill_manager_->OnTextFieldDidChange(form, form.fields[1], TimeTicks()); |
| 928 histogram_tester.ExpectUniqueSample( |
| 929 "Autofill.UserHappiness", |
| 930 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD, 1); |
| 921 } | 931 } |
| 922 } | 932 } |
| 923 | 933 |
| 924 // Verify that we correctly log metrics tracking the duration of form fill. | 934 // Verify that we correctly log metrics tracking the duration of form fill. |
| 925 TEST_F(AutofillMetricsTest, FormFillDuration) { | 935 TEST_F(AutofillMetricsTest, FormFillDuration) { |
| 926 // Load a fillable form. | 936 // Load a fillable form. |
| 927 FormData form; | 937 FormData form; |
| 928 form.name = ASCIIToUTF16("TestForm"); | 938 form.name = ASCIIToUTF16("TestForm"); |
| 929 form.origin = GURL("http://example.com/form.html"); | 939 form.origin = GURL("http://example.com/form.html"); |
| 930 form.action = GURL("http://example.com/submit.html"); | 940 form.action = GURL("http://example.com/submit.html"); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 954 | 964 |
| 955 // Fill the field values for form submission. | 965 // Fill the field values for form submission. |
| 956 second_form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); | 966 second_form.fields[0].value = ASCIIToUTF16("Elvis Aaron Presley"); |
| 957 second_form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); | 967 second_form.fields[1].value = ASCIIToUTF16("theking@gmail.com"); |
| 958 second_form.fields[2].value = ASCIIToUTF16("12345678901"); | 968 second_form.fields[2].value = ASCIIToUTF16("12345678901"); |
| 959 second_form.fields[3].value = ASCIIToUTF16("51512345678"); | 969 second_form.fields[3].value = ASCIIToUTF16("51512345678"); |
| 960 | 970 |
| 961 // Expect only form load metrics to be logged if the form is submitted without | 971 // Expect only form load metrics to be logged if the form is submitted without |
| 962 // user interaction. | 972 // user interaction. |
| 963 { | 973 { |
| 964 EXPECT_CALL(*autofill_manager_->metric_logger(), | 974 base::HistogramTester histogram_tester; |
| 965 LogFormFillDurationFromLoadWithAutofill(_)).Times(0); | |
| 966 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 967 LogFormFillDurationFromLoadWithoutAutofill( | |
| 968 TimeDelta::FromInternalValue(16))); | |
| 969 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 970 LogFormFillDurationFromInteractionWithAutofill(_)).Times(0); | |
| 971 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 972 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); | |
| 973 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); | 975 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); |
| 974 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); | 976 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
| 977 |
| 978 histogram_tester.ExpectTotalCount( |
| 979 "Autofill.FillDuration.FromLoad.WithAutofill", 0); |
| 980 histogram_tester.ExpectUniqueSample( |
| 981 "Autofill.FillDuration.FromLoad.WithoutAutofill", 16, 1); |
| 982 histogram_tester.ExpectTotalCount( |
| 983 "Autofill.FillDuration.FromInteraction.WithAutofill", 0); |
| 984 histogram_tester.ExpectTotalCount( |
| 985 "Autofill.FillDuration.FromInteraction.WithoutAutofill", 0); |
| 986 |
| 975 autofill_manager_->Reset(); | 987 autofill_manager_->Reset(); |
| 976 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | |
| 977 } | 988 } |
| 978 | 989 |
| 979 // Expect metric to be logged if the user manually edited a form field. | 990 // Expect metric to be logged if the user manually edited a form field. |
| 980 { | 991 { |
| 981 EXPECT_CALL(*autofill_manager_->metric_logger(), | 992 base::HistogramTester histogram_tester; |
| 982 LogFormFillDurationFromLoadWithAutofill(_)).Times(0); | |
| 983 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 984 LogFormFillDurationFromLoadWithoutAutofill( | |
| 985 TimeDelta::FromInternalValue(16))); | |
| 986 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 987 LogFormFillDurationFromInteractionWithAutofill(_)).Times(0); | |
| 988 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 989 LogFormFillDurationFromInteractionWithoutAutofill( | |
| 990 TimeDelta::FromInternalValue(14))); | |
| 991 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); | 993 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); |
| 992 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 994 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 993 TimeTicks::FromInternalValue(3)); | 995 TimeTicks::FromInternalValue(3)); |
| 994 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); | 996 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
| 997 |
| 998 histogram_tester.ExpectTotalCount( |
| 999 "Autofill.FillDuration.FromLoad.WithAutofill", 0); |
| 1000 histogram_tester.ExpectUniqueSample( |
| 1001 "Autofill.FillDuration.FromLoad.WithoutAutofill", 16, 1); |
| 1002 histogram_tester.ExpectTotalCount( |
| 1003 "Autofill.FillDuration.FromInteraction.WithAutofill", 0); |
| 1004 histogram_tester.ExpectUniqueSample( |
| 1005 "Autofill.FillDuration.FromInteraction.WithoutAutofill", 14, 1); |
| 1006 |
| 995 autofill_manager_->Reset(); | 1007 autofill_manager_->Reset(); |
| 996 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | |
| 997 } | 1008 } |
| 998 | 1009 |
| 999 // Expect metric to be logged if the user autofilled the form. | 1010 // Expect metric to be logged if the user autofilled the form. |
| 1000 form.fields[0].is_autofilled = true; | 1011 form.fields[0].is_autofilled = true; |
| 1001 { | 1012 { |
| 1002 EXPECT_CALL(*autofill_manager_->metric_logger(), | 1013 base::HistogramTester histogram_tester; |
| 1003 LogFormFillDurationFromLoadWithAutofill( | |
| 1004 TimeDelta::FromInternalValue(16))); | |
| 1005 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1006 LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0); | |
| 1007 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1008 LogFormFillDurationFromInteractionWithAutofill( | |
| 1009 TimeDelta::FromInternalValue(12))); | |
| 1010 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1011 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); | |
| 1012 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); | 1014 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); |
| 1013 autofill_manager_->OnDidFillAutofillFormData( | 1015 autofill_manager_->OnDidFillAutofillFormData( |
| 1014 TimeTicks::FromInternalValue(5)); | 1016 TimeTicks::FromInternalValue(5)); |
| 1015 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); | 1017 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
| 1018 |
| 1019 histogram_tester.ExpectUniqueSample( |
| 1020 "Autofill.FillDuration.FromLoad.WithAutofill", 16, 1); |
| 1021 histogram_tester.ExpectTotalCount( |
| 1022 "Autofill.FillDuration.FromLoad.WithoutAutofill", 0); |
| 1023 histogram_tester.ExpectUniqueSample( |
| 1024 "Autofill.FillDuration.FromInteraction.WithAutofill", 12, 1); |
| 1025 histogram_tester.ExpectTotalCount( |
| 1026 "Autofill.FillDuration.FromInteraction.WithoutAutofill", 0); |
| 1027 |
| 1016 autofill_manager_->Reset(); | 1028 autofill_manager_->Reset(); |
| 1017 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | |
| 1018 } | 1029 } |
| 1019 | 1030 |
| 1020 // Expect metric to be logged if the user both manually filled some fields | 1031 // Expect metric to be logged if the user both manually filled some fields |
| 1021 // and autofilled others. Messages can arrive out of order, so make sure they | 1032 // and autofilled others. Messages can arrive out of order, so make sure they |
| 1022 // take precedence appropriately. | 1033 // take precedence appropriately. |
| 1023 { | 1034 { |
| 1024 EXPECT_CALL(*autofill_manager_->metric_logger(), | 1035 base::HistogramTester histogram_tester; |
| 1025 LogFormFillDurationFromLoadWithAutofill( | 1036 |
| 1026 TimeDelta::FromInternalValue(16))); | |
| 1027 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1028 LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0); | |
| 1029 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1030 LogFormFillDurationFromInteractionWithAutofill( | |
| 1031 TimeDelta::FromInternalValue(14))); | |
| 1032 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1033 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); | |
| 1034 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); | 1037 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); |
| 1035 autofill_manager_->OnDidFillAutofillFormData( | 1038 autofill_manager_->OnDidFillAutofillFormData( |
| 1036 TimeTicks::FromInternalValue(5)); | 1039 TimeTicks::FromInternalValue(5)); |
| 1037 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 1040 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 1038 TimeTicks::FromInternalValue(3)); | 1041 TimeTicks::FromInternalValue(3)); |
| 1039 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); | 1042 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
| 1043 |
| 1044 histogram_tester.ExpectUniqueSample( |
| 1045 "Autofill.FillDuration.FromLoad.WithAutofill", 16, 1); |
| 1046 histogram_tester.ExpectTotalCount( |
| 1047 "Autofill.FillDuration.FromLoad.WithoutAutofill", 0); |
| 1048 histogram_tester.ExpectUniqueSample( |
| 1049 "Autofill.FillDuration.FromInteraction.WithAutofill", 14, 1); |
| 1050 histogram_tester.ExpectTotalCount( |
| 1051 "Autofill.FillDuration.FromInteraction.WithoutAutofill", 0); |
| 1052 |
| 1040 autofill_manager_->Reset(); | 1053 autofill_manager_->Reset(); |
| 1041 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | |
| 1042 } | 1054 } |
| 1043 | 1055 |
| 1044 // Make sure that loading another form doesn't affect metrics from the first | 1056 // Make sure that loading another form doesn't affect metrics from the first |
| 1045 // form. | 1057 // form. |
| 1046 { | 1058 { |
| 1047 EXPECT_CALL(*autofill_manager_->metric_logger(), | 1059 base::HistogramTester histogram_tester; |
| 1048 LogFormFillDurationFromLoadWithAutofill( | |
| 1049 TimeDelta::FromInternalValue(16))); | |
| 1050 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1051 LogFormFillDurationFromLoadWithoutAutofill(_)).Times(0); | |
| 1052 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1053 LogFormFillDurationFromInteractionWithAutofill( | |
| 1054 TimeDelta::FromInternalValue(14))); | |
| 1055 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1056 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); | |
| 1057 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); | 1060 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); |
| 1058 autofill_manager_->OnFormsSeen(second_forms, | 1061 autofill_manager_->OnFormsSeen(second_forms, |
| 1059 TimeTicks::FromInternalValue(3)); | 1062 TimeTicks::FromInternalValue(3)); |
| 1060 autofill_manager_->OnDidFillAutofillFormData( | 1063 autofill_manager_->OnDidFillAutofillFormData( |
| 1061 TimeTicks::FromInternalValue(5)); | 1064 TimeTicks::FromInternalValue(5)); |
| 1062 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), | 1065 autofill_manager_->OnTextFieldDidChange(form, form.fields.front(), |
| 1063 TimeTicks::FromInternalValue(3)); | 1066 TimeTicks::FromInternalValue(3)); |
| 1064 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); | 1067 autofill_manager_->FormSubmitted(form, TimeTicks::FromInternalValue(17)); |
| 1068 |
| 1069 histogram_tester.ExpectUniqueSample( |
| 1070 "Autofill.FillDuration.FromLoad.WithAutofill", 16, 1); |
| 1071 histogram_tester.ExpectTotalCount( |
| 1072 "Autofill.FillDuration.FromLoad.WithoutAutofill", 0); |
| 1073 histogram_tester.ExpectUniqueSample( |
| 1074 "Autofill.FillDuration.FromInteraction.WithAutofill", 14, 1); |
| 1075 histogram_tester.ExpectTotalCount( |
| 1076 "Autofill.FillDuration.FromInteraction.WithoutAutofill", 0); |
| 1077 |
| 1065 autofill_manager_->Reset(); | 1078 autofill_manager_->Reset(); |
| 1066 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | |
| 1067 } | 1079 } |
| 1068 | 1080 |
| 1069 // Make sure that submitting a form that was loaded later will report the | 1081 // Make sure that submitting a form that was loaded later will report the |
| 1070 // later loading time. | 1082 // later loading time. |
| 1071 { | 1083 { |
| 1072 EXPECT_CALL(*autofill_manager_->metric_logger(), | 1084 base::HistogramTester histogram_tester; |
| 1073 LogFormFillDurationFromLoadWithoutAutofill( | |
| 1074 TimeDelta::FromInternalValue(12))); | |
| 1075 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1076 LogFormFillDurationFromLoadWithAutofill(_)).Times(0); | |
| 1077 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1078 LogFormFillDurationFromInteractionWithAutofill(_)).Times(0); | |
| 1079 EXPECT_CALL(*autofill_manager_->metric_logger(), | |
| 1080 LogFormFillDurationFromInteractionWithoutAutofill(_)).Times(0); | |
| 1081 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); | 1085 autofill_manager_->OnFormsSeen(forms, TimeTicks::FromInternalValue(1)); |
| 1082 autofill_manager_->OnFormsSeen(second_forms, | 1086 autofill_manager_->OnFormsSeen(second_forms, |
| 1083 TimeTicks::FromInternalValue(5)); | 1087 TimeTicks::FromInternalValue(5)); |
| 1084 autofill_manager_->FormSubmitted(second_form, | 1088 autofill_manager_->FormSubmitted(second_form, |
| 1085 TimeTicks::FromInternalValue(17)); | 1089 TimeTicks::FromInternalValue(17)); |
| 1090 |
| 1091 histogram_tester.ExpectTotalCount( |
| 1092 "Autofill.FillDuration.FromLoad.WithAutofill", 0); |
| 1093 histogram_tester.ExpectUniqueSample( |
| 1094 "Autofill.FillDuration.FromLoad.WithoutAutofill", 12, 1); |
| 1095 histogram_tester.ExpectTotalCount( |
| 1096 "Autofill.FillDuration.FromInteraction.WithAutofill", 0); |
| 1097 histogram_tester.ExpectTotalCount( |
| 1098 "Autofill.FillDuration.FromInteraction.WithoutAutofill", 0); |
| 1099 |
| 1086 autofill_manager_->Reset(); | 1100 autofill_manager_->Reset(); |
| 1087 Mock::VerifyAndClearExpectations(autofill_manager_->metric_logger()); | |
| 1088 } | 1101 } |
| 1089 } | 1102 } |
| 1090 | 1103 |
| 1091 } // namespace autofill | 1104 } // namespace autofill |
| OLD | NEW |