Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Side by Side Diff: components/autofill/core/browser/autofill_profile.cc

Issue 1392623002: [Autofill] Add metric for profile action on form submitted (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_profile.h" 5 #include "components/autofill/core/browser/autofill_profile.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <map> 9 #include <map>
10 #include <ostream> 10 #include <ostream>
11 #include <set> 11 #include <set>
12 12
13 #include "base/basictypes.h" 13 #include "base/basictypes.h"
14 #include "base/guid.h" 14 #include "base/guid.h"
15 #include "base/i18n/case_conversion.h" 15 #include "base/i18n/case_conversion.h"
16 #include "base/i18n/char_iterator.h" 16 #include "base/i18n/char_iterator.h"
17 #include "base/logging.h" 17 #include "base/logging.h"
18 #include "base/sha1.h" 18 #include "base/sha1.h"
19 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
20 #include "base/strings/utf_string_conversion_utils.h" 20 #include "base/strings/utf_string_conversion_utils.h"
21 #include "base/strings/utf_string_conversions.h" 21 #include "base/strings/utf_string_conversions.h"
22 #include "components/autofill/core/browser/address.h" 22 #include "components/autofill/core/browser/address.h"
23 #include "components/autofill/core/browser/address_i18n.h" 23 #include "components/autofill/core/browser/address_i18n.h"
24 #include "components/autofill/core/browser/autofill_country.h" 24 #include "components/autofill/core/browser/autofill_country.h"
25 #include "components/autofill/core/browser/autofill_field.h" 25 #include "components/autofill/core/browser/autofill_field.h"
26 #include "components/autofill/core/browser/autofill_metrics.h"
26 #include "components/autofill/core/browser/autofill_type.h" 27 #include "components/autofill/core/browser/autofill_type.h"
27 #include "components/autofill/core/browser/contact_info.h" 28 #include "components/autofill/core/browser/contact_info.h"
28 #include "components/autofill/core/browser/phone_number.h" 29 #include "components/autofill/core/browser/phone_number.h"
29 #include "components/autofill/core/browser/phone_number_i18n.h" 30 #include "components/autofill/core/browser/phone_number_i18n.h"
30 #include "components/autofill/core/browser/validation.h" 31 #include "components/autofill/core/browser/validation.h"
31 #include "components/autofill/core/common/autofill_l10n_util.h" 32 #include "components/autofill/core/common/autofill_l10n_util.h"
32 #include "components/autofill/core/common/form_field_data.h" 33 #include "components/autofill/core/common/form_field_data.h"
33 #include "grit/components_strings.h" 34 #include "grit/components_strings.h"
34 #include "third_party/icu/source/common/unicode/uchar.h" 35 #include "third_party/icu/source/common/unicode/uchar.h"
35 #include "third_party/libaddressinput/chromium/addressinput_util.h" 36 #include "third_party/libaddressinput/chromium/addressinput_util.h"
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 if (!compare) 474 if (!compare)
474 compare.reset(new l10n::CaseInsensitiveCompare()); 475 compare.reset(new l10n::CaseInsensitiveCompare());
475 if (!compare->StringsEqual(value, profile.GetRawInfo(type))) 476 if (!compare->StringsEqual(value, profile.GetRawInfo(type)))
476 return false; 477 return false;
477 } 478 }
478 } 479 }
479 480
480 return true; 481 return true;
481 } 482 }
482 483
483 void AutofillProfile::OverwriteName(const NameInfo& imported_name, 484 bool AutofillProfile::OverwriteName(const NameInfo& imported_name,
484 const std::string& app_locale) { 485 const std::string& app_locale) {
485 if (name_.ParsedNamesAreEqual(imported_name)) { 486 if (name_.ParsedNamesAreEqual(imported_name)) {
486 if (name_.GetRawInfo(NAME_FULL).empty()) 487 if (name_.GetRawInfo(NAME_FULL).empty() &&
488 !imported_name.GetRawInfo(NAME_FULL).empty()) {
487 name_.SetRawInfo(NAME_FULL, imported_name.GetRawInfo(NAME_FULL)); 489 name_.SetRawInfo(NAME_FULL, imported_name.GetRawInfo(NAME_FULL));
488 return; 490 return true;
491 }
492 return false;
489 } 493 }
490 494
491 l10n::CaseInsensitiveCompare compare; 495 l10n::CaseInsensitiveCompare compare;
492 AutofillType type = AutofillType(NAME_FULL); 496 AutofillType type = AutofillType(NAME_FULL);
493 base::string16 full_name = name_.GetInfo(type, app_locale); 497 base::string16 full_name = name_.GetInfo(type, app_locale);
494 if (compare.StringsEqual(full_name, 498 if (compare.StringsEqual(full_name,
495 imported_name.GetInfo(type, app_locale))) { 499 imported_name.GetInfo(type, app_locale))) {
496 // The imported name has the same full name string as the name for this 500 // The imported name has the same full name string as the name for this
497 // profile. Because full names are _heuristically_ parsed into 501 // profile. Because full names are _heuristically_ parsed into
498 // {first, middle, last} name components, it's possible that either the 502 // {first, middle, last} name components, it's possible that either the
499 // existing name or the imported name was misparsed. Prefer to keep the 503 // existing name or the imported name was misparsed. Prefer to keep the
500 // name whose {first, middle, last} components do not match those computed 504 // name whose {first, middle, last} components do not match those computed
501 // by the heuristic parse, as this more likely represents the correct, 505 // by the heuristic parse, as this more likely represents the correct,
502 // user-input parse of the name. 506 // user-input parse of the name.
503 NameInfo heuristically_parsed_name; 507 NameInfo heuristically_parsed_name;
504 heuristically_parsed_name.SetInfo(type, full_name, app_locale); 508 heuristically_parsed_name.SetInfo(type, full_name, app_locale);
505 if (imported_name.ParsedNamesAreEqual(heuristically_parsed_name)) 509 if (imported_name.ParsedNamesAreEqual(heuristically_parsed_name))
506 return; 510 return false;
507 } 511 }
508 512
509 name_ = imported_name; 513 name_ = imported_name;
514 return true;
510 } 515 }
511 516
512 void AutofillProfile::OverwriteWith(const AutofillProfile& profile, 517 bool AutofillProfile::OverwriteWith(const AutofillProfile& profile,
513 const std::string& app_locale) { 518 const std::string& app_locale) {
514 // Verified profiles should never be overwritten with unverified data. 519 // Verified profiles should never be overwritten with unverified data.
515 DCHECK(!IsVerified() || profile.IsVerified()); 520 DCHECK(!IsVerified() || profile.IsVerified());
516 set_origin(profile.origin()); 521 set_origin(profile.origin());
517 set_language_code(profile.language_code()); 522 set_language_code(profile.language_code());
518 set_use_count(profile.use_count() + use_count()); 523 set_use_count(profile.use_count() + use_count());
519 if (profile.use_date() > use_date()) 524 if (profile.use_date() > use_date())
520 set_use_date(profile.use_date()); 525 set_use_date(profile.use_date());
521 526
522 ServerFieldTypeSet field_types; 527 ServerFieldTypeSet field_types;
(...skipping 15 matching lines...) Expand all
538 // previous value should not be replaced with an empty string in that case. 543 // previous value should not be replaced with an empty string in that case.
539 if (compare.StringsEqual( 544 if (compare.StringsEqual(
540 CanonicalizeProfileString( 545 CanonicalizeProfileString(
541 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)), 546 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)),
542 CanonicalizeProfileString(GetRawInfo(ADDRESS_HOME_STREET_ADDRESS))) && 547 CanonicalizeProfileString(GetRawInfo(ADDRESS_HOME_STREET_ADDRESS))) &&
543 profile.GetRawInfo(ADDRESS_HOME_LINE2) == base::UTF8ToUTF16("")) { 548 profile.GetRawInfo(ADDRESS_HOME_LINE2) == base::UTF8ToUTF16("")) {
544 field_types.erase(ADDRESS_HOME_LINE1); 549 field_types.erase(ADDRESS_HOME_LINE1);
545 field_types.erase(ADDRESS_HOME_LINE2); 550 field_types.erase(ADDRESS_HOME_LINE2);
546 } 551 }
547 552
553 bool did_overwrite = false;
554
548 for (ServerFieldTypeSet::const_iterator iter = field_types.begin(); 555 for (ServerFieldTypeSet::const_iterator iter = field_types.begin();
549 iter != field_types.end(); ++iter) { 556 iter != field_types.end(); ++iter) {
550 FieldTypeGroup group = AutofillType(*iter).group(); 557 FieldTypeGroup group = AutofillType(*iter).group();
551 // Special case names. 558 // Special case names.
552 if (group == NAME) { 559 if (group == NAME) {
553 OverwriteName(profile.name_, app_locale); 560 if (OverwriteName(profile.name_, app_locale)) {
561 did_overwrite = true;
Evan Stade 2015/10/14 20:42:01 nit: did_overwrite = OverwriteName() || did_overwr
sebsg 2015/10/21 17:35:26 Done.
562 }
554 continue; 563 continue;
555 } 564 }
556 565
557 base::string16 new_value = profile.GetRawInfo(*iter); 566 base::string16 new_value = profile.GetRawInfo(*iter);
558 if (!compare.StringsEqual(GetRawInfo(*iter), new_value)) 567 if (!compare.StringsEqual(GetRawInfo(*iter), new_value)) {
559 SetRawInfo(*iter, new_value); 568 SetRawInfo(*iter, new_value);
569 did_overwrite = true;
570 }
560 } 571 }
572
573 return did_overwrite;
561 } 574 }
562 575
563 bool AutofillProfile::SaveAdditionalInfo(const AutofillProfile& profile, 576 bool AutofillProfile::SaveAdditionalInfo(const AutofillProfile& profile,
564 const std::string& app_locale) { 577 const std::string& app_locale) {
565 ServerFieldTypeSet field_types, other_field_types; 578 ServerFieldTypeSet field_types, other_field_types;
566 GetNonEmptyTypes(app_locale, &field_types); 579 GetNonEmptyTypes(app_locale, &field_types);
567 profile.GetNonEmptyTypes(app_locale, &other_field_types); 580 profile.GetNonEmptyTypes(app_locale, &other_field_types);
568 // The address needs to be compared line by line to take into account the 581 // The address needs to be compared line by line to take into account the
569 // logic for empty fields implemented in the loop. 582 // logic for empty fields implemented in the loop.
570 field_types.erase(ADDRESS_HOME_STREET_ADDRESS); 583 field_types.erase(ADDRESS_HOME_STREET_ADDRESS);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 } 619 }
607 continue; 620 continue;
608 } 621 }
609 if (!compare.StringsEqual(profile.GetRawInfo(field_type), 622 if (!compare.StringsEqual(profile.GetRawInfo(field_type),
610 GetRawInfo(field_type))) { 623 GetRawInfo(field_type))) {
611 return false; 624 return false;
612 } 625 }
613 } 626 }
614 } 627 }
615 628
616 if (!IsVerified() || profile.IsVerified()) 629 if (!IsVerified() || profile.IsVerified()) {
617 OverwriteWith(profile, app_locale); 630 if (OverwriteWith(profile, app_locale)) {
631 AutofillMetrics::LogProfileActionOnFormSubmitted(
632 AutofillMetrics::EXISTING_PROFILE_UPDATED);
633 } else {
634 AutofillMetrics::LogProfileActionOnFormSubmitted(
635 AutofillMetrics::EXISTING_PROFILE_USED);
636 }
637 }
618 return true; 638 return true;
619 } 639 }
620 640
621 // static 641 // static
622 bool AutofillProfile::SupportsMultiValue(ServerFieldType type) { 642 bool AutofillProfile::SupportsMultiValue(ServerFieldType type) {
623 FieldTypeGroup group = AutofillType(type).group(); 643 FieldTypeGroup group = AutofillType(type).group();
624 return group == NAME || 644 return group == NAME ||
625 group == NAME_BILLING || 645 group == NAME_BILLING ||
626 group == EMAIL || 646 group == EMAIL ||
627 group == PHONE_HOME || 647 group == PHONE_HOME ||
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 << " " << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_CITY)) << " " 1013 << " " << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_CITY)) << " "
994 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE)) << " " 1014 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE)) << " "
995 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP)) << " " 1015 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP)) << " "
996 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)) << " " 1016 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)) << " "
997 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)) << " " 1017 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)) << " "
998 << profile.language_code() << " " 1018 << profile.language_code() << " "
999 << UTF16ToUTF8(profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); 1019 << UTF16ToUTF8(profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
1000 } 1020 }
1001 1021
1002 } // namespace autofill 1022 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/core/browser/autofill_profile.h ('k') | components/autofill/core/browser/autofill_profile_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698