Index: third_party/libaddressinput/chromium/preload_address_validator.cc |
diff --git a/third_party/libaddressinput/chromium/preload_address_validator.cc b/third_party/libaddressinput/chromium/preload_address_validator.cc |
index 816e3a5d522702e1ee041d3e33ab866dc4256185..8664563354ba47ff7697ab7a4c8183ff7e5a34eb 100644 |
--- a/third_party/libaddressinput/chromium/preload_address_validator.cc |
+++ b/third_party/libaddressinput/chromium/preload_address_validator.cc |
@@ -2,83 +2,86 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "third_party/libaddressinput/chromium/preload_address_validator.h" |
+ |
#include <cstddef> |
#include <string> |
#include <vector> |
#include "base/basictypes.h" |
+#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
- |
-#define I18N_ADDRESSINPUT_UTIL_BASICTYPES_H_ |
-#include "third_party/libaddressinput/chromium/preload_address_validator.h" |
+#include "third_party/libaddressinput/chromium/load_rules_delegate.h" |
#include "third_party/libaddressinput/chromium/suggestions.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" |
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_input_helper.h" |
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_normalizer.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_validator.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/callback.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/downloader.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/preload_supplier.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/storage.h" |
-#include "third_party/libaddressinput/src/cpp/include/libaddressinput/synonyms.h" |
namespace autofill { |
using ::i18n::addressinput::AddressData; |
using ::i18n::addressinput::AddressField; |
-using ::i18n::addressinput::AddressValidator; |
+using ::i18n::addressinput::AddressInputHelper; |
+using ::i18n::addressinput::AddressNormalizer; |
+using ::i18n::addressinput::ADMIN_AREA; |
using ::i18n::addressinput::BuildCallback; |
+using ::i18n::addressinput::DEPENDENT_LOCALITY; |
using ::i18n::addressinput::Downloader; |
using ::i18n::addressinput::FieldProblemMap; |
+using ::i18n::addressinput::INVALID_FORMAT; |
+using ::i18n::addressinput::MISMATCHING_VALUE; |
+using ::i18n::addressinput::POSTAL_CODE; |
using ::i18n::addressinput::PreloadSupplier; |
using ::i18n::addressinput::Storage; |
-using ::i18n::addressinput::Synonyms; |
- |
-PreloadAddressValidator::PreloadAddressValidator( |
- const std::string& validation_data_url, |
- scoped_ptr<Downloader> downloader, |
- scoped_ptr<Storage> storage) |
- : supplier_( |
- new PreloadSupplier( |
- validation_data_url, |
- downloader.release(), |
- storage.release())), |
- suggestions_( |
- new Suggestions( |
- supplier_.get())), |
- synonyms_( |
- new Synonyms( |
- supplier_.get())), |
- validator_( |
- new AddressValidator( |
- supplier_.get())), |
- validated_(BuildCallback(this, &PreloadAddressValidator::Validated)) { |
-} |
- |
-PreloadAddressValidator::~PreloadAddressValidator() { |
-} |
-void PreloadAddressValidator::LoadRules(const std::string& region_code, |
- const Callback& loaded) { |
- assert(supplier_ != NULL); |
- supplier_->LoadRules(region_code, loaded); |
+AddressValidator::AddressValidator(const std::string& validation_data_url, |
+ scoped_ptr<Downloader> downloader, |
+ scoped_ptr<Storage> storage, |
+ LoadRulesDelegate* load_rules_delegate) |
+ : supplier_(new PreloadSupplier(validation_data_url, downloader.release(), |
+ storage.release())), |
+ suggestions_(new Suggestions(supplier_.get())), |
+ normalizer_(new AddressNormalizer(supplier_.get())), |
+ validator_(new ::i18n::addressinput::AddressValidator(supplier_.get())), |
+ input_helper_(new AddressInputHelper(supplier_.get())), |
+ validated_(BuildCallback(this, &AddressValidator::Validated)), |
+ rules_loaded_(BuildCallback(this, &AddressValidator::RulesLoaded)), |
+ load_rules_delegate_(load_rules_delegate) {} |
+ |
+AddressValidator::~AddressValidator() {} |
+ |
+void AddressValidator::LoadRules(const std::string& region_code) { |
+ DCHECK(supplier_); |
+ supplier_->LoadRules(region_code, *rules_loaded_); |
} |
-PreloadAddressValidator::Status PreloadAddressValidator::Validate( |
+AddressValidator::Status AddressValidator::ValidateAddress( |
const AddressData& address, |
const FieldProblemMap* filter, |
FieldProblemMap* problems) const { |
- assert(supplier_ != NULL); |
- assert(validator_ != NULL); |
+ DCHECK(supplier_); |
+ DCHECK(validator_); |
+ DCHECK(normalizer_); |
- if (supplier_->IsPending(address.region_code)) { |
+ if (supplier_->IsPending(address.region_code)) |
return RULES_NOT_READY; |
- } |
- if (!supplier_->IsLoaded(address.region_code)) { |
+ if (!supplier_->IsLoaded(address.region_code)) |
return RULES_UNAVAILABLE; |
- } |
+ |
+ if (!problems) |
+ return SUCCESS; |
+ |
+ AddressData normalized_address = address; |
+ normalizer_->Normalize(&normalized_address); |
validator_->Validate( |
- address, |
+ normalized_address, |
/*allow_postal*/ false, |
/*require_name*/ false, |
filter, |
@@ -88,57 +91,100 @@ PreloadAddressValidator::Status PreloadAddressValidator::Validate( |
return SUCCESS; |
} |
-PreloadAddressValidator::Status PreloadAddressValidator::GetSuggestions( |
+AddressValidator::Status AddressValidator::GetSuggestions( |
const AddressData& user_input, |
AddressField focused_field, |
size_t suggestion_limit, |
std::vector<AddressData>* suggestions) const { |
- assert(suggestions_ != NULL); |
- assert(supplier_ != NULL); |
+ DCHECK(suggestions_); |
+ DCHECK(input_helper_); |
+ DCHECK(supplier_); |
- if (supplier_->IsPending(user_input.region_code)) { |
+ if (supplier_->IsPending(user_input.region_code)) |
return RULES_NOT_READY; |
- } |
- if (!supplier_->IsLoaded(user_input.region_code)) { |
+ if (!supplier_->IsLoaded(user_input.region_code)) |
return RULES_UNAVAILABLE; |
+ |
+ if (!suggestions) |
+ return SUCCESS; |
+ |
+ suggestions->clear(); |
+ |
+ AddressData address_copy = user_input; |
+ FieldProblemMap filter; |
+ FieldProblemMap problems; |
+ if (focused_field == POSTAL_CODE) { |
+ filter.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT)); |
+ |
+ Status status = ValidateAddress(address_copy, &filter, &problems); |
+ DCHECK(status == SUCCESS); |
+ (void)status; |
+ |
+ if (!problems.empty()) |
+ return SUCCESS; |
+ |
+ input_helper_->FillAddress(&address_copy); |
+ } |
+ |
+ if (focused_field == POSTAL_CODE || |
+ (focused_field >= ADMIN_AREA && focused_field <= DEPENDENT_LOCALITY)) { |
+ suggestions_->GetSuggestions(address_copy, focused_field, suggestion_limit, |
+ suggestions); |
} |
- suggestions_->GetSuggestions( |
- user_input, |
- focused_field, |
- suggestion_limit, |
- suggestions); |
+ filter.clear(); |
+ filter.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE)); |
+ std::vector<AddressData> valid_postal_codes; |
+ for (std::vector<AddressData>::const_iterator suggestion_it = |
+ suggestions->begin(); |
+ suggestion_it != suggestions->end(); |
+ ++suggestion_it) { |
+ problems.clear(); |
+ |
+ Status status = ValidateAddress(address_copy, &filter, &problems); |
+ DCHECK(status == SUCCESS); |
+ (void)status; |
+ |
+ if (problems.empty()) |
+ valid_postal_codes.push_back(*suggestion_it); |
+ } |
+ suggestions->swap(valid_postal_codes); |
return SUCCESS; |
} |
-bool PreloadAddressValidator::CanonicalizeAdministrativeArea( |
+bool AddressValidator::CanonicalizeAdministrativeArea( |
AddressData* address) const { |
- assert(address != NULL); |
- assert(supplier_ != NULL); |
- assert(synonyms_ != NULL); |
+ DCHECK(address); |
+ DCHECK(supplier_); |
+ DCHECK(normalizer_); |
- if (!supplier_->IsLoaded(address->region_code)) { |
+ if (!supplier_->IsLoaded(address->region_code)) |
return false; |
- } |
// TODO: It would probably be beneficial to use the full canonicalization. |
AddressData tmp(*address); |
- synonyms_->NormalizeForDisplay(&tmp); |
+ normalizer_->Normalize(&tmp); |
address->administrative_area = tmp.administrative_area; |
return true; |
} |
-void PreloadAddressValidator::Validated(bool success, |
- const AddressData&, |
- const FieldProblemMap&) { |
- assert(success); |
+void AddressValidator::Validated(bool success, |
+ const AddressData&, |
+ const FieldProblemMap&) { |
+ DCHECK(success); |
} |
-// Stub constructor for use by MockAddressValidator. |
-PreloadAddressValidator::PreloadAddressValidator() { |
+void AddressValidator::RulesLoaded(bool success, |
+ const std::string& country_code, |
+ const int&) { |
+ if (load_rules_delegate_) |
+ load_rules_delegate_->OnAddressValidationRulesLoaded(country_code, success); |
} |
+// Stub constructor for use by MockAddressValidator. |
+AddressValidator::AddressValidator() : load_rules_delegate_(NULL) {} |
+ |
} // namespace autofill |