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

Unified Diff: third_party/libaddressinput/chromium/chrome_address_validator.cc

Issue 386873002: Reland "Use upstream libaddressinput in Chrome." (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix iOS compile. Created 6 years, 5 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: third_party/libaddressinput/chromium/chrome_address_validator.cc
diff --git a/third_party/libaddressinput/chromium/chrome_address_validator.cc b/third_party/libaddressinput/chromium/chrome_address_validator.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b54c74d5cbf5fe2aee6e7e0881efaed134f1347f
--- /dev/null
+++ b/third_party/libaddressinput/chromium/chrome_address_validator.cc
@@ -0,0 +1,154 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// 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/chrome_address_validator.h"
+
+#include <cstddef>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "third_party/libaddressinput/chromium/input_suggester.h"
+#include "third_party/libaddressinput/chromium/libaddressinput_util.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.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"
+
+namespace autofill {
+
+using ::i18n::addressinput::AddressData;
+using ::i18n::addressinput::AddressField;
+using ::i18n::addressinput::AddressNormalizer;
+using ::i18n::addressinput::BuildCallback;
+using ::i18n::addressinput::Downloader;
+using ::i18n::addressinput::FieldProblemMap;
+using ::i18n::addressinput::PreloadSupplier;
+using ::i18n::addressinput::Storage;
+
+using ::i18n::addressinput::ADMIN_AREA;
+using ::i18n::addressinput::DEPENDENT_LOCALITY;
+using ::i18n::addressinput::POSTAL_CODE;
+
+AddressValidator::AddressValidator(const std::string& validation_data_url,
+ scoped_ptr<Downloader> downloader,
+ scoped_ptr<Storage> storage,
+ LoadRulesListener* load_rules_listener)
+ : supplier_(new PreloadSupplier(validation_data_url,
+ downloader.release(),
+ storage.release())),
+ input_suggester_(new InputSuggester(supplier_.get())),
+ normalizer_(new AddressNormalizer(supplier_.get())),
+ validator_(new ::i18n::addressinput::AddressValidator(supplier_.get())),
+ validated_(BuildCallback(this, &AddressValidator::Validated)),
+ rules_loaded_(BuildCallback(this, &AddressValidator::RulesLoaded)),
+ load_rules_listener_(load_rules_listener) {}
+
+AddressValidator::~AddressValidator() {}
+
+void AddressValidator::LoadRules(const std::string& region_code) {
+ DCHECK(supplier_);
+ supplier_->LoadRules(region_code, *rules_loaded_);
+}
+
+AddressValidator::Status AddressValidator::ValidateAddress(
+ const AddressData& address,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems) const {
+ DCHECK(supplier_);
+ DCHECK(validator_);
+
+ if (supplier_->IsPending(address.region_code)) {
+ if (problems)
+ addressinput::ValidateRequiredFields(address, filter, problems);
+ return RULES_NOT_READY;
+ }
+
+ if (!supplier_->IsLoaded(address.region_code)) {
+ if (problems)
+ addressinput::ValidateRequiredFields(address, filter, problems);
+ return RULES_UNAVAILABLE;
+ }
+
+ if (!problems)
+ return SUCCESS;
+
+ validator_->Validate(address,
+ true, // Allow postal office boxes.
+ true, // Require recipient name.
+ filter,
+ problems,
+ *validated_);
+
+ return SUCCESS;
+}
+
+AddressValidator::Status AddressValidator::GetSuggestions(
+ const AddressData& user_input,
+ AddressField focused_field,
+ size_t suggestion_limit,
+ std::vector<AddressData>* suggestions) const {
+ DCHECK(supplier_);
+ DCHECK(input_suggester_);
+
+ if (supplier_->IsPending(user_input.region_code))
+ return RULES_NOT_READY;
+
+ if (!supplier_->IsLoaded(user_input.region_code))
+ return RULES_UNAVAILABLE;
+
+ if (!suggestions)
+ return SUCCESS;
+
+ suggestions->clear();
+
+ if (focused_field == POSTAL_CODE ||
+ (focused_field >= ADMIN_AREA && focused_field <= DEPENDENT_LOCALITY)) {
+ input_suggester_->GetSuggestions(
+ user_input, focused_field, suggestion_limit, suggestions);
+ }
+
+ return SUCCESS;
+}
+
+bool AddressValidator::CanonicalizeAdministrativeArea(
+ AddressData* address) const {
+ DCHECK(address);
+ DCHECK(supplier_);
+ DCHECK(normalizer_);
+
+ if (!supplier_->IsLoaded(address->region_code))
+ return false;
+
+ // TODO: It would probably be beneficial to use the full canonicalization.
+ AddressData tmp(*address);
+ normalizer_->Normalize(&tmp);
+ address->administrative_area = tmp.administrative_area;
+
+ return true;
+}
+
+AddressValidator::AddressValidator() : load_rules_listener_(NULL) {}
+
+void AddressValidator::Validated(bool success,
+ const AddressData&,
+ const FieldProblemMap&) {
+ DCHECK(success);
+}
+
+void AddressValidator::RulesLoaded(bool success,
+ const std::string& country_code,
+ int) {
+ if (load_rules_listener_)
+ load_rules_listener_->OnAddressValidationRulesLoaded(country_code, success);
+}
+
+} // namespace autofill

Powered by Google App Engine
This is Rietveld 408576698