OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/personal_data_manager.h" | 5 #include "components/autofill/browser/personal_data_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <iterator> | 9 #include <iterator> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "base/prefs/pref_service.h" | 13 #include "base/prefs/pref_service.h" |
14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
15 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
16 #include "chrome/common/chrome_notification_types.h" | 16 #include "chrome/common/chrome_notification_types.h" |
17 #include "components/autofill/browser/autofill-inl.h" | 17 #include "components/autofill/browser/autofill-inl.h" |
18 #include "components/autofill/browser/autofill_country.h" | |
19 #include "components/autofill/browser/autofill_field.h" | 18 #include "components/autofill/browser/autofill_field.h" |
20 #include "components/autofill/browser/autofill_metrics.h" | 19 #include "components/autofill/browser/autofill_metrics.h" |
21 #include "components/autofill/browser/form_group.h" | 20 #include "components/autofill/browser/form_group.h" |
22 #include "components/autofill/browser/form_structure.h" | 21 #include "components/autofill/browser/form_structure.h" |
23 #include "components/autofill/browser/personal_data_manager_observer.h" | 22 #include "components/autofill/browser/personal_data_manager_observer.h" |
24 #include "components/autofill/browser/phone_number.h" | 23 #include "components/autofill/browser/phone_number.h" |
25 #include "components/autofill/browser/phone_number_i18n.h" | 24 #include "components/autofill/browser/phone_number_i18n.h" |
26 #include "components/autofill/browser/validation.h" | 25 #include "components/autofill/browser/validation.h" |
27 #include "components/autofill/common/autofill_pref_names.h" | 26 #include "components/autofill/common/autofill_pref_names.h" |
28 #include "components/user_prefs/user_prefs.h" | 27 #include "components/user_prefs/user_prefs.h" |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
103 // Abandon the import if an email address value shows up in a field that is | 102 // Abandon the import if an email address value shows up in a field that is |
104 // not an email address. | 103 // not an email address. |
105 if (field_type != EMAIL_ADDRESS && autofill::IsValidEmailAddress(value)) | 104 if (field_type != EMAIL_ADDRESS && autofill::IsValidEmailAddress(value)) |
106 return false; | 105 return false; |
107 | 106 |
108 return true; | 107 return true; |
109 } | 108 } |
110 | 109 |
111 } // namespace | 110 } // namespace |
112 | 111 |
113 PersonalDataManager::PersonalDataManager() | 112 PersonalDataManager::PersonalDataManager(const std::string& app_locale) |
114 : browser_context_(NULL), | 113 : browser_context_(NULL), |
115 is_data_loaded_(false), | 114 is_data_loaded_(false), |
116 pending_profiles_query_(0), | 115 pending_profiles_query_(0), |
117 pending_creditcards_query_(0), | 116 pending_creditcards_query_(0), |
117 app_locale_(app_locale), | |
118 metric_logger_(new AutofillMetrics), | 118 metric_logger_(new AutofillMetrics), |
119 has_logged_profile_count_(false) {} | 119 has_logged_profile_count_(false) {} |
120 | 120 |
121 void PersonalDataManager::Init(BrowserContext* browser_context) { | 121 void PersonalDataManager::Init(BrowserContext* browser_context) { |
122 browser_context_ = browser_context; | 122 browser_context_ = browser_context; |
123 metric_logger_->LogIsAutofillEnabledAtStartup(IsAutofillEnabled()); | 123 metric_logger_->LogIsAutofillEnabledAtStartup(IsAutofillEnabled()); |
124 | 124 |
125 scoped_refptr<AutofillWebDataService> autofill_data( | 125 scoped_refptr<AutofillWebDataService> autofill_data( |
126 AutofillWebDataService::FromBrowserContext(browser_context_)); | 126 AutofillWebDataService::FromBrowserContext(browser_context_)); |
127 | 127 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
211 // possible to import. | 211 // possible to import. |
212 int importable_credit_card_fields = 0; | 212 int importable_credit_card_fields = 0; |
213 | 213 |
214 // Detect and discard forms with multiple fields of the same type. | 214 // Detect and discard forms with multiple fields of the same type. |
215 std::set<AutofillFieldType> types_seen; | 215 std::set<AutofillFieldType> types_seen; |
216 | 216 |
217 // We only set complete phone, so aggregate phone parts in these vars and set | 217 // We only set complete phone, so aggregate phone parts in these vars and set |
218 // complete at the end. | 218 // complete at the end. |
219 PhoneNumber::PhoneCombineHelper home; | 219 PhoneNumber::PhoneCombineHelper home; |
220 | 220 |
221 const std::string app_locale = AutofillCountry::ApplicationLocale(); | |
222 for (size_t i = 0; i < form.field_count(); ++i) { | 221 for (size_t i = 0; i < form.field_count(); ++i) { |
223 const AutofillField* field = form.field(i); | 222 const AutofillField* field = form.field(i); |
224 string16 value = CollapseWhitespace(field->value, false); | 223 string16 value = CollapseWhitespace(field->value, false); |
225 | 224 |
226 // If we don't know the type of the field, or the user hasn't entered any | 225 // If we don't know the type of the field, or the user hasn't entered any |
227 // information into the field, then skip it. | 226 // information into the field, then skip it. |
228 if (!field->IsFieldFillable() || value.empty()) | 227 if (!field->IsFieldFillable() || value.empty()) |
229 continue; | 228 continue; |
230 | 229 |
231 AutofillFieldType field_type = field->type(); | 230 AutofillFieldType field_type = field->type(); |
232 FieldTypeGroup group(AutofillType(field_type).group()); | 231 FieldTypeGroup group(AutofillType(field_type).group()); |
233 | 232 |
234 // If the |field_type| and |value| don't pass basic validity checks then | 233 // If the |field_type| and |value| don't pass basic validity checks then |
235 // abandon the import. | 234 // abandon the import. |
236 if (!IsValidFieldTypeAndValue(types_seen, field_type, value)) { | 235 if (!IsValidFieldTypeAndValue(types_seen, field_type, value)) { |
237 imported_profile.reset(); | 236 imported_profile.reset(); |
238 local_imported_credit_card.reset(); | 237 local_imported_credit_card.reset(); |
239 break; | 238 break; |
240 } | 239 } |
241 | 240 |
242 types_seen.insert(field_type); | 241 types_seen.insert(field_type); |
243 | 242 |
244 if (group == AutofillType::CREDIT_CARD) { | 243 if (group == AutofillType::CREDIT_CARD) { |
245 if (LowerCaseEqualsASCII(field->form_control_type, "month")) { | 244 if (LowerCaseEqualsASCII(field->form_control_type, "month")) { |
246 DCHECK_EQ(CREDIT_CARD_EXP_MONTH, field_type); | 245 DCHECK_EQ(CREDIT_CARD_EXP_MONTH, field_type); |
247 local_imported_credit_card->SetInfoForMonthInputType(value); | 246 local_imported_credit_card->SetInfoForMonthInputType(value); |
248 } else { | 247 } else { |
249 local_imported_credit_card->SetInfo(field_type, value, app_locale); | 248 local_imported_credit_card->SetInfo(field_type, value, app_locale_); |
250 } | 249 } |
251 ++importable_credit_card_fields; | 250 ++importable_credit_card_fields; |
252 } else { | 251 } else { |
253 // We need to store phone data in the variables, before building the whole | 252 // We need to store phone data in the variables, before building the whole |
254 // number at the end. The rest of the fields are set "as is". | 253 // number at the end. The rest of the fields are set "as is". |
255 // If the fields are not the phone fields in question home.SetInfo() is | 254 // If the fields are not the phone fields in question home.SetInfo() is |
256 // going to return false. | 255 // going to return false. |
257 if (!home.SetInfo(field_type, value)) | 256 if (!home.SetInfo(field_type, value)) |
258 imported_profile->SetInfo(field_type, value, app_locale); | 257 imported_profile->SetInfo(field_type, value, app_locale_); |
259 | 258 |
260 // Reject profiles with invalid country information. | 259 // Reject profiles with invalid country information. |
261 if (field_type == ADDRESS_HOME_COUNTRY && | 260 if (field_type == ADDRESS_HOME_COUNTRY && |
262 !value.empty() && imported_profile->CountryCode().empty()) { | 261 !value.empty() && imported_profile->CountryCode().empty()) { |
263 imported_profile.reset(); | 262 imported_profile.reset(); |
264 break; | 263 break; |
265 } | 264 } |
266 } | 265 } |
267 } | 266 } |
268 | 267 |
269 // Construct the phone number. Reject the profile if the number is invalid. | 268 // Construct the phone number. Reject the profile if the number is invalid. |
270 if (imported_profile.get() && !home.IsEmpty()) { | 269 if (imported_profile.get() && !home.IsEmpty()) { |
271 string16 constructed_number; | 270 string16 constructed_number; |
272 if (!home.ParseNumber(*imported_profile, app_locale, &constructed_number) || | 271 if (!home.ParseNumber(*imported_profile, app_locale_, |
272 &constructed_number) || | |
273 !imported_profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number, | 273 !imported_profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number, |
274 app_locale)) { | 274 app_locale_)) { |
275 imported_profile.reset(); | 275 imported_profile.reset(); |
276 } | 276 } |
277 } | 277 } |
278 | 278 |
279 // Reject the profile if minimum address and validation requirements are not | 279 // Reject the profile if minimum address and validation requirements are not |
280 // met. | 280 // met. |
281 if (imported_profile.get() && !IsValidLearnableProfile(*imported_profile)) | 281 if (imported_profile.get() && !IsValidLearnableProfile(*imported_profile)) |
282 imported_profile.reset(); | 282 imported_profile.reset(); |
283 | 283 |
284 // Reject the credit card if we did not detect enough filled credit card | 284 // Reject the credit card if we did not detect enough filled credit card |
285 // fields or if the credit card number does not seem to be valid. | 285 // fields or if the credit card number does not seem to be valid. |
286 if (local_imported_credit_card.get() && | 286 if (local_imported_credit_card.get() && |
287 !local_imported_credit_card->IsComplete()) { | 287 !local_imported_credit_card->IsComplete()) { |
288 local_imported_credit_card.reset(); | 288 local_imported_credit_card.reset(); |
289 } | 289 } |
290 | 290 |
291 // Don't import if we already have this info. | 291 // Don't import if we already have this info. |
292 // Don't present an infobar if we have already saved this card number. | 292 // Don't present an infobar if we have already saved this card number. |
293 bool merged_credit_card = false; | 293 bool merged_credit_card = false; |
294 if (local_imported_credit_card.get()) { | 294 if (local_imported_credit_card.get()) { |
295 for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); | 295 for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); |
296 iter != credit_cards_.end(); | 296 iter != credit_cards_.end(); |
297 ++iter) { | 297 ++iter) { |
298 if ((*iter)->UpdateFromImportedCard(*local_imported_credit_card.get(), | 298 if ((*iter)->UpdateFromImportedCard(*local_imported_credit_card.get(), |
299 app_locale)) { | 299 app_locale_)) { |
300 merged_credit_card = true; | 300 merged_credit_card = true; |
301 UpdateCreditCard(**iter); | 301 UpdateCreditCard(**iter); |
302 local_imported_credit_card.reset(); | 302 local_imported_credit_card.reset(); |
303 break; | 303 break; |
304 } | 304 } |
305 } | 305 } |
306 } | 306 } |
307 | 307 |
308 if (imported_profile.get()) { | 308 if (imported_profile.get()) { |
309 // We always save imported profiles. | 309 // We always save imported profiles. |
310 SaveImportedProfile(*imported_profile); | 310 SaveImportedProfile(*imported_profile); |
311 } | 311 } |
312 *imported_credit_card = local_imported_credit_card.release(); | 312 *imported_credit_card = local_imported_credit_card.release(); |
313 | 313 |
314 if (imported_profile.get() || *imported_credit_card || merged_credit_card) { | 314 if (imported_profile.get() || *imported_credit_card || merged_credit_card) { |
315 return true; | 315 return true; |
316 } else { | 316 } else { |
317 FOR_EACH_OBSERVER(PersonalDataManagerObserver, observers_, | 317 FOR_EACH_OBSERVER(PersonalDataManagerObserver, observers_, |
318 OnInsufficientFormData()); | 318 OnInsufficientFormData()); |
319 return false; | 319 return false; |
320 } | 320 } |
321 } | 321 } |
322 | 322 |
323 void PersonalDataManager::AddProfile(const AutofillProfile& profile) { | 323 void PersonalDataManager::AddProfile(const AutofillProfile& profile) { |
324 if (browser_context_->IsOffTheRecord()) | 324 if (browser_context_->IsOffTheRecord()) |
325 return; | 325 return; |
326 | 326 |
327 if (profile.IsEmpty()) | 327 if (profile.IsEmpty(app_locale_)) |
328 return; | 328 return; |
329 | 329 |
330 // Don't add an existing profile. | 330 // Don't add an existing profile. |
331 if (FindByGUID<AutofillProfile>(web_profiles_, profile.guid())) | 331 if (FindByGUID<AutofillProfile>(web_profiles_, profile.guid())) |
332 return; | 332 return; |
333 | 333 |
334 scoped_refptr<AutofillWebDataService> autofill_data( | 334 scoped_refptr<AutofillWebDataService> autofill_data( |
335 AutofillWebDataService::FromBrowserContext(browser_context_)); | 335 AutofillWebDataService::FromBrowserContext(browser_context_)); |
336 if (!autofill_data.get()) | 336 if (!autofill_data.get()) |
337 return; | 337 return; |
338 | 338 |
339 // Don't add a duplicate. | 339 // Don't add a duplicate. |
340 if (FindByContents(web_profiles_, profile)) | 340 if (FindByContents(web_profiles_, profile)) |
341 return; | 341 return; |
342 | 342 |
343 // Add the new profile to the web database. | 343 // Add the new profile to the web database. |
344 autofill_data->AddAutofillProfile(profile); | 344 autofill_data->AddAutofillProfile(profile); |
345 | 345 |
346 // Refresh our local cache and send notifications to observers. | 346 // Refresh our local cache and send notifications to observers. |
347 Refresh(); | 347 Refresh(); |
348 } | 348 } |
349 | 349 |
350 void PersonalDataManager::UpdateProfile(const AutofillProfile& profile) { | 350 void PersonalDataManager::UpdateProfile(const AutofillProfile& profile) { |
351 if (browser_context_->IsOffTheRecord()) | 351 if (browser_context_->IsOffTheRecord()) |
352 return; | 352 return; |
353 | 353 |
354 if (!FindByGUID<AutofillProfile>(web_profiles_, profile.guid())) | 354 if (!FindByGUID<AutofillProfile>(web_profiles_, profile.guid())) |
355 return; | 355 return; |
356 | 356 |
357 if (profile.IsEmpty()) { | 357 if (profile.IsEmpty(app_locale_)) { |
358 RemoveByGUID(profile.guid()); | 358 RemoveByGUID(profile.guid()); |
359 return; | 359 return; |
360 } | 360 } |
361 | 361 |
362 scoped_refptr<AutofillWebDataService> autofill_data( | 362 scoped_refptr<AutofillWebDataService> autofill_data( |
363 AutofillWebDataService::FromBrowserContext(browser_context_)); | 363 AutofillWebDataService::FromBrowserContext(browser_context_)); |
364 if (!autofill_data.get()) | 364 if (!autofill_data.get()) |
365 return; | 365 return; |
366 | 366 |
367 // Make the update. | 367 // Make the update. |
(...skipping 11 matching lines...) Expand all Loading... | |
379 if ((*iter)->guid() == guid) | 379 if ((*iter)->guid() == guid) |
380 return *iter; | 380 return *iter; |
381 } | 381 } |
382 return NULL; | 382 return NULL; |
383 } | 383 } |
384 | 384 |
385 void PersonalDataManager::AddCreditCard(const CreditCard& credit_card) { | 385 void PersonalDataManager::AddCreditCard(const CreditCard& credit_card) { |
386 if (browser_context_->IsOffTheRecord()) | 386 if (browser_context_->IsOffTheRecord()) |
387 return; | 387 return; |
388 | 388 |
389 if (credit_card.IsEmpty()) | 389 if (credit_card.IsEmpty(app_locale_)) |
390 return; | 390 return; |
391 | 391 |
392 if (FindByGUID<CreditCard>(credit_cards_, credit_card.guid())) | 392 if (FindByGUID<CreditCard>(credit_cards_, credit_card.guid())) |
393 return; | 393 return; |
394 | 394 |
395 scoped_refptr<AutofillWebDataService> autofill_data( | 395 scoped_refptr<AutofillWebDataService> autofill_data( |
396 AutofillWebDataService::FromBrowserContext(browser_context_)); | 396 AutofillWebDataService::FromBrowserContext(browser_context_)); |
397 if (!autofill_data.get()) | 397 if (!autofill_data.get()) |
398 return; | 398 return; |
399 | 399 |
400 // Don't add a duplicate. | 400 // Don't add a duplicate. |
401 if (FindByContents(credit_cards_, credit_card)) | 401 if (FindByContents(credit_cards_, credit_card)) |
402 return; | 402 return; |
403 | 403 |
404 // Add the new credit card to the web database. | 404 // Add the new credit card to the web database. |
405 autofill_data->AddCreditCard(credit_card); | 405 autofill_data->AddCreditCard(credit_card); |
406 | 406 |
407 // Refresh our local cache and send notifications to observers. | 407 // Refresh our local cache and send notifications to observers. |
408 Refresh(); | 408 Refresh(); |
409 } | 409 } |
410 | 410 |
411 void PersonalDataManager::UpdateCreditCard(const CreditCard& credit_card) { | 411 void PersonalDataManager::UpdateCreditCard(const CreditCard& credit_card) { |
412 if (browser_context_->IsOffTheRecord()) | 412 if (browser_context_->IsOffTheRecord()) |
413 return; | 413 return; |
414 | 414 |
415 if (!FindByGUID<CreditCard>(credit_cards_, credit_card.guid())) | 415 if (!FindByGUID<CreditCard>(credit_cards_, credit_card.guid())) |
416 return; | 416 return; |
417 | 417 |
418 if (credit_card.IsEmpty()) { | 418 if (credit_card.IsEmpty(app_locale_)) { |
419 RemoveByGUID(credit_card.guid()); | 419 RemoveByGUID(credit_card.guid()); |
420 return; | 420 return; |
421 } | 421 } |
422 | 422 |
423 scoped_refptr<AutofillWebDataService> autofill_data( | 423 scoped_refptr<AutofillWebDataService> autofill_data( |
424 AutofillWebDataService::FromBrowserContext(browser_context_)); | 424 AutofillWebDataService::FromBrowserContext(browser_context_)); |
425 if (!autofill_data.get()) | 425 if (!autofill_data.get()) |
426 return; | 426 return; |
427 | 427 |
428 // Make the update. | 428 // Make the update. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
460 for (std::vector<CreditCard*>::iterator iter = credit_cards_.begin(); | 460 for (std::vector<CreditCard*>::iterator iter = credit_cards_.begin(); |
461 iter != credit_cards_.end(); ++iter) { | 461 iter != credit_cards_.end(); ++iter) { |
462 if ((*iter)->guid() == guid) | 462 if ((*iter)->guid() == guid) |
463 return *iter; | 463 return *iter; |
464 } | 464 } |
465 return NULL; | 465 return NULL; |
466 } | 466 } |
467 | 467 |
468 void PersonalDataManager::GetNonEmptyTypes( | 468 void PersonalDataManager::GetNonEmptyTypes( |
469 FieldTypeSet* non_empty_types) { | 469 FieldTypeSet* non_empty_types) { |
470 const std::string app_locale = AutofillCountry::ApplicationLocale(); | |
471 const std::vector<AutofillProfile*>& profiles = GetProfiles(); | 470 const std::vector<AutofillProfile*>& profiles = GetProfiles(); |
472 for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin(); | 471 for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin(); |
473 iter != profiles.end(); ++iter) { | 472 iter != profiles.end(); ++iter) { |
474 (*iter)->GetNonEmptyTypes(app_locale, non_empty_types); | 473 (*iter)->GetNonEmptyTypes(app_locale_, non_empty_types); |
475 } | 474 } |
476 | 475 |
477 for (ScopedVector<CreditCard>::const_iterator iter = credit_cards_.begin(); | 476 for (ScopedVector<CreditCard>::const_iterator iter = credit_cards_.begin(); |
478 iter != credit_cards_.end(); ++iter) { | 477 iter != credit_cards_.end(); ++iter) { |
479 (*iter)->GetNonEmptyTypes(app_locale, non_empty_types); | 478 (*iter)->GetNonEmptyTypes(app_locale_, non_empty_types); |
480 } | 479 } |
481 } | 480 } |
482 | 481 |
483 bool PersonalDataManager::IsDataLoaded() const { | 482 bool PersonalDataManager::IsDataLoaded() const { |
484 return is_data_loaded_; | 483 return is_data_loaded_; |
485 } | 484 } |
486 | 485 |
487 const std::vector<AutofillProfile*>& PersonalDataManager::GetProfiles() { | 486 const std::vector<AutofillProfile*>& PersonalDataManager::GetProfiles() { |
488 if (!components::UserPrefs::Get(browser_context_)->GetBoolean( | 487 if (!components::UserPrefs::Get(browser_context_)->GetBoolean( |
489 prefs::kAutofillAuxiliaryProfilesEnabled)) { | 488 prefs::kAutofillAuxiliaryProfilesEnabled)) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
522 std::vector<string16>* values, | 521 std::vector<string16>* values, |
523 std::vector<string16>* labels, | 522 std::vector<string16>* labels, |
524 std::vector<string16>* icons, | 523 std::vector<string16>* icons, |
525 std::vector<GUIDPair>* guid_pairs) { | 524 std::vector<GUIDPair>* guid_pairs) { |
526 values->clear(); | 525 values->clear(); |
527 labels->clear(); | 526 labels->clear(); |
528 icons->clear(); | 527 icons->clear(); |
529 guid_pairs->clear(); | 528 guid_pairs->clear(); |
530 | 529 |
531 const std::vector<AutofillProfile*>& profiles = GetProfiles(); | 530 const std::vector<AutofillProfile*>& profiles = GetProfiles(); |
532 const std::string app_locale = AutofillCountry::ApplicationLocale(); | |
533 std::vector<AutofillProfile*> matched_profiles; | 531 std::vector<AutofillProfile*> matched_profiles; |
534 for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin(); | 532 for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin(); |
535 iter != profiles.end(); ++iter) { | 533 iter != profiles.end(); ++iter) { |
536 AutofillProfile* profile = *iter; | 534 AutofillProfile* profile = *iter; |
537 | 535 |
538 // The value of the stored data for this field type in the |profile|. | 536 // The value of the stored data for this field type in the |profile|. |
539 std::vector<string16> multi_values; | 537 std::vector<string16> multi_values; |
540 profile->GetMultiInfo(type, app_locale, &multi_values); | 538 profile->GetMultiInfo(type, app_locale_, &multi_values); |
541 | 539 |
542 for (size_t i = 0; i < multi_values.size(); ++i) { | 540 for (size_t i = 0; i < multi_values.size(); ++i) { |
543 if (!field_is_autofilled) { | 541 if (!field_is_autofilled) { |
544 // Suggest data that starts with what the user has typed. | 542 // Suggest data that starts with what the user has typed. |
545 if (!multi_values[i].empty() && | 543 if (!multi_values[i].empty() && |
546 StartsWith(multi_values[i], field_contents, false)) { | 544 StartsWith(multi_values[i], field_contents, false)) { |
547 matched_profiles.push_back(profile); | 545 matched_profiles.push_back(profile); |
548 values->push_back(multi_values[i]); | 546 values->push_back(multi_values[i]); |
549 guid_pairs->push_back(GUIDPair(profile->guid(), i)); | 547 guid_pairs->push_back(GUIDPair(profile->guid(), i)); |
550 } | 548 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
595 icons->resize(values->size()); | 593 icons->resize(values->size()); |
596 } | 594 } |
597 | 595 |
598 void PersonalDataManager::GetCreditCardSuggestions( | 596 void PersonalDataManager::GetCreditCardSuggestions( |
599 AutofillFieldType type, | 597 AutofillFieldType type, |
600 const string16& field_contents, | 598 const string16& field_contents, |
601 std::vector<string16>* values, | 599 std::vector<string16>* values, |
602 std::vector<string16>* labels, | 600 std::vector<string16>* labels, |
603 std::vector<string16>* icons, | 601 std::vector<string16>* icons, |
604 std::vector<GUIDPair>* guid_pairs) { | 602 std::vector<GUIDPair>* guid_pairs) { |
605 const std::string app_locale = AutofillCountry::ApplicationLocale(); | |
606 for (std::vector<CreditCard*>::const_iterator iter = credit_cards().begin(); | 603 for (std::vector<CreditCard*>::const_iterator iter = credit_cards().begin(); |
607 iter != credit_cards().end(); ++iter) { | 604 iter != credit_cards().end(); ++iter) { |
608 CreditCard* credit_card = *iter; | 605 CreditCard* credit_card = *iter; |
609 | 606 |
610 // The value of the stored data for this field type in the |credit_card|. | 607 // The value of the stored data for this field type in the |credit_card|. |
611 string16 creditcard_field_value = credit_card->GetInfo(type, app_locale); | 608 string16 creditcard_field_value = credit_card->GetInfo(type, app_locale_); |
612 if (!creditcard_field_value.empty() && | 609 if (!creditcard_field_value.empty() && |
613 StartsWith(creditcard_field_value, field_contents, false)) { | 610 StartsWith(creditcard_field_value, field_contents, false)) { |
614 if (type == CREDIT_CARD_NUMBER) | 611 if (type == CREDIT_CARD_NUMBER) |
615 creditcard_field_value = credit_card->ObfuscatedNumber(); | 612 creditcard_field_value = credit_card->ObfuscatedNumber(); |
616 | 613 |
617 string16 label; | 614 string16 label; |
618 if (credit_card->number().empty()) { | 615 if (credit_card->number().empty()) { |
619 // If there is no CC number, return name to show something. | 616 // If there is no CC number, return name to show something. |
620 label = credit_card->GetInfo(CREDIT_CARD_NAME, app_locale); | 617 label = credit_card->GetInfo(CREDIT_CARD_NAME, app_locale_); |
621 } else { | 618 } else { |
622 label = kCreditCardPrefix; | 619 label = kCreditCardPrefix; |
623 label.append(credit_card->LastFourDigits()); | 620 label.append(credit_card->LastFourDigits()); |
624 } | 621 } |
625 | 622 |
626 values->push_back(creditcard_field_value); | 623 values->push_back(creditcard_field_value); |
627 labels->push_back(label); | 624 labels->push_back(label); |
628 icons->push_back(UTF8ToUTF16(credit_card->type())); | 625 icons->push_back(UTF8ToUTF16(credit_card->type())); |
629 guid_pairs->push_back(GUIDPair(credit_card->guid(), 0)); | 626 guid_pairs->push_back(GUIDPair(credit_card->guid(), 0)); |
630 } | 627 } |
(...skipping 28 matching lines...) Expand all Loading... | |
659 !autofill::IsValidZip(zip)) | 656 !autofill::IsValidZip(zip)) |
660 return false; | 657 return false; |
661 | 658 |
662 return true; | 659 return true; |
663 } | 660 } |
664 | 661 |
665 // static | 662 // static |
666 bool PersonalDataManager::MergeProfile( | 663 bool PersonalDataManager::MergeProfile( |
667 const AutofillProfile& profile, | 664 const AutofillProfile& profile, |
668 const std::vector<AutofillProfile*>& existing_profiles, | 665 const std::vector<AutofillProfile*>& existing_profiles, |
666 const std::string& app_locale, | |
669 std::vector<AutofillProfile>* merged_profiles) { | 667 std::vector<AutofillProfile>* merged_profiles) { |
670 merged_profiles->clear(); | 668 merged_profiles->clear(); |
671 | 669 |
672 // Set to true if |profile| is merged into |existing_profiles|. | 670 // Set to true if |profile| is merged into |existing_profiles|. |
673 bool merged = false; | 671 bool merged = false; |
674 | 672 |
675 // If we have already saved this address, merge in any missing values. | 673 // If we have already saved this address, merge in any missing values. |
676 // Only merge with the first match. | 674 // Only merge with the first match. |
677 for (std::vector<AutofillProfile*>::const_iterator iter = | 675 for (std::vector<AutofillProfile*>::const_iterator iter = |
678 existing_profiles.begin(); | 676 existing_profiles.begin(); |
679 iter != existing_profiles.end(); ++iter) { | 677 iter != existing_profiles.end(); ++iter) { |
680 if (!merged) { | 678 if (!merged) { |
681 if (!profile.PrimaryValue().empty() && | 679 if (!profile.PrimaryValue().empty() && |
682 StringToLowerASCII((*iter)->PrimaryValue()) == | 680 StringToLowerASCII((*iter)->PrimaryValue()) == |
683 StringToLowerASCII(profile.PrimaryValue())) { | 681 StringToLowerASCII(profile.PrimaryValue())) { |
684 merged = true; | 682 merged = true; |
685 (*iter)->OverwriteWithOrAddTo(profile); | 683 (*iter)->OverwriteWithOrAddTo(profile, app_locale); |
686 } | 684 } |
687 } | 685 } |
688 merged_profiles->push_back(**iter); | 686 merged_profiles->push_back(**iter); |
689 } | 687 } |
690 | 688 |
691 // If the new profile was not merged with an existing one, add it to the list. | 689 // If the new profile was not merged with an existing one, add it to the list. |
692 if (!merged) | 690 if (!merged) |
693 merged_profiles->push_back(profile); | 691 merged_profiles->push_back(profile); |
694 | 692 |
695 return merged; | 693 return merged; |
696 } | 694 } |
697 | 695 |
698 void PersonalDataManager::SetProfiles(std::vector<AutofillProfile>* profiles) { | 696 void PersonalDataManager::SetProfiles(std::vector<AutofillProfile>* profiles) { |
699 if (browser_context_->IsOffTheRecord()) | 697 if (browser_context_->IsOffTheRecord()) |
700 return; | 698 return; |
701 | 699 |
702 // Remove empty profiles from input. | 700 // Remove empty profiles from input. |
703 profiles->erase( | 701 for (std::vector<AutofillProfile>::iterator i = profiles->begin(); |
Ilya Sherman
2013/04/04 04:27:38
nit: Please use "it" for the iterator name.
jam
2013/04/04 17:58:12
Done.
jam
2013/04/04 17:58:12
Done.
| |
704 std::remove_if(profiles->begin(), profiles->end(), | 702 i != profiles->end();) { |
705 std::mem_fun_ref(&AutofillProfile::IsEmpty)), | 703 if (i->IsEmpty(app_locale_)) { |
706 profiles->end()); | 704 profiles->erase(i); |
705 } else { | |
706 i++; | |
707 } | |
Ilya Sherman
2013/04/04 04:27:38
nit: No need for curly braces.
jam
2013/04/04 17:58:12
yeah, i prefer having them when there's an else. t
Ilya Sherman
2013/04/04 23:00:40
The style guide might not set a rule for this, but
| |
708 } | |
707 | 709 |
708 // Ensure that profile labels are up to date. Currently, sync relies on | 710 // Ensure that profile labels are up to date. Currently, sync relies on |
709 // labels to identify a profile. | 711 // labels to identify a profile. |
710 // TODO(dhollowa): We need to deprecate labels and update the way sync | 712 // TODO(dhollowa): We need to deprecate labels and update the way sync |
711 // identifies profiles. | 713 // identifies profiles. |
712 std::vector<AutofillProfile*> profile_pointers(profiles->size()); | 714 std::vector<AutofillProfile*> profile_pointers(profiles->size()); |
713 std::transform(profiles->begin(), profiles->end(), profile_pointers.begin(), | 715 std::transform(profiles->begin(), profiles->end(), profile_pointers.begin(), |
714 address_of<AutofillProfile>); | 716 address_of<AutofillProfile>); |
715 AutofillProfile::AdjustInferredLabels(&profile_pointers); | 717 AutofillProfile::AdjustInferredLabels(&profile_pointers); |
716 | 718 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
753 // Refresh our local cache and send notifications to observers. | 755 // Refresh our local cache and send notifications to observers. |
754 Refresh(); | 756 Refresh(); |
755 } | 757 } |
756 | 758 |
757 void PersonalDataManager::SetCreditCards( | 759 void PersonalDataManager::SetCreditCards( |
758 std::vector<CreditCard>* credit_cards) { | 760 std::vector<CreditCard>* credit_cards) { |
759 if (browser_context_->IsOffTheRecord()) | 761 if (browser_context_->IsOffTheRecord()) |
760 return; | 762 return; |
761 | 763 |
762 // Remove empty credit cards from input. | 764 // Remove empty credit cards from input. |
763 credit_cards->erase( | 765 for (std::vector<CreditCard>::iterator i = credit_cards->begin(); |
764 std::remove_if( | 766 i != credit_cards->end();) { |
Ilya Sherman
2013/04/04 04:27:38
nit: Please use "it" for the iterator name.
jam
2013/04/04 17:58:12
Done.
| |
765 credit_cards->begin(), credit_cards->end(), | 767 if (i->IsEmpty(app_locale_)) { |
766 std::mem_fun_ref(&CreditCard::IsEmpty)), | 768 credit_cards->erase(i); |
767 credit_cards->end()); | 769 } else { |
770 i++; | |
771 } | |
Ilya Sherman
2013/04/04 04:27:38
nit: No need for curly braces.
| |
772 } | |
768 | 773 |
769 scoped_refptr<AutofillWebDataService> autofill_data( | 774 scoped_refptr<AutofillWebDataService> autofill_data( |
770 AutofillWebDataService::FromBrowserContext(browser_context_)); | 775 AutofillWebDataService::FromBrowserContext(browser_context_)); |
771 if (!autofill_data.get()) | 776 if (!autofill_data.get()) |
772 return; | 777 return; |
773 | 778 |
774 // Any credit cards that are not in the new credit card list should be | 779 // Any credit cards that are not in the new credit card list should be |
775 // removed. | 780 // removed. |
776 for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); | 781 for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); |
777 iter != credit_cards_.end(); ++iter) { | 782 iter != credit_cards_.end(); ++iter) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
895 // upon form submission. | 900 // upon form submission. |
896 NOTREACHED(); | 901 NOTREACHED(); |
897 return; | 902 return; |
898 } | 903 } |
899 | 904 |
900 // Don't save a web profile if the data in the profile is a subset of an | 905 // Don't save a web profile if the data in the profile is a subset of an |
901 // auxiliary profile. | 906 // auxiliary profile. |
902 for (std::vector<AutofillProfile*>::const_iterator iter = | 907 for (std::vector<AutofillProfile*>::const_iterator iter = |
903 auxiliary_profiles_.begin(); | 908 auxiliary_profiles_.begin(); |
904 iter != auxiliary_profiles_.end(); ++iter) { | 909 iter != auxiliary_profiles_.end(); ++iter) { |
905 if (imported_profile.IsSubsetOf(**iter)) | 910 if (imported_profile.IsSubsetOf(**iter, app_locale_)) |
906 return; | 911 return; |
907 } | 912 } |
908 | 913 |
909 std::vector<AutofillProfile> profiles; | 914 std::vector<AutofillProfile> profiles; |
910 MergeProfile(imported_profile, web_profiles_.get(), &profiles); | 915 MergeProfile(imported_profile, web_profiles_.get(), app_locale_, &profiles); |
911 SetProfiles(&profiles); | 916 SetProfiles(&profiles); |
912 } | 917 } |
913 | 918 |
914 | 919 |
915 void PersonalDataManager::SaveImportedCreditCard( | 920 void PersonalDataManager::SaveImportedCreditCard( |
916 const CreditCard& imported_card) { | 921 const CreditCard& imported_card) { |
917 DCHECK(!imported_card.number().empty()); | 922 DCHECK(!imported_card.number().empty()); |
918 if (browser_context_->IsOffTheRecord()) { | 923 if (browser_context_->IsOffTheRecord()) { |
919 // The |IsOffTheRecord| check should happen earlier in the import process, | 924 // The |IsOffTheRecord| check should happen earlier in the import process, |
920 // upon form submission. | 925 // upon form submission. |
921 NOTREACHED(); | 926 NOTREACHED(); |
922 return; | 927 return; |
923 } | 928 } |
924 | 929 |
925 // Set to true if |imported_card| is merged into the credit card list. | 930 // Set to true if |imported_card| is merged into the credit card list. |
926 bool merged = false; | 931 bool merged = false; |
927 | 932 |
928 const std::string app_locale = AutofillCountry::ApplicationLocale(); | |
929 std::vector<CreditCard> credit_cards; | 933 std::vector<CreditCard> credit_cards; |
930 for (std::vector<CreditCard*>::const_iterator card = credit_cards_.begin(); | 934 for (std::vector<CreditCard*>::const_iterator card = credit_cards_.begin(); |
931 card != credit_cards_.end(); | 935 card != credit_cards_.end(); |
932 ++card) { | 936 ++card) { |
933 // If |imported_card| has not yet been merged, check whether it should be | 937 // If |imported_card| has not yet been merged, check whether it should be |
934 // with the current |card|. | 938 // with the current |card|. |
935 if (!merged && (*card)->UpdateFromImportedCard(imported_card, app_locale)) | 939 if (!merged && (*card)->UpdateFromImportedCard(imported_card, app_locale_)) |
936 merged = true; | 940 merged = true; |
937 | 941 |
938 credit_cards.push_back(**card); | 942 credit_cards.push_back(**card); |
939 } | 943 } |
940 | 944 |
941 if (!merged) | 945 if (!merged) |
942 credit_cards.push_back(imported_card); | 946 credit_cards.push_back(imported_card); |
943 | 947 |
944 SetCreditCards(&credit_cards); | 948 SetCreditCards(&credit_cards); |
945 } | 949 } |
(...skipping 11 matching lines...) Expand all Loading... | |
957 | 961 |
958 void PersonalDataManager::set_metric_logger( | 962 void PersonalDataManager::set_metric_logger( |
959 const AutofillMetrics* metric_logger) { | 963 const AutofillMetrics* metric_logger) { |
960 metric_logger_.reset(metric_logger); | 964 metric_logger_.reset(metric_logger); |
961 } | 965 } |
962 | 966 |
963 void PersonalDataManager::set_browser_context( | 967 void PersonalDataManager::set_browser_context( |
964 content::BrowserContext* context) { | 968 content::BrowserContext* context) { |
965 browser_context_ = context; | 969 browser_context_ = context; |
966 } | 970 } |
OLD | NEW |