Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/autofill/personal_data_manager.h" | 5 #include "chrome/browser/autofill/personal_data_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 WebKit::WebRegularExpression re(WebKit::WebString(kEmailPattern), | 80 WebKit::WebRegularExpression re(WebKit::WebString(kEmailPattern), |
| 81 WebKit::WebTextCaseInsensitive); | 81 WebKit::WebTextCaseInsensitive); |
| 82 return re.match(WebKit::WebString(StringToLowerASCII(value))) != -1; | 82 return re.match(WebKit::WebString(StringToLowerASCII(value))) != -1; |
| 83 } | 83 } |
| 84 | 84 |
| 85 // Returns true if minimum requirements for import of a given |profile| have | 85 // Returns true if minimum requirements for import of a given |profile| have |
| 86 // been met. An address submitted via a form must have at least these fields | 86 // been met. An address submitted via a form must have at least these fields |
| 87 // filled. No verification of validity of the contents is preformed. This is | 87 // filled. No verification of validity of the contents is preformed. This is |
| 88 // and existence check only. | 88 // and existence check only. |
| 89 bool IsMinimumAddress(const AutofillProfile& profile) { | 89 bool IsMinimumAddress(const AutofillProfile& profile) { |
| 90 return !profile.GetFieldText(AutofillType(ADDRESS_HOME_LINE1)).empty() && | 90 return !profile.GetFieldText(ADDRESS_HOME_LINE1).empty() && |
| 91 !profile.GetFieldText(AutofillType(ADDRESS_HOME_CITY)).empty() && | 91 !profile.GetFieldText(ADDRESS_HOME_CITY).empty() && |
| 92 !profile.GetFieldText(AutofillType(ADDRESS_HOME_STATE)).empty() && | 92 !profile.GetFieldText(ADDRESS_HOME_STATE).empty() && |
| 93 !profile.GetFieldText(AutofillType(ADDRESS_HOME_ZIP)).empty(); | 93 !profile.GetFieldText(ADDRESS_HOME_ZIP).empty(); |
| 94 } | 94 } |
| 95 | 95 |
| 96 // Whether we have already logged the number of profiles this session. | 96 // Whether we have already logged the number of profiles this session. |
| 97 bool g_has_logged_profile_count = false; | 97 bool g_has_logged_profile_count = false; |
| 98 | 98 |
| 99 } // namespace | 99 } // namespace |
| 100 | 100 |
| 101 PersonalDataManager::~PersonalDataManager() { | 101 PersonalDataManager::~PersonalDataManager() { |
| 102 CancelPendingQuery(&pending_profiles_query_); | 102 CancelPendingQuery(&pending_profiles_query_); |
| 103 CancelPendingQuery(&pending_creditcards_query_); | 103 CancelPendingQuery(&pending_creditcards_query_); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 const FormStructure* form = *iter; | 182 const FormStructure* form = *iter; |
| 183 for (size_t i = 0; i < form->field_count(); ++i) { | 183 for (size_t i = 0; i < form->field_count(); ++i) { |
| 184 const AutofillField* field = form->field(i); | 184 const AutofillField* field = form->field(i); |
| 185 string16 value = CollapseWhitespace(field->value, false); | 185 string16 value = CollapseWhitespace(field->value, false); |
| 186 | 186 |
| 187 // If we don't know the type of the field, or the user hasn't entered any | 187 // If we don't know the type of the field, or the user hasn't entered any |
| 188 // information into the field, then skip it. | 188 // information into the field, then skip it. |
| 189 if (!field->IsFieldFillable() || value.empty()) | 189 if (!field->IsFieldFillable() || value.empty()) |
| 190 continue; | 190 continue; |
| 191 | 191 |
| 192 AutofillType field_type(field->type()); | 192 AutofillFieldType field_type = field->type(); |
| 193 FieldTypeGroup group(field_type.group()); | 193 FieldTypeGroup group(AutofillType(field_type).group()); |
| 194 | 194 |
| 195 if (group == AutofillType::CREDIT_CARD) { | 195 if (group == AutofillType::CREDIT_CARD) { |
| 196 // If the user has a password set, we have no way of setting credit | 196 // If the user has a password set, we have no way of setting credit |
| 197 // card numbers. | 197 // card numbers. |
| 198 if (!HasPassword()) { | 198 if (!HasPassword()) { |
| 199 if (LowerCaseEqualsASCII(field->form_control_type, "month")) { | 199 if (LowerCaseEqualsASCII(field->form_control_type, "month")) { |
| 200 DCHECK_EQ(CREDIT_CARD_EXP_MONTH, field_type.field_type()); | 200 DCHECK_EQ(CREDIT_CARD_EXP_MONTH, field_type); |
| 201 local_imported_credit_card->SetInfoForMonthInputType(value); | 201 local_imported_credit_card->SetInfoForMonthInputType(value); |
| 202 } else { | 202 } else { |
| 203 local_imported_credit_card->SetInfo( | 203 local_imported_credit_card->SetInfo(field_type, value); |
| 204 AutofillType(field_type.field_type()), value); | |
| 205 } | 204 } |
| 206 ++importable_credit_card_fields; | 205 ++importable_credit_card_fields; |
| 207 } | 206 } |
| 208 } else { | 207 } else { |
| 209 // In the case of a phone number, if the whole phone number was entered | 208 // In the case of a phone number, if the whole phone number was entered |
| 210 // into a single field, then parse it and set the sub components. | 209 // into a single field, then parse it and set the sub components. |
| 211 if (field_type.subgroup() == AutofillType::PHONE_WHOLE_NUMBER) { | 210 if (AutofillType(field_type).subgroup() == |
|
dhollowa
2011/03/16 17:07:11
nit: indent, or single line maybe?
Ilya Sherman
2011/03/17 03:42:29
Doesn't fit on a single line :(
| |
| 211 AutofillType::PHONE_WHOLE_NUMBER) { | |
| 212 string16 number; | 212 string16 number; |
| 213 string16 city_code; | 213 string16 city_code; |
| 214 string16 country_code; | 214 string16 country_code; |
| 215 PhoneNumber::ParsePhoneNumber(value, | 215 PhoneNumber::ParsePhoneNumber(value, |
| 216 &number, | 216 &number, |
| 217 &city_code, | 217 &city_code, |
| 218 &country_code); | 218 &country_code); |
| 219 if (number.empty()) | 219 if (number.empty()) |
| 220 continue; | 220 continue; |
| 221 | 221 |
| 222 if (group == AutofillType::PHONE_HOME) { | 222 if (group == AutofillType::PHONE_HOME) { |
| 223 imported_profile->SetInfo(AutofillType(PHONE_HOME_COUNTRY_CODE), | 223 imported_profile->SetInfo(PHONE_HOME_COUNTRY_CODE, country_code); |
| 224 country_code); | 224 imported_profile->SetInfo(PHONE_HOME_CITY_CODE, city_code); |
| 225 imported_profile->SetInfo(AutofillType(PHONE_HOME_CITY_CODE), | 225 imported_profile->SetInfo(PHONE_HOME_NUMBER, number); |
| 226 city_code); | |
| 227 imported_profile->SetInfo(AutofillType(PHONE_HOME_NUMBER), number); | |
| 228 } else if (group == AutofillType::PHONE_FAX) { | 226 } else if (group == AutofillType::PHONE_FAX) { |
| 229 imported_profile->SetInfo(AutofillType(PHONE_FAX_COUNTRY_CODE), | 227 imported_profile->SetInfo(PHONE_FAX_COUNTRY_CODE, country_code); |
| 230 country_code); | 228 imported_profile->SetInfo(PHONE_FAX_CITY_CODE, city_code); |
| 231 imported_profile->SetInfo(AutofillType(PHONE_FAX_CITY_CODE), | 229 imported_profile->SetInfo(PHONE_FAX_NUMBER, number); |
| 232 city_code); | |
| 233 imported_profile->SetInfo(AutofillType(PHONE_FAX_NUMBER), number); | |
| 234 } | 230 } |
| 235 | 231 |
| 236 continue; | 232 continue; |
| 237 } | 233 } |
| 238 | 234 |
| 239 // Phone and fax numbers can be split across multiple fields, so we | 235 // Phone and fax numbers can be split across multiple fields, so we |
| 240 // might have already stored the prefix, and now be at the suffix. | 236 // might have already stored the prefix, and now be at the suffix. |
| 241 // If so, combine them to form the full number. | 237 // If so, combine them to form the full number. |
| 242 if (group == AutofillType::PHONE_HOME || | 238 if (group == AutofillType::PHONE_HOME || |
| 243 group == AutofillType::PHONE_FAX) { | 239 group == AutofillType::PHONE_FAX) { |
| 244 AutofillType number_type(PHONE_HOME_NUMBER); | 240 AutofillFieldType number_type = PHONE_HOME_NUMBER; |
| 245 if (group == AutofillType::PHONE_FAX) | 241 if (group == AutofillType::PHONE_FAX) |
| 246 number_type = AutofillType(PHONE_FAX_NUMBER); | 242 number_type = PHONE_FAX_NUMBER; |
| 247 | 243 |
| 248 string16 stored_number = imported_profile->GetFieldText(number_type); | 244 string16 stored_number = imported_profile->GetFieldText(number_type); |
| 249 if (stored_number.size() == | 245 if (stored_number.size() == |
| 250 static_cast<size_t>(PhoneNumber::kPrefixLength) && | 246 static_cast<size_t>(PhoneNumber::kPrefixLength) && |
| 251 value.size() == static_cast<size_t>(PhoneNumber::kSuffixLength)) { | 247 value.size() == static_cast<size_t>(PhoneNumber::kSuffixLength)) { |
| 252 value = stored_number + value; | 248 value = stored_number + value; |
| 253 } | 249 } |
| 254 } | 250 } |
| 255 | 251 |
| 256 if (field_type.field_type() == EMAIL_ADDRESS && !IsValidEmail(value)) | 252 if (field_type == EMAIL_ADDRESS && !IsValidEmail(value)) |
| 257 continue; | 253 continue; |
| 258 | 254 |
| 259 imported_profile->SetInfo(AutofillType(field_type.field_type()), | 255 imported_profile->SetInfo(field_type, value); |
| 260 value); | |
| 261 ++importable_fields; | 256 ++importable_fields; |
| 262 } | 257 } |
| 263 } | 258 } |
| 264 } | 259 } |
| 265 | 260 |
| 266 // If the user did not enter enough information on the page then don't bother | 261 // If the user did not enter enough information on the page then don't bother |
| 267 // importing the data. | 262 // importing the data. |
| 268 if (importable_fields < kMinProfileImportSize) | 263 if (importable_fields < kMinProfileImportSize) |
| 269 imported_profile.reset(); | 264 imported_profile.reset(); |
| 270 if (importable_credit_card_fields < kMinCreditCardImportSize) | 265 if (importable_credit_card_fields < kMinCreditCardImportSize) |
| 271 local_imported_credit_card.reset(); | 266 local_imported_credit_card.reset(); |
| 272 | 267 |
| 273 if (imported_profile.get() && !IsMinimumAddress(*imported_profile.get())) | 268 if (imported_profile.get() && !IsMinimumAddress(*imported_profile.get())) |
| 274 imported_profile.reset(); | 269 imported_profile.reset(); |
| 275 | 270 |
| 276 if (local_imported_credit_card.get() && | 271 if (local_imported_credit_card.get() && |
| 277 !CreditCard::IsCreditCardNumber(local_imported_credit_card->GetFieldText( | 272 !CreditCard::IsCreditCardNumber(local_imported_credit_card->GetFieldText( |
| 278 AutofillType(CREDIT_CARD_NUMBER)))) { | 273 CREDIT_CARD_NUMBER))) { |
| 279 local_imported_credit_card.reset(); | 274 local_imported_credit_card.reset(); |
| 280 } | 275 } |
| 281 | 276 |
| 282 // Don't import if we already have this info. | 277 // Don't import if we already have this info. |
| 283 if (local_imported_credit_card.get()) { | 278 if (local_imported_credit_card.get()) { |
| 284 for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); | 279 for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); |
| 285 iter != credit_cards_.end(); | 280 iter != credit_cards_.end(); |
| 286 ++iter) { | 281 ++iter) { |
| 287 if (local_imported_credit_card->IsSubsetOf(**iter)) { | 282 if (local_imported_credit_card->IsSubsetOf(**iter)) { |
| 288 local_imported_credit_card.reset(); | 283 local_imported_credit_card.reset(); |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 823 } | 818 } |
| 824 | 819 |
| 825 const AutofillMetrics* PersonalDataManager::metric_logger() const { | 820 const AutofillMetrics* PersonalDataManager::metric_logger() const { |
| 826 return metric_logger_.get(); | 821 return metric_logger_.get(); |
| 827 } | 822 } |
| 828 | 823 |
| 829 void PersonalDataManager::set_metric_logger( | 824 void PersonalDataManager::set_metric_logger( |
| 830 const AutofillMetrics* metric_logger) { | 825 const AutofillMetrics* metric_logger) { |
| 831 metric_logger_.reset(metric_logger); | 826 metric_logger_.reset(metric_logger); |
| 832 } | 827 } |
| OLD | NEW |