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

Unified Diff: components/autofill/core/browser/autofill_profile.cc

Issue 2164143002: Use the max use count on autofill profile merge. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: better documentation Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | components/autofill/core/browser/autofill_profile_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/autofill/core/browser/autofill_profile.cc
diff --git a/components/autofill/core/browser/autofill_profile.cc b/components/autofill/core/browser/autofill_profile.cc
index 93b155530f28e092b925939028102f906b01b409..602cf1bf7bb2e320f732ade1783149cd70ace8c7 100644
--- a/components/autofill/core/browser/autofill_profile.cc
+++ b/components/autofill/core/browser/autofill_profile.cc
@@ -449,10 +449,11 @@ bool AutofillProfile::MergeDataFrom(const AutofillProfile& profile,
DVLOG(1) << "Merging profiles:\nSource = " << profile << "\nDest = " << *this;
// The comparator's merge operations are biased to prefer the data in the
- // first profile parameter when the data is the same modulo case. We pass the
- // incoming profile in this position to prefer accepting updates instead of
- // preserving the original data. I.e., passing the incoming profile first
- // accepts case changes, the other ways does not.
+ // first profile parameter when the data is the same modulo case. We expect
+ // the caller to pass the incoming profile in this position to prefer
+ // accepting updates instead of preserving the original data. I.e., passing
+ // the incoming profile first accepts case and diacritic changes, for example,
+ // the other ways does not.
if (!comparator.MergeNames(profile, *this, &name) ||
!comparator.MergeEmailAddresses(profile, *this, &email) ||
!comparator.MergeCompanyNames(profile, *this, &company) ||
@@ -462,16 +463,24 @@ bool AutofillProfile::MergeDataFrom(const AutofillProfile& profile,
return false;
}
+ // TODO(rogerm): As implemented, "origin" really denotes "domain of last use".
+ // Find a better merge heuristic. Ditto for language code.
set_origin(profile.origin());
set_language_code(profile.language_code());
- set_use_count(profile.use_count() + use_count());
- if (profile.use_date() > use_date())
- set_use_date(profile.use_date());
-
- // Now that the preferred values have been obtained, update the fields which
- // need to be modified, if any. Note: that we're comparing the fields for
- // representational equality below (i.e., are the values byte for byte the
- // same).
+
+ // Update the use-count to be the max of the two merge-counts. Alternatively,
+ // we could have summed the two merge-counts. We don't sum because it skews
+ // the frecency value on merge and double counts usage on profile reuse.
+ // Profile reuse is accounted for on RecordUseOf() on selection of a profile
+ // in the autofill drop-down; we don't need to account for that here. Further,
+ // a similar, fully-typed submission that merges to an existing profile should
+ // not be counted as a re-use of that profile.
+ set_use_count(std::max(profile.use_count(), use_count()));
+ set_use_date(std::max(profile.use_date(), use_date()));
+
+ // Update the fields which need to be modified, if any. Note: that we're
+ // comparing the fields for representational equality below (i.e., are the
+ // values byte for byte the same).
bool modified = false;
« no previous file with comments | « no previous file | components/autofill/core/browser/autofill_profile_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698