| 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 |
| (...skipping 2107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2118 return; | 2118 return; |
| 2119 } | 2119 } |
| 2120 | 2120 |
| 2121 // If the user clicks while the popup is already showing, be sure to hide | 2121 // If the user clicks while the popup is already showing, be sure to hide |
| 2122 // it. | 2122 // it. |
| 2123 if (!was_edit && popup_controller_.get()) { | 2123 if (!was_edit && popup_controller_.get()) { |
| 2124 HidePopup(); | 2124 HidePopup(); |
| 2125 return; | 2125 return; |
| 2126 } | 2126 } |
| 2127 | 2127 |
| 2128 std::vector<base::string16> popup_values, popup_labels, popup_icons; | 2128 std::vector<autofill::Suggestion> popup_suggestions; |
| 2129 popup_suggestion_ids_.clear(); |
| 2129 if (common::IsCreditCardType(type)) { | 2130 if (common::IsCreditCardType(type)) { |
| 2130 GetManager()->GetCreditCardSuggestions(AutofillType(type), | 2131 popup_suggestions = GetManager()->GetCreditCardSuggestions( |
| 2131 field_contents, | 2132 AutofillType(type), field_contents); |
| 2132 &popup_values, | 2133 for (const auto& suggestion : popup_suggestions) |
| 2133 &popup_labels, | 2134 popup_suggestion_ids_.push_back(suggestion.backend_id); |
| 2134 &popup_icons, | |
| 2135 &popup_guids_); | |
| 2136 } else { | 2135 } else { |
| 2137 GetManager()->GetProfileSuggestions( | 2136 popup_suggestions = GetManager()->GetProfileSuggestions( |
| 2138 AutofillType(type), | 2137 AutofillType(type), |
| 2139 field_contents, | 2138 field_contents, |
| 2140 false, | 2139 false, |
| 2141 RequestedTypesForSection(section), | 2140 RequestedTypesForSection(section), |
| 2142 base::Bind(&AutofillDialogControllerImpl::ShouldSuggestProfile, | 2141 base::Bind(&AutofillDialogControllerImpl::ShouldSuggestProfile, |
| 2143 base::Unretained(this), section), | 2142 base::Unretained(this), section)); |
| 2144 &popup_values, | 2143 for (const auto& suggestion : popup_suggestions) |
| 2145 &popup_labels, | 2144 popup_suggestion_ids_.push_back(suggestion.backend_id); |
| 2146 &popup_icons, | |
| 2147 &popup_guids_); | |
| 2148 | 2145 |
| 2149 GetI18nValidatorSuggestions(section, type, &popup_values, &popup_labels, | 2146 // This will append to the popup_suggestions but not the IDs since there |
| 2150 &popup_icons); | 2147 // are no backend IDs for the I18N validator suggestions. |
| 2148 GetI18nValidatorSuggestions(section, type, &popup_suggestions); |
| 2151 } | 2149 } |
| 2152 | 2150 |
| 2153 if (popup_values.empty()) { | 2151 if (popup_suggestions.empty()) { |
| 2154 HidePopup(); | 2152 HidePopup(); |
| 2155 return; | 2153 return; |
| 2156 } | 2154 } |
| 2157 | 2155 |
| 2158 // |popup_input_type_| must be set before calling |Show()|. | 2156 // |popup_input_type_| must be set before calling |Show()|. |
| 2159 popup_input_type_ = type; | 2157 popup_input_type_ = type; |
| 2160 popup_section_ = section; | 2158 popup_section_ = section; |
| 2161 | 2159 |
| 2160 // Use our own 0-based IDs for the items. |
| 2162 // TODO(estade): do we need separators and control rows like 'Clear | 2161 // TODO(estade): do we need separators and control rows like 'Clear |
| 2163 // Form'? | 2162 // Form'? |
| 2164 std::vector<int> popup_ids; | 2163 for (size_t i = 0; i < popup_suggestions.size(); ++i) { |
| 2165 for (size_t i = 0; i < popup_values.size(); ++i) { | 2164 popup_suggestions[i].frontend_id = i; |
| 2166 popup_ids.push_back(i); | |
| 2167 } | 2165 } |
| 2168 | 2166 |
| 2169 popup_controller_ = AutofillPopupControllerImpl::GetOrCreate( | 2167 popup_controller_ = AutofillPopupControllerImpl::GetOrCreate( |
| 2170 popup_controller_, | 2168 popup_controller_, |
| 2171 weak_ptr_factory_.GetWeakPtr(), | 2169 weak_ptr_factory_.GetWeakPtr(), |
| 2172 NULL, | 2170 NULL, |
| 2173 parent_view, | 2171 parent_view, |
| 2174 content_bounds, | 2172 content_bounds, |
| 2175 base::i18n::IsRTL() ? | 2173 base::i18n::IsRTL() ? |
| 2176 base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT); | 2174 base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT); |
| 2177 popup_controller_->Show(popup_values, | 2175 popup_controller_->Show(popup_suggestions); |
| 2178 popup_labels, | |
| 2179 popup_icons, | |
| 2180 popup_ids); | |
| 2181 } | 2176 } |
| 2182 | 2177 |
| 2183 void AutofillDialogControllerImpl::FocusMoved() { | 2178 void AutofillDialogControllerImpl::FocusMoved() { |
| 2184 HidePopup(); | 2179 HidePopup(); |
| 2185 } | 2180 } |
| 2186 | 2181 |
| 2187 bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const { | 2182 bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const { |
| 2188 return popup_input_type_ == UNKNOWN_TYPE; | 2183 return popup_input_type_ == UNKNOWN_TYPE; |
| 2189 } | 2184 } |
| 2190 | 2185 |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2403 const base::string16& value, | 2398 const base::string16& value, |
| 2404 int identifier) { | 2399 int identifier) { |
| 2405 DCHECK_NE(UNKNOWN_TYPE, popup_input_type_); | 2400 DCHECK_NE(UNKNOWN_TYPE, popup_input_type_); |
| 2406 // Because |HidePopup()| can be called from |UpdateSection()|, remember the | 2401 // Because |HidePopup()| can be called from |UpdateSection()|, remember the |
| 2407 // type of the input for later here. | 2402 // type of the input for later here. |
| 2408 const ServerFieldType popup_input_type = popup_input_type_; | 2403 const ServerFieldType popup_input_type = popup_input_type_; |
| 2409 | 2404 |
| 2410 ScopedViewUpdates updates(view_.get()); | 2405 ScopedViewUpdates updates(view_.get()); |
| 2411 scoped_ptr<DataModelWrapper> wrapper; | 2406 scoped_ptr<DataModelWrapper> wrapper; |
| 2412 | 2407 |
| 2413 if (static_cast<size_t>(identifier) < popup_guids_.size()) { | 2408 if (static_cast<size_t>(identifier) < popup_suggestion_ids_.size()) { |
| 2414 const PersonalDataManager::GUIDPair& pair = popup_guids_[identifier]; | 2409 const SuggestionBackendID& sid = popup_suggestion_ids_[identifier]; |
| 2415 if (common::IsCreditCardType(popup_input_type)) { | 2410 if (common::IsCreditCardType(popup_input_type)) { |
| 2416 wrapper.reset(new AutofillCreditCardWrapper( | 2411 wrapper.reset(new AutofillCreditCardWrapper( |
| 2417 GetManager()->GetCreditCardByGUID(pair.first))); | 2412 GetManager()->GetCreditCardByGUID(sid.guid))); |
| 2418 } else { | 2413 } else { |
| 2419 wrapper.reset(new AutofillProfileWrapper( | 2414 wrapper.reset(new AutofillProfileWrapper( |
| 2420 GetManager()->GetProfileByGUID(pair.first), | 2415 GetManager()->GetProfileByGUID(sid.guid), |
| 2421 AutofillType(popup_input_type), | 2416 AutofillType(popup_input_type), |
| 2422 pair.second)); | 2417 sid.variant)); |
| 2423 } | 2418 } |
| 2424 } else { | 2419 } else { |
| 2425 wrapper.reset(new I18nAddressDataWrapper( | 2420 wrapper.reset(new I18nAddressDataWrapper( |
| 2426 &i18n_validator_suggestions_[identifier - popup_guids_.size()])); | 2421 &i18n_validator_suggestions_[ |
| 2422 identifier - popup_suggestion_ids_.size()])); |
| 2427 } | 2423 } |
| 2428 | 2424 |
| 2429 // If the user hasn't switched away from the default country and |wrapper|'s | 2425 // If the user hasn't switched away from the default country and |wrapper|'s |
| 2430 // country differs from the |view_|'s, rebuild inputs and restore user data. | 2426 // country differs from the |view_|'s, rebuild inputs and restore user data. |
| 2431 const FieldValueMap snapshot = TakeUserInputSnapshot(); | 2427 const FieldValueMap snapshot = TakeUserInputSnapshot(); |
| 2432 bool billing_rebuilt = false, shipping_rebuilt = false; | 2428 bool billing_rebuilt = false, shipping_rebuilt = false; |
| 2433 | 2429 |
| 2434 base::string16 billing_country = | 2430 base::string16 billing_country = |
| 2435 wrapper->GetInfo(AutofillType(ADDRESS_BILLING_COUNTRY)); | 2431 wrapper->GetInfo(AutofillType(ADDRESS_BILLING_COUNTRY)); |
| 2436 if (popup_section_ == ActiveBillingSection() && | 2432 if (popup_section_ == ActiveBillingSection() && |
| (...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3378 | 3374 |
| 3379 if (section == SECTION_SHIPPING) | 3375 if (section == SECTION_SHIPPING) |
| 3380 return shipping_country_combobox_model_.get(); | 3376 return shipping_country_combobox_model_.get(); |
| 3381 | 3377 |
| 3382 return NULL; | 3378 return NULL; |
| 3383 } | 3379 } |
| 3384 | 3380 |
| 3385 void AutofillDialogControllerImpl::GetI18nValidatorSuggestions( | 3381 void AutofillDialogControllerImpl::GetI18nValidatorSuggestions( |
| 3386 DialogSection section, | 3382 DialogSection section, |
| 3387 ServerFieldType type, | 3383 ServerFieldType type, |
| 3388 std::vector<base::string16>* popup_values, | 3384 std::vector<autofill::Suggestion>* popup_suggestions) { |
| 3389 std::vector<base::string16>* popup_labels, | |
| 3390 std::vector<base::string16>* popup_icons) { | |
| 3391 AddressField focused_field; | 3385 AddressField focused_field; |
| 3392 if (!i18n::FieldForType(type, &focused_field)) | 3386 if (!i18n::FieldForType(type, &focused_field)) |
| 3393 return; | 3387 return; |
| 3394 | 3388 |
| 3395 FieldValueMap inputs; | 3389 FieldValueMap inputs; |
| 3396 view_->GetUserInput(section, &inputs); | 3390 view_->GetUserInput(section, &inputs); |
| 3397 | 3391 |
| 3398 AutofillProfile profile; | 3392 AutofillProfile profile; |
| 3399 FillFormGroupFromOutputs(inputs, &profile); | 3393 FillFormGroupFromOutputs(inputs, &profile); |
| 3400 | 3394 |
| 3401 scoped_ptr<AddressData> user_input = | 3395 scoped_ptr<AddressData> user_input = |
| 3402 i18n::CreateAddressDataFromAutofillProfile( | 3396 i18n::CreateAddressDataFromAutofillProfile( |
| 3403 profile, g_browser_process->GetApplicationLocale()); | 3397 profile, g_browser_process->GetApplicationLocale()); |
| 3404 user_input->language_code = AddressLanguageCodeForSection(section); | 3398 user_input->language_code = AddressLanguageCodeForSection(section); |
| 3405 | 3399 |
| 3406 static const size_t kSuggestionsLimit = 10; | 3400 static const size_t kSuggestionsLimit = 10; |
| 3407 AddressValidator::Status status = GetValidator()->GetSuggestions( | 3401 AddressValidator::Status status = GetValidator()->GetSuggestions( |
| 3408 *user_input, focused_field, kSuggestionsLimit, | 3402 *user_input, focused_field, kSuggestionsLimit, |
| 3409 &i18n_validator_suggestions_); | 3403 &i18n_validator_suggestions_); |
| 3410 | 3404 |
| 3411 if (status != AddressValidator::SUCCESS) | 3405 if (status != AddressValidator::SUCCESS) |
| 3412 return; | 3406 return; |
| 3413 | 3407 |
| 3414 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { | 3408 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { |
| 3415 popup_values->push_back(base::UTF8ToUTF16( | 3409 popup_suggestions->push_back(autofill::Suggestion( |
| 3416 i18n_validator_suggestions_[i].GetFieldValue(focused_field))); | 3410 base::UTF8ToUTF16( |
| 3411 i18n_validator_suggestions_[i].GetFieldValue(focused_field)))); |
| 3417 | 3412 |
| 3418 // Disambiguate the suggestion by showing the smallest administrative | 3413 // Disambiguate the suggestion by showing the smallest administrative |
| 3419 // region of the suggested address: | 3414 // region of the suggested address: |
| 3420 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY | 3415 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY |
| 3421 popup_labels->push_back(base::string16()); | |
| 3422 for (int field = DEPENDENT_LOCALITY; field >= ADMIN_AREA; --field) { | 3416 for (int field = DEPENDENT_LOCALITY; field >= ADMIN_AREA; --field) { |
| 3423 const std::string& field_value = | 3417 const std::string& field_value = |
| 3424 i18n_validator_suggestions_[i].GetFieldValue( | 3418 i18n_validator_suggestions_[i].GetFieldValue( |
| 3425 static_cast<AddressField>(field)); | 3419 static_cast<AddressField>(field)); |
| 3426 if (focused_field != field && !field_value.empty()) { | 3420 if (focused_field != field && !field_value.empty()) { |
| 3427 popup_labels->back().assign(base::UTF8ToUTF16(field_value)); | 3421 popup_suggestions->back().label = base::UTF8ToUTF16(field_value); |
| 3428 break; | 3422 break; |
| 3429 } | 3423 } |
| 3430 } | 3424 } |
| 3431 } | 3425 } |
| 3432 popup_icons->resize(popup_values->size()); | |
| 3433 } | 3426 } |
| 3434 | 3427 |
| 3435 DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( | 3428 DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( |
| 3436 DialogSection section) { | 3429 DialogSection section) { |
| 3437 return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); | 3430 return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); |
| 3438 } | 3431 } |
| 3439 | 3432 |
| 3440 std::string* AutofillDialogControllerImpl::MutableAddressLanguageCodeForSection( | 3433 std::string* AutofillDialogControllerImpl::MutableAddressLanguageCodeForSection( |
| 3441 DialogSection section) { | 3434 DialogSection section) { |
| 3442 switch (section) { | 3435 switch (section) { |
| (...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4147 view_->UpdateButtonStrip(); | 4140 view_->UpdateButtonStrip(); |
| 4148 } | 4141 } |
| 4149 | 4142 |
| 4150 void AutofillDialogControllerImpl::FetchWalletCookie() { | 4143 void AutofillDialogControllerImpl::FetchWalletCookie() { |
| 4151 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); | 4144 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); |
| 4152 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); | 4145 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); |
| 4153 signin_helper_->StartWalletCookieValueFetch(); | 4146 signin_helper_->StartWalletCookieValueFetch(); |
| 4154 } | 4147 } |
| 4155 | 4148 |
| 4156 } // namespace autofill | 4149 } // namespace autofill |
| OLD | NEW |