Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" | 5 #include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "apps/shell_window.h" | 11 #include "apps/shell_window.h" |
| 12 #include "apps/shell_window_registry.h" | 12 #include "apps/shell_window_registry.h" |
| 13 #include "apps/ui/native_app_window.h" | 13 #include "apps/ui/native_app_window.h" |
| 14 #include "base/base64.h" | 14 #include "base/base64.h" |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/i18n/case_conversion.h" | 16 #include "base/i18n/case_conversion.h" |
| 17 #include "base/i18n/rtl.h" | 17 #include "base/i18n/rtl.h" |
| 18 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/prefs/pref_registry_simple.h" | 19 #include "base/prefs/pref_registry_simple.h" |
| 20 #include "base/prefs/pref_service.h" | 20 #include "base/prefs/pref_service.h" |
| 21 #include "base/prefs/scoped_user_pref_update.h" | 21 #include "base/prefs/scoped_user_pref_update.h" |
| 22 #include "base/rand_util.h" | 22 #include "base/rand_util.h" |
| 23 #include "base/strings/string_number_conversions.h" | 23 #include "base/strings/string_number_conversions.h" |
| 24 #include "base/strings/string_split.h" | 24 #include "base/strings/string_split.h" |
| 25 #include "base/strings/string_util.h" | 25 #include "base/strings/string_util.h" |
| 26 #include "base/strings/utf_string_conversions.h" | 26 #include "base/strings/utf_string_conversions.h" |
| 27 #include "base/time/time.h" | 27 #include "base/time/time.h" |
| 28 #include "chrome/browser/autofill/address_storage_factory.h" | |
| 28 #include "chrome/browser/autofill/personal_data_manager_factory.h" | 29 #include "chrome/browser/autofill/personal_data_manager_factory.h" |
| 29 #include "chrome/browser/browser_process.h" | 30 #include "chrome/browser/browser_process.h" |
| 30 #include "chrome/browser/profiles/profile.h" | 31 #include "chrome/browser/profiles/profile.h" |
| 31 #include "chrome/browser/ui/autofill/autofill_dialog_common.h" | 32 #include "chrome/browser/ui/autofill/autofill_dialog_common.h" |
| 32 #include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h" | 33 #include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h" |
| 33 #include "chrome/browser/ui/autofill/autofill_dialog_view.h" | 34 #include "chrome/browser/ui/autofill/autofill_dialog_view.h" |
| 34 #include "chrome/browser/ui/autofill/data_model_wrapper.h" | 35 #include "chrome/browser/ui/autofill/data_model_wrapper.h" |
| 35 #include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" | 36 #include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" |
| 36 #include "chrome/browser/ui/autofill/new_credit_card_bubble_controller.h" | 37 #include "chrome/browser/ui/autofill/new_credit_card_bubble_controller.h" |
| 37 #include "chrome/browser/ui/browser.h" | 38 #include "chrome/browser/ui/browser.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 #include "content/public/browser/web_contents.h" | 73 #include "content/public/browser/web_contents.h" |
| 73 #include "content/public/browser/web_contents_view.h" | 74 #include "content/public/browser/web_contents_view.h" |
| 74 #include "content/public/common/url_constants.h" | 75 #include "content/public/common/url_constants.h" |
| 75 #include "grit/chromium_strings.h" | 76 #include "grit/chromium_strings.h" |
| 76 #include "grit/component_strings.h" | 77 #include "grit/component_strings.h" |
| 77 #include "grit/generated_resources.h" | 78 #include "grit/generated_resources.h" |
| 78 #include "grit/platform_locale_settings.h" | 79 #include "grit/platform_locale_settings.h" |
| 79 #include "grit/theme_resources.h" | 80 #include "grit/theme_resources.h" |
| 80 #include "grit/webkit_resources.h" | 81 #include "grit/webkit_resources.h" |
| 81 #include "net/cert/cert_status_flags.h" | 82 #include "net/cert/cert_status_flags.h" |
| 83 #include "third_party/libaddressinput/chromium/chrome_downloader_impl.h" | |
| 84 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" | |
| 85 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/addre ss_data.h" | |
| 86 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/addre ss_problem.h" | |
| 82 #include "ui/base/base_window.h" | 87 #include "ui/base/base_window.h" |
| 83 #include "ui/base/l10n/l10n_util.h" | 88 #include "ui/base/l10n/l10n_util.h" |
| 84 #include "ui/base/models/combobox_model.h" | 89 #include "ui/base/models/combobox_model.h" |
| 85 #include "ui/base/resource/resource_bundle.h" | 90 #include "ui/base/resource/resource_bundle.h" |
| 86 #include "ui/events/event.h" | 91 #include "ui/events/event.h" |
| 87 #include "ui/gfx/canvas.h" | 92 #include "ui/gfx/canvas.h" |
| 88 #include "ui/gfx/image/image_skia_operations.h" | 93 #include "ui/gfx/image/image_skia_operations.h" |
| 89 #include "ui/gfx/skia_util.h" | 94 #include "ui/gfx/skia_util.h" |
| 90 | 95 |
| 96 using ::i18n::addressinput::AddressData; | |
| 97 using ::i18n::addressinput::AddressProblem; | |
| 98 using ::i18n::addressinput::AddressProblemFilter; | |
| 99 using ::i18n::addressinput::AddressProblems; | |
| 100 using ::i18n::addressinput::AddressValidator; | |
| 101 | |
| 91 namespace autofill { | 102 namespace autofill { |
| 92 | 103 |
| 93 namespace { | 104 namespace { |
| 94 | 105 |
| 95 const char kAddNewItemKey[] = "add-new-item"; | 106 const char kAddNewItemKey[] = "add-new-item"; |
| 96 const char kManageItemsKey[] = "manage-items"; | 107 const char kManageItemsKey[] = "manage-items"; |
| 97 const char kSameAsBillingKey[] = "same-as-billing"; | 108 const char kSameAsBillingKey[] = "same-as-billing"; |
| 98 | 109 |
| 99 // URLs for Wallet error messages. | 110 // URLs for Wallet error messages. |
| 100 const char kBuyerLegalAddressStatusUrl[] = | 111 const char kBuyerLegalAddressStatusUrl[] = |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 473 } | 484 } |
| 474 | 485 |
| 475 gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) { | 486 gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) { |
| 476 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 487 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 477 if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) | 488 if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) |
| 478 return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX); | 489 return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX); |
| 479 | 490 |
| 480 return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); | 491 return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); |
| 481 } | 492 } |
| 482 | 493 |
| 483 ServerFieldType CountryTypeForSection(DialogSection section) { | 494 ServerFieldType TypeForSection(DialogSection section, ServerFieldType type) { |
| 484 return section == SECTION_SHIPPING ? ADDRESS_HOME_COUNTRY : | 495 return section == SECTION_SHIPPING ? |
| 485 ADDRESS_BILLING_COUNTRY; | 496 AutofillType(type).GetStorableType() : |
| 497 AutofillType::GetEquivalentBillingFieldType(type); | |
| 486 } | 498 } |
| 487 | 499 |
| 488 } // namespace | 500 } // namespace |
| 489 | 501 |
| 490 AutofillDialogViewDelegate::~AutofillDialogViewDelegate() {} | 502 AutofillDialogViewDelegate::~AutofillDialogViewDelegate() {} |
| 491 | 503 |
| 492 AutofillDialogControllerImpl::~AutofillDialogControllerImpl() { | 504 AutofillDialogControllerImpl::~AutofillDialogControllerImpl() { |
| 493 if (popup_controller_) | 505 if (popup_controller_) |
| 494 popup_controller_->Hide(); | 506 popup_controller_->Hide(); |
| 495 | 507 |
| (...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1100 // If the chosen item in |model| yields an empty suggestion text, it is | 1112 // If the chosen item in |model| yields an empty suggestion text, it is |
| 1101 // invalid. In this case, show the edit UI and highlight invalid fields. | 1113 // invalid. In this case, show the edit UI and highlight invalid fields. |
| 1102 SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); | 1114 SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); |
| 1103 base::string16 unused, unused2; | 1115 base::string16 unused, unused2; |
| 1104 if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) && | 1116 if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) && |
| 1105 !SuggestionTextForSection(section, &unused, &unused2)) { | 1117 !SuggestionTextForSection(section, &unused, &unused2)) { |
| 1106 SetEditingExistingData(section, true); | 1118 SetEditingExistingData(section, true); |
| 1107 } | 1119 } |
| 1108 | 1120 |
| 1109 if (wrapper && IsEditingExistingData(section)) { | 1121 if (wrapper && IsEditingExistingData(section)) { |
| 1110 base::string16 country = | 1122 base::string16 country = wrapper->GetInfo(AutofillType( |
| 1111 wrapper->GetInfo(AutofillType(CountryTypeForSection(section))); | 1123 TypeForSection(section, ADDRESS_HOME_COUNTRY))); |
| 1112 if (!country.empty()) { | 1124 if (!country.empty()) { |
| 1113 // There's no user input to restore here as this is only called after | 1125 // There's no user input to restore here as this is only called after |
| 1114 // resetting all section input. | 1126 // resetting all section input. |
| 1115 if (RebuildInputsForCountry(section, country, false)) | 1127 if (RebuildInputsForCountry(section, country, false)) |
| 1116 UpdateSection(section); | 1128 UpdateSection(section); |
| 1117 } | 1129 } |
| 1118 wrapper->FillInputs(MutableRequestedFieldsForSection(section)); | 1130 wrapper->FillInputs(MutableRequestedFieldsForSection(section)); |
| 1119 } | 1131 } |
| 1120 } | 1132 } |
| 1121 | 1133 |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1693 case ADDRESS_HOME_LINE2: | 1705 case ADDRESS_HOME_LINE2: |
| 1694 case ADDRESS_HOME_DEPENDENT_LOCALITY: | 1706 case ADDRESS_HOME_DEPENDENT_LOCALITY: |
| 1695 case ADDRESS_HOME_SORTING_CODE: | 1707 case ADDRESS_HOME_SORTING_CODE: |
| 1696 return base::string16(); // Optional until we have better validation. | 1708 return base::string16(); // Optional until we have better validation. |
| 1697 | 1709 |
| 1698 case ADDRESS_HOME_CITY: | 1710 case ADDRESS_HOME_CITY: |
| 1699 case ADDRESS_HOME_COUNTRY: | 1711 case ADDRESS_HOME_COUNTRY: |
| 1700 break; | 1712 break; |
| 1701 | 1713 |
| 1702 case ADDRESS_HOME_STATE: | 1714 case ADDRESS_HOME_STATE: |
| 1703 if (!value.empty() && !autofill::IsValidState(value) && | 1715 if (!i18ninput::Enabled() && !value.empty() && |
| 1716 !autofill::IsValidState(value) && | |
| 1704 CountryCodeForSection(section) == "US") { | 1717 CountryCodeForSection(section) == "US") { |
| 1705 return l10n_util::GetStringUTF16( | 1718 return l10n_util::GetStringUTF16( |
| 1706 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_REGION); | 1719 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_REGION); |
| 1707 } | 1720 } |
| 1708 break; | 1721 break; |
| 1709 | 1722 |
| 1710 case ADDRESS_HOME_ZIP: | 1723 case ADDRESS_HOME_ZIP: |
| 1711 if (!value.empty() && !autofill::IsValidZip(value) && | 1724 if (!i18ninput::Enabled() && !value.empty() && |
|
Evan Stade
2014/01/28 19:23:12
I feel like all the address stuff should be remove
Dan Beam
2014/01/30 04:51:36
why not just remove when we axe the flag?
Evan Stade
2014/01/30 04:58:20
because then the behavior will be wrong until we a
Dan Beam
2014/01/30 06:28:58
Done.
| |
| 1725 !autofill::IsValidZip(value) && | |
| 1712 CountryCodeForSection(section) == "US") { | 1726 CountryCodeForSection(section) == "US") { |
| 1713 return l10n_util::GetStringUTF16( | 1727 return l10n_util::GetStringUTF16( |
| 1714 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_ZIP_CODE); | 1728 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_ZIP_CODE); |
| 1715 } | 1729 } |
| 1716 break; | 1730 break; |
| 1717 | 1731 |
| 1718 case NAME_FULL: | 1732 case NAME_FULL: |
| 1719 // Wallet requires a first and last billing name. | 1733 // Wallet requires a first and last billing name. |
| 1720 if (section == SECTION_CC_BILLING && !value.empty() && | 1734 if (section == SECTION_CC_BILLING && !value.empty() && |
| 1721 !IsCardHolderNameValidForWallet(value)) { | 1735 !IsCardHolderNameValidForWallet(value)) { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1740 l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE) : | 1754 l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE) : |
| 1741 base::string16(); | 1755 base::string16(); |
| 1742 } | 1756 } |
| 1743 | 1757 |
| 1744 // TODO(groby): Also add tests. | 1758 // TODO(groby): Also add tests. |
| 1745 ValidityMessages AutofillDialogControllerImpl::InputsAreValid( | 1759 ValidityMessages AutofillDialogControllerImpl::InputsAreValid( |
| 1746 DialogSection section, | 1760 DialogSection section, |
| 1747 const FieldValueMap& inputs) { | 1761 const FieldValueMap& inputs) { |
| 1748 ValidityMessages messages; | 1762 ValidityMessages messages; |
| 1749 FieldValueMap field_values; | 1763 FieldValueMap field_values; |
| 1764 | |
| 1765 if (section != SECTION_CC) { | |
| 1766 FieldValueMap values = inputs; | |
|
Evan Stade
2014/01/28 19:23:12
why do you need to make this copy?
Dan Beam
2014/01/30 04:51:36
was to create empty base::string16() by non-const
| |
| 1767 | |
| 1768 AddressData address_data; | |
| 1769 address_data.language_code = g_browser_process->GetApplicationLocale(); | |
| 1770 address_data.country_code = AutofillCountry::GetCountryCode( | |
| 1771 values[TypeForSection(section, ADDRESS_HOME_COUNTRY)], | |
| 1772 g_browser_process->GetApplicationLocale()); | |
| 1773 address_data.administrative_area = UTF16ToUTF8( | |
|
Evan Stade
2014/01/28 19:23:12
DataModelWrapper already has code that creates an
Dan Beam
2014/01/30 04:51:36
Done.
| |
| 1774 values[TypeForSection(section, ADDRESS_HOME_STATE)]); | |
| 1775 address_data.locality = UTF16ToUTF8( | |
| 1776 values[TypeForSection(section, ADDRESS_HOME_CITY)]); | |
| 1777 address_data.dependent_locality = UTF16ToUTF8( | |
| 1778 values[TypeForSection(section, ADDRESS_HOME_DEPENDENT_LOCALITY)]); | |
| 1779 address_data.sorting_code = UTF16ToUTF8( | |
| 1780 values[TypeForSection(section, ADDRESS_HOME_SORTING_CODE)]); | |
| 1781 address_data.postal_code = UTF16ToUTF8( | |
| 1782 values[TypeForSection(section, ADDRESS_HOME_ZIP)]); | |
| 1783 address_data.recipient = UTF16ToUTF8( | |
| 1784 values[TypeForSection(section, NAME_FULL)]); | |
| 1785 | |
| 1786 base::string16 street_line1 = | |
| 1787 values[TypeForSection(section, ADDRESS_HOME_LINE1)]; | |
| 1788 if (!street_line1.empty()) | |
| 1789 address_data.address_lines.push_back(UTF16ToUTF8(street_line1)); | |
| 1790 | |
| 1791 base::string16 street_line2 = | |
| 1792 values[TypeForSection(section, ADDRESS_HOME_LINE2)]; | |
| 1793 if (!street_line2.empty()) | |
| 1794 address_data.address_lines.push_back(UTF16ToUTF8(street_line2)); | |
| 1795 | |
| 1796 AddressProblems problems; | |
| 1797 AddressValidator::Status status = validator_->ValidateAddress( | |
| 1798 address_data, AddressProblemFilter(), &problems); | |
| 1799 if (status == AddressValidator::SUCCESS) { | |
| 1800 common::AddressType address_type = section == SECTION_SHIPPING ? | |
| 1801 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; | |
| 1802 for (size_t i = 0; i < problems.size(); ++i) { | |
| 1803 const AddressProblem& problem = problems[i]; | |
| 1804 bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD; | |
| 1805 base::string16 text = l10n_util::GetStringUTF16(problem.description_id); | |
| 1806 messages.Set(i18ninput::TypeForField(problem.field, address_type), | |
| 1807 ValidityMessage(text, sure)); | |
| 1808 } | |
| 1809 } | |
| 1810 } | |
| 1811 | |
| 1750 for (FieldValueMap::const_iterator iter = inputs.begin(); | 1812 for (FieldValueMap::const_iterator iter = inputs.begin(); |
| 1751 iter != inputs.end(); ++iter) { | 1813 iter != inputs.end(); ++iter) { |
| 1752 const ServerFieldType type = iter->first; | 1814 const ServerFieldType type = iter->first; |
| 1815 if (messages.HasSureError(type)) | |
| 1816 continue; | |
| 1753 | 1817 |
| 1754 base::string16 text = InputValidityMessage(section, type, iter->second); | 1818 base::string16 text = InputValidityMessage(section, type, iter->second); |
| 1755 | 1819 |
| 1756 // Skip empty/unchanged fields in edit mode. Ignore country as it always has | 1820 // Skip empty/unchanged fields in edit mode. Ignore country as it always has |
| 1757 // a value. If the individual field does not have validation errors, assume | 1821 // a value. If the individual field does not have validation errors, assume |
| 1758 // it to be valid unless later proven otherwise. | 1822 // it to be valid unless later proven otherwise. |
| 1759 bool sure = InputWasEdited(type, iter->second) || | 1823 bool sure = InputWasEdited(type, iter->second) || |
| 1760 AutofillType(type).GetStorableType() == ADDRESS_HOME_COUNTRY; | 1824 AutofillType(type).GetStorableType() == ADDRESS_HOME_COUNTRY; |
| 1761 | 1825 |
| 1762 // Consider only individually valid fields for inter-field validation. | 1826 // Consider only individually valid fields for inter-field validation. |
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2573 handling_use_wallet_link_click_(false), | 2637 handling_use_wallet_link_click_(false), |
| 2574 passive_failed_(false), | 2638 passive_failed_(false), |
| 2575 billing_country_combobox_model_(*GetManager()), | 2639 billing_country_combobox_model_(*GetManager()), |
| 2576 shipping_country_combobox_model_(*GetManager()), | 2640 shipping_country_combobox_model_(*GetManager()), |
| 2577 suggested_cc_(this), | 2641 suggested_cc_(this), |
| 2578 suggested_billing_(this), | 2642 suggested_billing_(this), |
| 2579 suggested_cc_billing_(this), | 2643 suggested_cc_billing_(this), |
| 2580 suggested_shipping_(this), | 2644 suggested_shipping_(this), |
| 2581 cares_about_shipping_(true), | 2645 cares_about_shipping_(true), |
| 2582 popup_input_type_(UNKNOWN_TYPE), | 2646 popup_input_type_(UNKNOWN_TYPE), |
| 2583 weak_ptr_factory_(this), | |
| 2584 waiting_for_explicit_sign_in_response_(false), | 2647 waiting_for_explicit_sign_in_response_(false), |
| 2585 has_accepted_legal_documents_(false), | 2648 has_accepted_legal_documents_(false), |
| 2586 is_submitting_(false), | 2649 is_submitting_(false), |
| 2587 choose_another_instrument_or_address_(false), | 2650 choose_another_instrument_or_address_(false), |
| 2588 wallet_server_validation_recoverable_(true), | 2651 wallet_server_validation_recoverable_(true), |
| 2589 data_was_passed_back_(false), | 2652 data_was_passed_back_(false), |
| 2590 was_ui_latency_logged_(false), | 2653 was_ui_latency_logged_(false), |
| 2591 card_generated_animation_(2000, 60, this) { | 2654 card_generated_animation_(2000, 60, this), |
| 2655 weak_ptr_factory_(this) { | |
| 2592 // TODO(estade): remove duplicates from |form_structure|? | 2656 // TODO(estade): remove duplicates from |form_structure|? |
| 2593 DCHECK(!callback_.is_null()); | 2657 DCHECK(!callback_.is_null()); |
| 2658 | |
| 2659 scoped_ptr< ::i18n::addressinput::Downloader> downloader( | |
|
Evan Stade
2014/01/28 19:25:09
move this all to show
Dan Beam
2014/01/30 04:51:36
Done.
| |
| 2660 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())); | |
| 2661 validator_ = AddressValidator::Build( | |
| 2662 downloader.Pass(), AddressStorageFactory::CreateStorage(), this); | |
| 2663 validator_->LoadRules(GetManager()->GetDefaultCountryCodeForNewAddress()); | |
| 2594 } | 2664 } |
| 2595 | 2665 |
| 2596 AutofillDialogView* AutofillDialogControllerImpl::CreateView() { | 2666 AutofillDialogView* AutofillDialogControllerImpl::CreateView() { |
| 2597 return AutofillDialogView::Create(this); | 2667 return AutofillDialogView::Create(this); |
| 2598 } | 2668 } |
| 2599 | 2669 |
| 2600 PersonalDataManager* AutofillDialogControllerImpl::GetManager() const { | 2670 PersonalDataManager* AutofillDialogControllerImpl::GetManager() const { |
| 2601 return PersonalDataManagerFactory::GetForProfile(profile_); | 2671 return PersonalDataManagerFactory::GetForProfile(profile_); |
| 2602 } | 2672 } |
| 2603 | 2673 |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3068 DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( | 3138 DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( |
| 3069 DialogSection section) { | 3139 DialogSection section) { |
| 3070 return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); | 3140 return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); |
| 3071 } | 3141 } |
| 3072 | 3142 |
| 3073 std::string AutofillDialogControllerImpl::CountryCodeForSection( | 3143 std::string AutofillDialogControllerImpl::CountryCodeForSection( |
| 3074 DialogSection section) { | 3144 DialogSection section) { |
| 3075 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); | 3145 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); |
| 3076 if (wrapper) { | 3146 if (wrapper) { |
| 3077 return AutofillCountry::GetCountryCode( | 3147 return AutofillCountry::GetCountryCode( |
| 3078 wrapper->GetInfo(AutofillType(CountryTypeForSection(section))), | 3148 wrapper->GetInfo( |
| 3149 AutofillType(TypeForSection(section, ADDRESS_HOME_COUNTRY))), | |
| 3079 g_browser_process->GetApplicationLocale()); | 3150 g_browser_process->GetApplicationLocale()); |
| 3080 } | 3151 } |
| 3081 | 3152 |
| 3082 CountryComboboxModel* model = CountryComboboxModelForSection(section); | 3153 CountryComboboxModel* model = CountryComboboxModelForSection(section); |
| 3083 return model ? model->GetDefaultCountryCode() : std::string(); | 3154 return model ? model->GetDefaultCountryCode() : std::string(); |
| 3084 } | 3155 } |
| 3085 | 3156 |
| 3086 bool AutofillDialogControllerImpl::RebuildInputsForCountry( | 3157 bool AutofillDialogControllerImpl::RebuildInputsForCountry( |
| 3087 DialogSection section, | 3158 DialogSection section, |
| 3088 const base::string16& country_name, | 3159 const base::string16& country_name, |
| 3089 bool should_clobber) { | 3160 bool should_clobber) { |
| 3090 DCHECK_NE(SECTION_CC, section); | 3161 DCHECK_NE(SECTION_CC, section); |
| 3091 | 3162 |
| 3092 if (view_ && !should_clobber) { | 3163 if (view_ && !should_clobber) { |
| 3093 FieldValueMap outputs; | 3164 FieldValueMap outputs; |
| 3094 view_->GetUserInput(section, &outputs); | 3165 view_->GetUserInput(section, &outputs); |
| 3095 | 3166 |
| 3096 // If |country_name| is the same as the view, no-op and let the caller know. | 3167 // If |country_name| is the same as the view, no-op and let the caller know. |
| 3097 if (outputs[CountryTypeForSection(section)] == country_name) | 3168 if (outputs[TypeForSection(section, ADDRESS_HOME_COUNTRY)] == country_name) |
| 3098 return false; | 3169 return false; |
| 3099 } | 3170 } |
| 3100 | 3171 |
| 3101 DetailInputs* inputs = MutableRequestedFieldsForSection(section); | 3172 DetailInputs* inputs = MutableRequestedFieldsForSection(section); |
| 3102 inputs->clear(); | 3173 inputs->clear(); |
| 3103 | 3174 |
| 3104 std::string country_code = AutofillCountry::GetCountryCode( | 3175 std::string country_code = AutofillCountry::GetCountryCode( |
| 3105 country_name, g_browser_process->GetApplicationLocale()); | 3176 country_name, g_browser_process->GetApplicationLocale()); |
| 3106 common::BuildInputsForSection(section, country_code, inputs); | 3177 common::BuildInputsForSection(section, country_code, inputs); |
| 3107 return true; | 3178 return true; |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3390 DCHECK_EQ(animation, &card_generated_animation_); | 3461 DCHECK_EQ(animation, &card_generated_animation_); |
| 3391 PushOverlayUpdate(); | 3462 PushOverlayUpdate(); |
| 3392 } | 3463 } |
| 3393 | 3464 |
| 3394 void AutofillDialogControllerImpl::AnimationEnded( | 3465 void AutofillDialogControllerImpl::AnimationEnded( |
| 3395 const gfx::Animation* animation) { | 3466 const gfx::Animation* animation) { |
| 3396 DCHECK_EQ(animation, &card_generated_animation_); | 3467 DCHECK_EQ(animation, &card_generated_animation_); |
| 3397 DoFinishSubmit(); | 3468 DoFinishSubmit(); |
| 3398 } | 3469 } |
| 3399 | 3470 |
| 3471 void AutofillDialogControllerImpl::OnAddressValidationRulesLoaded( | |
| 3472 const std::string& country_code, | |
| 3473 bool success) { | |
| 3474 // TODO(dbeam): ask |view_| to re-validate its contents if necessary. | |
| 3475 } | |
| 3476 | |
| 3400 void AutofillDialogControllerImpl::DoFinishSubmit() { | 3477 void AutofillDialogControllerImpl::DoFinishSubmit() { |
| 3401 FillOutputForSection(SECTION_CC); | 3478 FillOutputForSection(SECTION_CC); |
| 3402 FillOutputForSection(SECTION_BILLING); | 3479 FillOutputForSection(SECTION_BILLING); |
| 3403 FillOutputForSection(SECTION_CC_BILLING); | 3480 FillOutputForSection(SECTION_CC_BILLING); |
| 3404 | 3481 |
| 3405 if (ShouldUseBillingForShipping()) { | 3482 if (ShouldUseBillingForShipping()) { |
| 3406 FillOutputForSectionWithComparator( | 3483 FillOutputForSectionWithComparator( |
| 3407 SECTION_BILLING, | 3484 SECTION_BILLING, |
| 3408 base::Bind(ServerTypeMatchesShippingField)); | 3485 base::Bind(ServerTypeMatchesShippingField)); |
| 3409 FillOutputForSectionWithComparator( | 3486 FillOutputForSectionWithComparator( |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3647 view_->UpdateButtonStrip(); | 3724 view_->UpdateButtonStrip(); |
| 3648 } | 3725 } |
| 3649 | 3726 |
| 3650 void AutofillDialogControllerImpl::FetchWalletCookie() { | 3727 void AutofillDialogControllerImpl::FetchWalletCookie() { |
| 3651 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); | 3728 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); |
| 3652 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); | 3729 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); |
| 3653 signin_helper_->StartWalletCookieValueFetch(); | 3730 signin_helper_->StartWalletCookieValueFetch(); |
| 3654 } | 3731 } |
| 3655 | 3732 |
| 3656 } // namespace autofill | 3733 } // namespace autofill |
| OLD | NEW |