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