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

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

Issue 2855943002: Offer to save card locally if user manually enters same card number as (Closed)
Patch Set: Creates separate tests for duplicating masked server card and not duplicating full server card. Created 3 years, 7 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/personal_data_manager.h" 5 #include "components/autofill/core/browser/personal_data_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 } 435 }
436 436
437 void PersonalDataManager::RemoveObserver( 437 void PersonalDataManager::RemoveObserver(
438 PersonalDataManagerObserver* observer) { 438 PersonalDataManagerObserver* observer) {
439 observers_.RemoveObserver(observer); 439 observers_.RemoveObserver(observer);
440 } 440 }
441 441
442 bool PersonalDataManager::ImportFormData( 442 bool PersonalDataManager::ImportFormData(
443 const FormStructure& form, 443 const FormStructure& form,
444 bool should_return_local_card, 444 bool should_return_local_card,
445 std::unique_ptr<CreditCard>* imported_credit_card) { 445 std::unique_ptr<CreditCard>* imported_credit_card,
446 bool* imported_credit_card_matches_masked_server_credit_card) {
446 // We try the same |form| for both credit card and address import/update. 447 // We try the same |form| for both credit card and address import/update.
447 // - ImportCreditCard may update an existing card, or fill 448 // - ImportCreditCard may update an existing card, or fill
448 // |imported_credit_card| with an extracted card. See .h for details of 449 // |imported_credit_card| with an extracted card. See .h for details of
449 // |should_return_local_card|. 450 // |should_return_local_card| and
451 // |imported_credit_card_matches_masked_server_credit_card|.
450 bool cc_import = 452 bool cc_import =
451 ImportCreditCard(form, should_return_local_card, imported_credit_card); 453 ImportCreditCard(form, should_return_local_card, imported_credit_card,
454 imported_credit_card_matches_masked_server_credit_card);
452 // - ImportAddressProfiles may eventually save or update one or more address 455 // - ImportAddressProfiles may eventually save or update one or more address
453 // profiles. 456 // profiles.
454 bool address_import = ImportAddressProfiles(form); 457 bool address_import = ImportAddressProfiles(form);
455 if (cc_import || address_import) 458 if (cc_import || address_import)
456 return true; 459 return true;
457 460
458 for (PersonalDataManagerObserver& observer : observers_) 461 for (PersonalDataManagerObserver& observer : observers_)
459 observer.OnInsufficientFormData(); 462 observer.OnInsufficientFormData();
460 return false; 463 return false;
461 } 464 }
(...skipping 1028 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 if (!IsValidLearnableProfile(candidate_profile, app_locale_)) 1493 if (!IsValidLearnableProfile(candidate_profile, app_locale_))
1491 return false; 1494 return false;
1492 1495
1493 SaveImportedProfile(candidate_profile); 1496 SaveImportedProfile(candidate_profile);
1494 return true; 1497 return true;
1495 } 1498 }
1496 1499
1497 bool PersonalDataManager::ImportCreditCard( 1500 bool PersonalDataManager::ImportCreditCard(
1498 const FormStructure& form, 1501 const FormStructure& form,
1499 bool should_return_local_card, 1502 bool should_return_local_card,
1500 std::unique_ptr<CreditCard>* imported_credit_card) { 1503 std::unique_ptr<CreditCard>* imported_credit_card,
1504 bool* imported_credit_card_matches_masked_server_credit_card) {
1501 DCHECK(!imported_credit_card->get()); 1505 DCHECK(!imported_credit_card->get());
1506 *imported_credit_card_matches_masked_server_credit_card = false;
1502 1507
1503 // The candidate for credit card import. There are many ways for the candidate 1508 // The candidate for credit card import. There are many ways for the candidate
1504 // to be rejected (see everywhere this function returns false, below). 1509 // to be rejected (see everywhere this function returns false, below).
1505 CreditCard candidate_credit_card; 1510 CreditCard candidate_credit_card;
1506 candidate_credit_card.set_origin(form.source_url().spec()); 1511 candidate_credit_card.set_origin(form.source_url().spec());
1507 1512
1508 std::set<ServerFieldType> types_seen; 1513 std::set<ServerFieldType> types_seen;
1509 for (const auto& field : form) { 1514 for (const auto& field : form) {
1510 base::string16 value; 1515 base::string16 value;
1511 base::TrimWhitespace(field->value, base::TRIM_ALL, &value); 1516 base::TrimWhitespace(field->value, base::TRIM_ALL, &value);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1554 1559
1555 // Reject the credit card if we did not detect enough filled credit card 1560 // Reject the credit card if we did not detect enough filled credit card
1556 // fields (such as valid number, month, year). 1561 // fields (such as valid number, month, year).
1557 if (!candidate_credit_card.IsValid()) 1562 if (!candidate_credit_card.IsValid())
1558 return false; 1563 return false;
1559 1564
1560 // Attempt to merge with an existing credit card. Don't present a prompt if we 1565 // Attempt to merge with an existing credit card. Don't present a prompt if we
1561 // have already saved this card number, unless |should_return_local_card| is 1566 // have already saved this card number, unless |should_return_local_card| is
1562 // true which indicates that upload is enabled. In this case, it's useful to 1567 // true which indicates that upload is enabled. In this case, it's useful to
1563 // present the upload prompt to the user to promote the card from a local card 1568 // present the upload prompt to the user to promote the card from a local card
1564 // to a synced server card. 1569 // to a synced server card, provided we don't have a masked server card with
1570 // the same |TypeAndLastFourDigits|.
1565 for (const auto& card : local_credit_cards_) { 1571 for (const auto& card : local_credit_cards_) {
1566 // Make a local copy so that the data in |local_credit_cards_| isn't 1572 // Make a local copy so that the data in |local_credit_cards_| isn't
1567 // modified directly by the UpdateFromImportedCard() call. 1573 // modified directly by the UpdateFromImportedCard() call.
1568 CreditCard card_copy(*card); 1574 CreditCard card_copy(*card);
1569 if (card_copy.UpdateFromImportedCard(candidate_credit_card, 1575 if (card_copy.UpdateFromImportedCard(candidate_credit_card,
1570 app_locale_)) { 1576 app_locale_)) {
1571 UpdateCreditCard(card_copy); 1577 UpdateCreditCard(card_copy);
1572 // If we should not return the local card, return that we merged it, 1578 // If we should not return the local card, return that we merged it,
1573 // without setting |imported_credit_card|. 1579 // without setting |imported_credit_card|.
1574 if (!should_return_local_card) 1580 if (!should_return_local_card)
1575 return true; 1581 return true;
1576 1582
1577 break; 1583 break;
1578 } 1584 }
1579 } 1585 }
1580 1586
1581 // Also don't offer to save if we already have this stored as a server card. 1587 // Also don't offer to save if we already have this stored as a full server
1582 // We only check the number because if the new card has the same number as the 1588 // card. We only check the number because if the new card has the same number
1583 // server card, upload is guaranteed to fail. There's no mechanism for entries 1589 // as the server card, upload is guaranteed to fail. There's no mechanism for
1584 // with the same number but different names or expiration dates as there is 1590 // entries with the same number but different names or expiration dates as
1585 // for local cards. 1591 // there is for local cards.
1592 // We can offer to save locally even if we already have this stored another
1593 // masked server card with the same |TypeAndLastFourDigits| so that the user
1594 // can enter the full card number without having to unmask the card.
1586 for (const auto& card : server_credit_cards_) { 1595 for (const auto& card : server_credit_cards_) {
1587 if (candidate_credit_card.HasSameNumberAs(*card)) 1596 if (candidate_credit_card.HasSameNumberAs(*card)) {
1588 return false; 1597 if (card->record_type() == CreditCard::FULL_SERVER_CARD)
1598 return false;
1599 DCHECK_EQ(card->record_type(), CreditCard::MASKED_SERVER_CARD);
1600 *imported_credit_card_matches_masked_server_credit_card = true;
1601 break;
1602 }
1589 } 1603 }
1590 1604
1591 imported_credit_card->reset(new CreditCard(candidate_credit_card)); 1605 imported_credit_card->reset(new CreditCard(candidate_credit_card));
1592 return true; 1606 return true;
1593 } 1607 }
1594 1608
1595 const std::vector<AutofillProfile*>& PersonalDataManager::GetProfiles( 1609 const std::vector<AutofillProfile*>& PersonalDataManager::GetProfiles(
1596 bool record_metrics) const { 1610 bool record_metrics) const {
1597 profiles_.clear(); 1611 profiles_.clear();
1598 for (const auto& profile : web_profiles_) 1612 for (const auto& profile : web_profiles_)
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
2037 existing_profiles->back().SetRawInfo(EMAIL_ADDRESS, email); 2051 existing_profiles->back().SetRawInfo(EMAIL_ADDRESS, email);
2038 2052
2039 AutofillMetrics::LogWalletAddressConversionType( 2053 AutofillMetrics::LogWalletAddressConversionType(
2040 AutofillMetrics::CONVERTED_ADDRESS_ADDED); 2054 AutofillMetrics::CONVERTED_ADDRESS_ADDED);
2041 } 2055 }
2042 2056
2043 return guid; 2057 return guid;
2044 } 2058 }
2045 2059
2046 } // namespace autofill 2060 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698