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

Unified Diff: chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc

Issue 2883333003: Payment request shipping address editor now properly handles countries (Closed)
Patch Set: Rebase 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
index 94732c0d02ea5cdebfef4dd08cdf11d99f8a05a3..711d7a1885a20692ae70abc619107545d3b16359 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
@@ -4,8 +4,6 @@
#include "chrome/browser/ui/views/payments/shipping_address_editor_view_controller.h"
-#include <utility>
-
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
@@ -79,6 +77,40 @@ ShippingAddressEditorViewController::ShippingAddressEditorViewController(
profile_to_edit_(profile),
chosen_country_index_(0),
failed_to_load_region_data_(false) {
+ autofill::CountryComboboxModel model;
Mathieu 2017/05/16 20:10:06 I would put lines 80-112 inside a private function
MAD 2017/05/17 12:38:11 Done.
+ model.SetCountries(*state->GetPersonalDataManager(),
+ base::Callback<bool(const std::string&)>(),
+ state->GetApplicationLocale());
+ for (size_t i = 0; i < model.countries().size(); ++i) {
+ autofill::AutofillCountry* country(model.countries()[i].get());
+ if (country) {
+ countries_.push_back(
+ std::make_pair(country->country_code(), country->name()));
+ } else {
+ // Separator.
+ countries_.push_back(std::make_pair("", base::UTF8ToUTF16("")));
+ }
+ }
+ // If there is a profile to edit, make sure to use its country for the initial
+ // |chosen_country_index_|.
+ if (profile_to_edit_) {
+ autofill::AutofillType country_type(autofill::ADDRESS_HOME_COUNTRY);
+ base::string16 chosen_country(
+ profile_to_edit_->GetInfo(country_type, state->GetApplicationLocale()));
+ for (chosen_country_index_ = 0; chosen_country_index_ < countries_.size();
+ ++chosen_country_index_) {
+ if (chosen_country == countries_[chosen_country_index_].second)
+ break;
+ }
+ if (chosen_country_index_ >= countries_.size()) {
+ LOG(ERROR) << "Unexpected country: " << chosen_country;
+ CHECK_GT(countries_.size(), 0);
Mathieu 2017/05/16 20:10:06 could this ever happen in the wild? Crashing is pr
MAD 2017/05/17 12:38:10 It would crash below otherwise... But now that y
+ chosen_country_index_ = 0;
+ profile_to_edit_->SetInfo(country_type,
+ countries_[chosen_country_index_].second,
+ state->GetApplicationLocale());
+ }
+ }
UpdateEditorFields();
}
@@ -151,19 +183,12 @@ ShippingAddressEditorViewController::GetComboboxModelForType(
model->SetCountries(*state()->GetPersonalDataManager(),
base::Callback<bool(const std::string&)>(),
state()->GetApplicationLocale());
- country_codes_.clear();
- for (size_t i = 0; i < model->countries().size(); ++i) {
- if (model->countries()[i].get())
- country_codes_.push_back(model->countries()[i]->country_code());
- else
- country_codes_.push_back(""); // Separator.
- }
return std::move(model);
}
case autofill::ADDRESS_HOME_STATE: {
std::unique_ptr<autofill::RegionComboboxModel> model =
base::MakeUnique<autofill::RegionComboboxModel>();
- model->LoadRegionData(country_codes_[chosen_country_index_],
+ model->LoadRegionData(countries_[chosen_country_index_].first,
state()->GetRegionDataLoader(),
/*timeout_ms=*/5000);
if (!model->IsPendingRegionDataLoad()) {
@@ -171,7 +196,7 @@ ShippingAddressEditorViewController::GetComboboxModelForType(
// so we have to check for failure here.
failed_to_load_region_data_ = model->failed_to_load_data();
if (failed_to_load_region_data_) {
- // We can update the view synchronously while building the view.
+ // We can't update the view synchronously while building the view.
OnDataChanged(/*synchronous=*/false);
}
}
@@ -229,8 +254,8 @@ ShippingAddressEditorViewController::CreatePrimaryButton() {
void ShippingAddressEditorViewController::UpdateEditorFields() {
editor_fields_.clear();
std::string chosen_country_code;
- if (chosen_country_index_ < country_codes_.size())
- chosen_country_code = country_codes_[chosen_country_index_];
+ if (chosen_country_index_ < countries_.size())
+ chosen_country_code = countries_[chosen_country_index_].first;
std::unique_ptr<base::ListValue> components(new base::ListValue);
std::string unused;
@@ -323,6 +348,25 @@ bool ShippingAddressEditorViewController::SaveFieldsToProfile(
autofill::AutofillProfile* profile,
bool ignore_errors) {
const std::string& locale = state()->GetApplicationLocale();
+ // The country must be set first, because the profile uses the country to
+ // interpret some of the data (e.g., phone numbers) passed to SetInfo.
+ views::Combobox* combobox = static_cast<views::Combobox*>(
+ dialog()->GetViewByID(autofill::ADDRESS_HOME_COUNTRY));
+ // The combobox can be null when saving to temporary profile while updating
+ // the view.
+ if (combobox) {
+ base::string16 country(combobox->GetTextForRow(combobox->selected_index()));
+ bool success =
+ profile->SetInfo(autofill::AutofillType(autofill::ADDRESS_HOME_COUNTRY),
+ country, locale);
+ LOG_IF(ERROR, !success && !ignore_errors)
+ << "Can't set profile country to: " << country;
+ if (!success && !ignore_errors)
+ return false;
+ } else {
+ DCHECK_EQ(temporary_profile_.get(), profile);
+ }
+
bool success = true;
for (const auto& field : text_fields()) {
// Force a blur in case the value was left untouched.
@@ -342,19 +386,15 @@ bool ShippingAddressEditorViewController::SaveFieldsToProfile(
for (const auto& field : comboboxes()) {
// ValidatingCombobox* is the key, EditorField is the value.
ValidatingCombobox* combobox = field.first;
+ // The country has already been dealt with.
+ if (combobox->id() == autofill::ADDRESS_HOME_COUNTRY)
+ continue;
if (combobox->invalid()) {
success = false;
} else {
- if (combobox->id() == autofill::ADDRESS_HOME_COUNTRY) {
- success = profile->SetInfo(
- autofill::AutofillType(field.second.type),
- base::UTF8ToUTF16(country_codes_[combobox->selected_index()]),
- locale);
- } else {
- success = profile->SetInfo(
- autofill::AutofillType(field.second.type),
- combobox->GetTextForRow(combobox->selected_index()), locale);
- }
+ success = profile->SetInfo(
+ autofill::AutofillType(field.second.type),
+ combobox->GetTextForRow(combobox->selected_index()), locale);
}
LOG_IF(ERROR, !success && !ignore_errors)
<< "Can't setinfo(" << field.second.type << ", "
@@ -415,8 +455,8 @@ bool ShippingAddressEditorViewController::ShippingAddressValidationDelegate::
if (!value.empty()) {
if (field_.type == autofill::PHONE_HOME_WHOLE_NUMBER &&
!autofill::IsValidPhoneNumber(
- value,
- controller_->country_codes_[controller_->chosen_country_index_])) {
+ value, controller_->countries_[controller_->chosen_country_index_]
+ .first)) {
controller_->DisplayErrorMessageForField(
field_, l10n_util::GetStringUTF16(
IDS_PAYMENTS_PHONE_INVALID_VALIDATION_MESSAGE));

Powered by Google App Engine
This is Rietveld 408576698