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. |
|
dhollowa
2011/05/13 18:55:35
personal_data_manager_mac.cc needs to be fixed. I
GeorgeY
2011/05/18 17:41:45
Commented it out for now, could you, please, fix i
| |
| 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" |
| 11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| 12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
| 13 #include "chrome/browser/autofill/autofill-inl.h" | 13 #include "chrome/browser/autofill/autofill-inl.h" |
| 14 #include "chrome/browser/autofill/autofill_field.h" | 14 #include "chrome/browser/autofill/autofill_field.h" |
| 15 #include "chrome/browser/autofill/autofill_metrics.h" | 15 #include "chrome/browser/autofill/autofill_metrics.h" |
| 16 #include "chrome/browser/autofill/form_structure.h" | 16 #include "chrome/browser/autofill/form_structure.h" |
| 17 #include "chrome/browser/autofill/phone_number.h" | 17 #include "chrome/browser/autofill/phone_number.h" |
| 18 #include "chrome/browser/autofill/phone_number_i18n.h" | |
| 18 #include "chrome/browser/autofill/select_control_handler.h" | 19 #include "chrome/browser/autofill/select_control_handler.h" |
| 19 #include "chrome/browser/prefs/pref_service.h" | 20 #include "chrome/browser/prefs/pref_service.h" |
| 20 #include "chrome/browser/profiles/profile.h" | 21 #include "chrome/browser/profiles/profile.h" |
| 21 #include "chrome/browser/sync/profile_sync_service.h" | 22 #include "chrome/browser/sync/profile_sync_service.h" |
| 22 #include "chrome/browser/webdata/web_data_service.h" | 23 #include "chrome/browser/webdata/web_data_service.h" |
| 23 #include "chrome/common/pref_names.h" | 24 #include "chrome/common/pref_names.h" |
| 24 #include "content/browser/browser_thread.h" | 25 #include "content/browser/browser_thread.h" |
| 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRegularExpression. h" | 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRegularExpression. h" |
| 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" | 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
| 27 | 28 |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 195 scoped_ptr<CreditCard> local_imported_credit_card(new CreditCard); | 196 scoped_ptr<CreditCard> local_imported_credit_card(new CreditCard); |
| 196 | 197 |
| 197 // Parse the form and construct a profile based on the information that is | 198 // Parse the form and construct a profile based on the information that is |
| 198 // possible to import. | 199 // possible to import. |
| 199 int importable_credit_card_fields = 0; | 200 int importable_credit_card_fields = 0; |
| 200 std::vector<const FormStructure*>::const_iterator iter; | 201 std::vector<const FormStructure*>::const_iterator iter; |
| 201 | 202 |
| 202 // Detect and discard forms with multiple fields of the same type. | 203 // Detect and discard forms with multiple fields of the same type. |
| 203 std::set<AutofillFieldType> types_seen; | 204 std::set<AutofillFieldType> types_seen; |
| 204 | 205 |
| 206 // We only set complete phone, so aggregate phone parts in these vars and set | |
|
dhollowa
2011/05/13 18:55:35
The phone/fax specific logic in this function is g
GeorgeY
2011/05/18 17:41:45
simplified it (see code)
| |
| 207 // complete at the end. | |
| 208 string16 home_number; | |
| 209 string16 home_city_code; | |
| 210 string16 home_country_code; | |
| 211 string16 fax_number; | |
| 212 string16 fax_city_code; | |
| 213 string16 fax_country_code; | |
| 214 | |
| 205 for (size_t i = 0; i < form.field_count(); ++i) { | 215 for (size_t i = 0; i < form.field_count(); ++i) { |
| 206 const AutofillField* field = form.field(i); | 216 const AutofillField* field = form.field(i); |
| 207 string16 value = CollapseWhitespace(field->value, false); | 217 string16 value = CollapseWhitespace(field->value, false); |
| 208 | 218 |
| 209 // If we don't know the type of the field, or the user hasn't entered any | 219 // If we don't know the type of the field, or the user hasn't entered any |
| 210 // information into the field, then skip it. | 220 // information into the field, then skip it. |
| 211 if (!field->IsFieldFillable() || value.empty()) | 221 if (!field->IsFieldFillable() || value.empty()) |
| 212 continue; | 222 continue; |
| 213 | 223 |
| 214 AutofillFieldType field_type = field->type(); | 224 AutofillFieldType field_type = field->type(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 238 } else { | 248 } else { |
| 239 if (field_type == CREDIT_CARD_NUMBER) { | 249 if (field_type == CREDIT_CARD_NUMBER) { |
| 240 // Clean up any imported credit card numbers. | 250 // Clean up any imported credit card numbers. |
| 241 value = CreditCard::StripSeparators(value); | 251 value = CreditCard::StripSeparators(value); |
| 242 } | 252 } |
| 243 local_imported_credit_card->SetInfo(field_type, value); | 253 local_imported_credit_card->SetInfo(field_type, value); |
| 244 } | 254 } |
| 245 ++importable_credit_card_fields; | 255 ++importable_credit_card_fields; |
| 246 } | 256 } |
| 247 } else { | 257 } else { |
| 248 // In the case of a phone number, if the whole phone number was entered | |
| 249 // into a single field, then parse it and set the sub components. | |
| 250 if (AutofillType(field_type).subgroup() == | |
| 251 AutofillType::PHONE_WHOLE_NUMBER) { | |
| 252 string16 number; | |
| 253 string16 city_code; | |
| 254 string16 country_code; | |
| 255 PhoneNumber::ParsePhoneNumber(value, | |
| 256 &number, | |
| 257 &city_code, | |
| 258 &country_code); | |
| 259 if (number.empty()) | |
| 260 continue; | |
| 261 | |
| 262 if (group == AutofillType::PHONE_HOME) { | |
| 263 imported_profile->SetInfo(PHONE_HOME_COUNTRY_CODE, country_code); | |
| 264 imported_profile->SetInfo(PHONE_HOME_CITY_CODE, city_code); | |
| 265 imported_profile->SetInfo(PHONE_HOME_NUMBER, number); | |
| 266 } else if (group == AutofillType::PHONE_FAX) { | |
| 267 imported_profile->SetInfo(PHONE_FAX_COUNTRY_CODE, country_code); | |
| 268 imported_profile->SetInfo(PHONE_FAX_CITY_CODE, city_code); | |
| 269 imported_profile->SetInfo(PHONE_FAX_NUMBER, number); | |
| 270 } | |
| 271 | |
| 272 continue; | |
| 273 } | |
| 274 | |
| 275 // Phone and fax numbers can be split across multiple fields, so we | 258 // Phone and fax numbers can be split across multiple fields, so we |
| 276 // might have already stored the prefix, and now be at the suffix. | 259 // might have already stored the prefix, and now be at the suffix. |
| 277 // If so, combine them to form the full number. | 260 // If so, combine them to form the full number. |
| 278 if (group == AutofillType::PHONE_HOME || | 261 switch (field_type) { |
| 279 group == AutofillType::PHONE_FAX) { | 262 case PHONE_HOME_CITY_CODE: |
| 280 AutofillFieldType number_type = PHONE_HOME_NUMBER; | 263 home_city_code = value; |
| 281 if (group == AutofillType::PHONE_FAX) | 264 break; |
| 282 number_type = PHONE_FAX_NUMBER; | 265 case PHONE_HOME_COUNTRY_CODE: |
| 283 | 266 home_country_code = value; |
| 284 string16 stored_number = imported_profile->GetInfo(number_type); | 267 break; |
| 285 if (stored_number.size() == | 268 case PHONE_HOME_CITY_AND_NUMBER: |
| 286 static_cast<size_t>(PhoneNumber::kPrefixLength) && | 269 home_number = value; |
| 287 value.size() == static_cast<size_t>(PhoneNumber::kSuffixLength)) { | 270 break; |
| 288 value = stored_number + value; | 271 // Phone and fax numbers can be split across multiple fields, so we |
| 289 } | 272 // might have already stored the prefix, and now be at the suffix. |
| 273 // If so, combine them to form the full number. | |
| 274 case PHONE_HOME_NUMBER: | |
| 275 home_number.append(value); | |
| 276 break; | |
| 277 case PHONE_FAX_CITY_CODE: | |
| 278 fax_city_code = value; | |
| 279 break; | |
| 280 case PHONE_FAX_COUNTRY_CODE: | |
| 281 fax_country_code = value; | |
| 282 break; | |
| 283 case PHONE_FAX_NUMBER: | |
| 284 fax_number.append(value); | |
| 285 break; | |
| 286 case PHONE_FAX_CITY_AND_NUMBER: | |
| 287 fax_number = value; | |
| 288 break; | |
| 289 default: | |
| 290 imported_profile->SetInfo(field_type, value); | |
| 291 break; | |
| 290 } | 292 } |
| 291 | 293 |
| 292 imported_profile->SetInfo(field_type, value); | |
| 293 | |
| 294 // Reject profiles with invalid country information. | 294 // Reject profiles with invalid country information. |
| 295 if (field_type == ADDRESS_HOME_COUNTRY && | 295 if (field_type == ADDRESS_HOME_COUNTRY && |
| 296 !value.empty() && imported_profile->CountryCode().empty()) { | 296 !value.empty() && imported_profile->CountryCode().empty()) { |
| 297 imported_profile.reset(); | 297 imported_profile.reset(); |
| 298 break; | 298 break; |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 } | 301 } |
| 302 | 302 |
| 303 // Build phone numbers if they are from parts. | |
| 304 if (imported_profile.get()) { | |
| 305 if (!home_number.empty()) { | |
| 306 string16 constructed_number; | |
| 307 if (!autofill_i18n::ConstructPhoneNumber( | |
| 308 home_country_code, home_city_code, home_number, | |
| 309 imported_profile->CountryCode(), | |
| 310 (home_country_code.empty() ? | |
| 311 autofill_i18n::NATIONAL : autofill_i18n::INTERNATIONAL), | |
| 312 &constructed_number)) { | |
| 313 imported_profile.reset(); | |
| 314 } else { | |
| 315 imported_profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number); | |
| 316 } | |
| 317 } | |
| 318 if (!fax_number.empty()) { | |
| 319 string16 constructed_number; | |
| 320 if (!autofill_i18n::ConstructPhoneNumber( | |
| 321 fax_country_code, fax_city_code, fax_number, | |
| 322 imported_profile->CountryCode(), | |
| 323 (fax_country_code.empty() ? | |
| 324 autofill_i18n::NATIONAL : autofill_i18n::INTERNATIONAL), | |
| 325 &constructed_number)) { | |
| 326 imported_profile.reset(); | |
| 327 } else { | |
| 328 imported_profile->SetInfo(PHONE_FAX_WHOLE_NUMBER, constructed_number); | |
| 329 } | |
| 330 } | |
| 331 } | |
| 332 // Normalize phone numbers. | |
| 333 if (imported_profile.get()) { | |
| 334 // Reject profile if even one of the phones is invalid. | |
| 335 if (!imported_profile->NormalizePhones()) | |
|
Ilya Sherman
2011/05/14 04:38:51
It looks like this is the only place where Normali
GeorgeY
2011/05/18 17:41:45
home_number_, fax_number_ are encapsulated in prof
| |
| 336 imported_profile.reset(); | |
| 337 } | |
| 338 | |
| 303 // Reject the profile if minimum address and validation requirements are not | 339 // Reject the profile if minimum address and validation requirements are not |
| 304 // met. | 340 // met. |
| 305 if (imported_profile.get() && !IsValidLearnableProfile(*imported_profile)) | 341 if (imported_profile.get() && !IsValidLearnableProfile(*imported_profile)) |
| 306 imported_profile.reset(); | 342 imported_profile.reset(); |
| 307 | 343 |
| 308 // Reject the credit card if we did not detect enough filled credit card | 344 // Reject the credit card if we did not detect enough filled credit card |
| 309 // fields or if the credit card number does not seem to be valid. | 345 // fields or if the credit card number does not seem to be valid. |
| 310 if (local_imported_credit_card.get() && | 346 if (local_imported_credit_card.get() && |
| 311 (importable_credit_card_fields < kMinCreditCardImportSize || | 347 (importable_credit_card_fields < kMinCreditCardImportSize || |
| 312 !CreditCard::IsValidCreditCardNumber( | 348 !CreditCard::IsValidCreditCardNumber( |
| (...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 937 } | 973 } |
| 938 | 974 |
| 939 const AutofillMetrics* PersonalDataManager::metric_logger() const { | 975 const AutofillMetrics* PersonalDataManager::metric_logger() const { |
| 940 return metric_logger_.get(); | 976 return metric_logger_.get(); |
| 941 } | 977 } |
| 942 | 978 |
| 943 void PersonalDataManager::set_metric_logger( | 979 void PersonalDataManager::set_metric_logger( |
| 944 const AutofillMetrics* metric_logger) { | 980 const AutofillMetrics* metric_logger) { |
| 945 metric_logger_.reset(metric_logger); | 981 metric_logger_.reset(metric_logger); |
| 946 } | 982 } |
| OLD | NEW |