Index: components/autofill/core/browser/address_rewriter.cc |
diff --git a/components/autofill/core/browser/address_rewriter.cc b/components/autofill/core/browser/address_rewriter.cc |
deleted file mode 100644 |
index 4cd255c807c0b46236c64788afebffd957af2c1b..0000000000000000000000000000000000000000 |
--- a/components/autofill/core/browser/address_rewriter.cc |
+++ /dev/null |
@@ -1,129 +0,0 @@ |
-// Copyright 2016 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 "components/autofill/core/browser/address_rewriter.h" |
- |
-#include <memory> |
-#include <unordered_map> |
- |
-#include "base/i18n/case_conversion.h" |
-#include "base/memory/singleton.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "third_party/re2/src/re2/re2.h" |
- |
-namespace autofill { |
-namespace { |
- |
-// Import in the internal rule table symbols. The data is defined in |
-// components/autofill/core/browser/address_rewriter_rules.cc |
-using internal::Rule; |
-using internal::RegionInfo; |
-using internal::kRuleTable; |
-using internal::kRuleTableSize; |
- |
-// Aliases for the types used by the compiled rules cache. |
-using CompiledRule = std::pair<std::unique_ptr<re2::RE2>, re2::StringPiece>; |
-using CompiledRuleVector = std::vector<CompiledRule>; |
-using CompiledRuleCache = std::unordered_map<std::string, CompiledRuleVector>; |
- |
-// Helper function to find the rules associated with |region|. Note that this |
-// requires that kRuleTable be sorted by region. |
-static const RegionInfo* GetRegionInfo(const base::StringPiece& region) { |
- const RegionInfo* begin = kRuleTable; |
- const RegionInfo* end = kRuleTable + kRuleTableSize; |
- const RegionInfo* iter = std::lower_bound(begin, end, region); |
- if (iter != end && region == iter->region) |
- return iter; |
- return nullptr; |
-} |
- |
-// The cache of compiled string replacement rules, keyed by region. This class |
-// is a singleton that compiles the rules for a given region the first time |
-// they are requested. |
-class Cache { |
- public: |
- // Return the singleton instance of the cache. |
- static Cache* GetInstance() { return base::Singleton<Cache>::get(); } |
- |
- // If the rules for |region| have already been compiled and cached, return a |
- // pointer to them. Otherwise, find the rules for |region| (returning nullptr |
- // if there are no such rules exist), compile them, cache them, and return a |
- // pointer to the cached rules. |
- const CompiledRuleVector* GetRulesForRegion(const std::string& region) { |
- // Take the lock so that we don't update the data cache concurrently. Note |
- // that the returned data is const and can be concurrently accessed, just |
- // not the data cache. |
- base::AutoLock auto_lock(lock_); |
- |
- // If we find a cached set of rules, return a pointer to the data. |
- CompiledRuleCache::iterator cache_iter = data_.find(region); |
- if (cache_iter != data_.end()) |
- return &cache_iter->second; |
- |
- // Cache miss. Look for the raw rules. If none, then return nullptr. |
- const RegionInfo* region_info = GetRegionInfo(region); |
- if (region_info == nullptr) |
- return nullptr; |
- |
- // Add a new rule vector the the cache and populate it with compiled rules. |
- re2::RE2::Options options; |
- options.set_utf8(true); |
- options.set_word_boundary(true); |
- CompiledRuleVector& compiled_rules = data_[region]; |
- compiled_rules.reserve(region_info->num_rules); |
- for (size_t i = 0; i < region_info->num_rules; ++i) { |
- const Rule& rule = region_info->rules[i]; |
- std::unique_ptr<re2::RE2> pattern(new re2::RE2(rule.pattern, options)); |
- re2::StringPiece rewrite(rule.rewrite); |
- compiled_rules.emplace_back(std::move(pattern), std::move(rewrite)); |
- } |
- |
- // Return a pointer to the data. |
- return &compiled_rules; |
- } |
- |
- private: |
- Cache() {} |
- |
- // Synchronizes access to |data_|, ensuring that a given set of rules is |
- // only compiled once. |
- base::Lock lock_; |
- |
- // The cache of compiled rules, keyed by region. |
- CompiledRuleCache data_; |
- |
- friend struct base::DefaultSingletonTraits<Cache>; |
- DISALLOW_COPY_AND_ASSIGN(Cache); |
-}; |
- |
-} // namespace |
- |
-AddressRewriter AddressRewriter::ForCountryCode( |
- const base::string16& country_code) { |
- const std::string region = |
- base::UTF16ToUTF8(base::i18n::ToUpper(country_code)); |
- const CompiledRuleVector* rules = |
- Cache::GetInstance()->GetRulesForRegion(region); |
- AddressRewriter rewriter; |
- rewriter.impl_ = rules; |
- return rewriter; |
-} |
- |
-base::string16 AddressRewriter::Rewrite(const base::string16& text) const { |
- if (impl_ == nullptr) |
- return base::CollapseWhitespace(text, true); |
- |
- // Apply all of the string replacement rules. We don't have to worry about |
- // whitespace during these passes because the patterns are all whitespace |
- // tolerant regular expressions. |
- std::string utf8_text = base::UTF16ToUTF8(text); |
- for (const auto& rule : *static_cast<const CompiledRuleVector*>(impl_)) { |
- RE2::GlobalReplace(&utf8_text, *rule.first, rule.second); |
- } |
- |
- // Collapse whitespace before returning the final value. |
- return base::UTF8ToUTF16(base::CollapseWhitespaceASCII(utf8_text, true)); |
-} |
- |
-} // namespace autofill |