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

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

Issue 2082483005: [Autofill] Log RAPPOR metrics around credit card upload failures (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: null check Created 4 years, 6 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_manager.h" 5 #include "components/autofill/core/browser/autofill_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 #include "components/autofill/core/common/autofill_data_validation.h" 51 #include "components/autofill/core/common/autofill_data_validation.h"
52 #include "components/autofill/core/common/autofill_pref_names.h" 52 #include "components/autofill/core/common/autofill_pref_names.h"
53 #include "components/autofill/core/common/autofill_switches.h" 53 #include "components/autofill/core/common/autofill_switches.h"
54 #include "components/autofill/core/common/autofill_util.h" 54 #include "components/autofill/core/common/autofill_util.h"
55 #include "components/autofill/core/common/form_data.h" 55 #include "components/autofill/core/common/form_data.h"
56 #include "components/autofill/core/common/form_data_predictions.h" 56 #include "components/autofill/core/common/form_data_predictions.h"
57 #include "components/autofill/core/common/form_field_data.h" 57 #include "components/autofill/core/common/form_field_data.h"
58 #include "components/autofill/core/common/password_form_fill_data.h" 58 #include "components/autofill/core/common/password_form_fill_data.h"
59 #include "components/pref_registry/pref_registry_syncable.h" 59 #include "components/pref_registry/pref_registry_syncable.h"
60 #include "components/prefs/pref_service.h" 60 #include "components/prefs/pref_service.h"
61 #include "components/rappor/rappor_utils.h"
61 #include "google_apis/gaia/identity_provider.h" 62 #include "google_apis/gaia/identity_provider.h"
62 #include "grit/components_strings.h" 63 #include "grit/components_strings.h"
63 #include "ui/base/l10n/l10n_util.h" 64 #include "ui/base/l10n/l10n_util.h"
64 #include "ui/gfx/geometry/rect.h" 65 #include "ui/gfx/geometry/rect.h"
65 #include "url/gurl.h" 66 #include "url/gurl.h"
66 67
67 #if defined(OS_IOS) 68 #if defined(OS_IOS)
68 #include "components/autofill/core/browser/autofill_field_trial_ios.h" 69 #include "components/autofill/core/browser/autofill_field_trial_ios.h"
69 #include "components/autofill/core/browser/keyboard_accessory_metrics_logger.h" 70 #include "components/autofill/core/browser/keyboard_accessory_metrics_logger.h"
70 #endif 71 #endif
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 for (const AutofillField* field : submitted_form) { 1070 for (const AutofillField* field : submitted_form) {
1070 if (field->Type().GetStorableType() == CREDIT_CARD_VERIFICATION_CODE && 1071 if (field->Type().GetStorableType() == CREDIT_CARD_VERIFICATION_CODE &&
1071 base::StringToInt(field->value, &cvc)) { 1072 base::StringToInt(field->value, &cvc)) {
1072 upload_request_.cvc = field->value; 1073 upload_request_.cvc = field->value;
1073 break; 1074 break;
1074 } 1075 }
1075 } 1076 }
1076 if (upload_request_.cvc.empty()) { 1077 if (upload_request_.cvc.empty()) {
1077 AutofillMetrics::LogCardUploadDecisionMetric( 1078 AutofillMetrics::LogCardUploadDecisionMetric(
1078 AutofillMetrics::UPLOAD_NOT_OFFERED_NO_CVC); 1079 AutofillMetrics::UPLOAD_NOT_OFFERED_NO_CVC);
1080 if (submitted_form.source_url().is_valid() &&
Justin Donnelly 2016/06/21 15:04:54 This is a complicated bit of code that's difficult
Mathieu 2016/06/21 17:05:08 Sure, I prefer the first version.
1081 client_->GetRapporService()) {
1082 rappor::SampleDomainAndRegistryFromGURL(
1083 client_->GetRapporService(), "Autofill.CardUploadNotOfferedNoCvc",
1084 submitted_form.source_url());
1085 }
1079 return; 1086 return;
1080 } 1087 }
1081 1088
1082 // Upload also requires recently used or modified addresses that meet the 1089 // Upload also requires recently used or modified addresses that meet the
1083 // client-side validation rules. 1090 // client-side validation rules.
1084 if (!GetProfilesForCreditCardUpload(*imported_credit_card, 1091 if (!GetProfilesForCreditCardUpload(*imported_credit_card,
1085 &upload_request_.profiles)) { 1092 &upload_request_.profiles,
1093 submitted_form.source_url())) {
1086 return; 1094 return;
1087 } 1095 }
1088 1096
1089 // All required data is available, start the upload process. 1097 // All required data is available, start the upload process.
1090 payments_client_->GetUploadDetails(app_locale_); 1098 payments_client_->GetUploadDetails(app_locale_);
1091 } 1099 }
1092 } 1100 }
1093 1101
1094 bool AutofillManager::GetProfilesForCreditCardUpload( 1102 bool AutofillManager::GetProfilesForCreditCardUpload(
1095 const CreditCard& card, 1103 const CreditCard& card,
1096 std::vector<AutofillProfile>* profiles) const { 1104 std::vector<AutofillProfile>* profiles,
1105 const GURL& source_url) const {
1097 std::vector<AutofillProfile> candidate_profiles; 1106 std::vector<AutofillProfile> candidate_profiles;
1098 const base::Time now = base::Time::Now(); 1107 const base::Time now = base::Time::Now();
1099 const base::TimeDelta fifteen_minutes = base::TimeDelta::FromMinutes(15); 1108 const base::TimeDelta fifteen_minutes = base::TimeDelta::FromMinutes(15);
1100 1109
1101 // First, collect all of the addresses used recently. 1110 // First, collect all of the addresses used recently.
1102 for (AutofillProfile* profile : personal_data_->GetProfiles()) { 1111 for (AutofillProfile* profile : personal_data_->GetProfiles()) {
1103 if ((now - profile->use_date()) < fifteen_minutes || 1112 if ((now - profile->use_date()) < fifteen_minutes ||
1104 (now - profile->modification_date()) < fifteen_minutes) { 1113 (now - profile->modification_date()) < fifteen_minutes) {
1105 candidate_profiles.push_back(*profile); 1114 candidate_profiles.push_back(*profile);
1106 } 1115 }
1107 } 1116 }
1108 if (candidate_profiles.empty()) { 1117 if (candidate_profiles.empty()) {
1109 AutofillMetrics::LogCardUploadDecisionMetric( 1118 AutofillMetrics::LogCardUploadDecisionMetric(
1110 AutofillMetrics::UPLOAD_NOT_OFFERED_NO_ADDRESS); 1119 AutofillMetrics::UPLOAD_NOT_OFFERED_NO_ADDRESS);
1120 if (source_url.is_valid() && client_->GetRapporService()) {
1121 rappor::SampleDomainAndRegistryFromGURL(
1122 client_->GetRapporService(), "Autofill.CardUploadNotOfferedNoAddress",
1123 source_url);
1124 }
1111 return false; 1125 return false;
1112 } 1126 }
1113 1127
1114 // If any of the names on the card or the addresses don't match (where 1128 // If any of the names on the card or the addresses don't match (where
1115 // matching is case insensitive and ignores middle initials if present), the 1129 // matching is case insensitive and ignores middle initials if present), the
1116 // candidate set is invalid. This matches the rules for name matching applied 1130 // candidate set is invalid. This matches the rules for name matching applied
1117 // server-side by Google Payments and ensures that we don't send upload 1131 // server-side by Google Payments and ensures that we don't send upload
1118 // requests that are guaranteed to fail. 1132 // requests that are guaranteed to fail.
1119 base::string16 verified_name; 1133 base::string16 verified_name;
1120 base::string16 card_name = 1134 base::string16 card_name =
1121 card.GetInfo(AutofillType(CREDIT_CARD_NAME_FULL), app_locale_); 1135 card.GetInfo(AutofillType(CREDIT_CARD_NAME_FULL), app_locale_);
1122 if (!card_name.empty()) { 1136 if (!card_name.empty()) {
1123 verified_name = RemoveMiddleInitial(card_name); 1137 verified_name = RemoveMiddleInitial(card_name);
1124 } 1138 }
1125 for (const AutofillProfile& profile : candidate_profiles) { 1139 for (const AutofillProfile& profile : candidate_profiles) {
1126 base::string16 address_name = 1140 base::string16 address_name =
1127 profile.GetInfo(AutofillType(NAME_FULL), app_locale_); 1141 profile.GetInfo(AutofillType(NAME_FULL), app_locale_);
1128 if (!address_name.empty()) { 1142 if (!address_name.empty()) {
1129 if (verified_name.empty()) { 1143 if (verified_name.empty()) {
1130 verified_name = RemoveMiddleInitial(address_name); 1144 verified_name = RemoveMiddleInitial(address_name);
1131 } else { 1145 } else {
1132 // TODO(crbug.com/590307): We only use ASCII case insensitivity here 1146 // TODO(crbug.com/590307): We only use ASCII case insensitivity here
1133 // because the feature is launching US-only and middle initials only 1147 // because the feature is launching US-only and middle initials only
1134 // make sense for Western-style names anyway. As we launch in more 1148 // make sense for Western-style names anyway. As we launch in more
1135 // countries, we'll need to make the name comparison more sophisticated. 1149 // countries, we'll need to make the name comparison more sophisticated.
1136 if (!base::EqualsCaseInsensitiveASCII( 1150 if (!base::EqualsCaseInsensitiveASCII(
1137 verified_name, RemoveMiddleInitial(address_name))) { 1151 verified_name, RemoveMiddleInitial(address_name))) {
1138 AutofillMetrics::LogCardUploadDecisionMetric( 1152 AutofillMetrics::LogCardUploadDecisionMetric(
1139 AutofillMetrics::UPLOAD_NOT_OFFERED_CONFLICTING_NAMES); 1153 AutofillMetrics::UPLOAD_NOT_OFFERED_CONFLICTING_NAMES);
1154 if (source_url.is_valid() && client_->GetRapporService()) {
1155 rappor::SampleDomainAndRegistryFromGURL(
1156 client_->GetRapporService(),
1157 "Autofill.CardUploadNotOfferedConflictingNames", source_url);
1158 }
1140 return false; 1159 return false;
1141 } 1160 }
1142 } 1161 }
1143 } 1162 }
1144 } 1163 }
1145 // If neither the card nor any of the addresses have a name associated with 1164 // If neither the card nor any of the addresses have a name associated with
1146 // them, the candidate set is invalid. 1165 // them, the candidate set is invalid.
1147 if (verified_name.empty()) { 1166 if (verified_name.empty()) {
1148 AutofillMetrics::LogCardUploadDecisionMetric( 1167 AutofillMetrics::LogCardUploadDecisionMetric(
1149 AutofillMetrics::UPLOAD_NOT_OFFERED_NO_NAME); 1168 AutofillMetrics::UPLOAD_NOT_OFFERED_NO_NAME);
1169 if (source_url.is_valid() && client_->GetRapporService()) {
1170 rappor::SampleDomainAndRegistryFromGURL(
1171 client_->GetRapporService(), "Autofill.CardUploadNotOfferedNoName",
1172 source_url);
1173 }
1150 return false; 1174 return false;
1151 } 1175 }
1152 1176
1153 // If any of the candidate addresses have a non-empty zip that doesn't match 1177 // If any of the candidate addresses have a non-empty zip that doesn't match
1154 // any other non-empty zip, then the candidate set is invalid. 1178 // any other non-empty zip, then the candidate set is invalid.
1155 base::string16 verified_zip; 1179 base::string16 verified_zip;
1156 for (const AutofillProfile& profile : candidate_profiles) { 1180 for (const AutofillProfile& profile : candidate_profiles) {
1157 // TODO(jdonnelly): Use GetInfo instead of GetRawInfo once zip codes are 1181 // TODO(jdonnelly): Use GetInfo instead of GetRawInfo once zip codes are
1158 // canonicalized. See http://crbug.com/587465. 1182 // canonicalized. See http://crbug.com/587465.
1159 base::string16 zip = profile.GetRawInfo(ADDRESS_HOME_ZIP); 1183 base::string16 zip = profile.GetRawInfo(ADDRESS_HOME_ZIP);
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after
1999 if (i > 0) 2023 if (i > 0)
2000 fputs("Next oldest form:\n", file); 2024 fputs("Next oldest form:\n", file);
2001 } 2025 }
2002 fputs("\n", file); 2026 fputs("\n", file);
2003 2027
2004 fclose(file); 2028 fclose(file);
2005 } 2029 }
2006 #endif // ENABLE_FORM_DEBUG_DUMP 2030 #endif // ENABLE_FORM_DEBUG_DUMP
2007 2031
2008 } // namespace autofill 2032 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/core/browser/autofill_manager.h ('k') | components/autofill/core/browser/autofill_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698