diff options
author | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-02 22:35:43 +0000 |
---|---|---|
committer | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-02 22:35:43 +0000 |
commit | a70b140bc3e5babf323aab31ef3a5ca1dd3bd1f6 (patch) | |
tree | 5eca0d318578791cbbbb5987994397758e6ae2ec /chrome/browser/autofill/autofill_regexes.cc | |
parent | 51e218d5b02814cf6bf2d9cc63fe97f31e8bada3 (diff) | |
download | chromium_src-a70b140bc3e5babf323aab31ef3a5ca1dd3bd1f6.zip chromium_src-a70b140bc3e5babf323aab31ef3a5ca1dd3bd1f6.tar.gz chromium_src-a70b140bc3e5babf323aab31ef3a5ca1dd3bd1f6.tar.bz2 |
Cache Autofill heuristics regexes
Runtime for FormStructureBrowserTest.DataDrivenHeuristics decreased from 2.4s to 1.5s
In particular, the test now spends 61ms in AutofillManager::ParseForms, down from 738ms.
BUG=72242
TEST=unit_tests --gtest_filter=Autofill*:FormStructure*, browser_tests --gtest_filter=Autofill*:FormStructure*
Review URL: http://codereview.chromium.org/7066043
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87710 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/autofill/autofill_regexes.cc')
-rw-r--r-- | chrome/browser/autofill/autofill_regexes.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/chrome/browser/autofill/autofill_regexes.cc b/chrome/browser/autofill/autofill_regexes.cc new file mode 100644 index 0000000..5329958 --- /dev/null +++ b/chrome/browser/autofill/autofill_regexes.cc @@ -0,0 +1,84 @@ +// Copyright (c) 2011 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 "chrome/browser/autofill/autofill_regexes.h" + +#include <map> +#include <utility> + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/singleton.h" +#include "base/stl_util-inl.h" +#include "base/string16.h" +#include "unicode/regex.h" + +namespace { + +// A singleton class that serves as a cache of compiled regex patterns. +class AutofillRegexes { + public: + static AutofillRegexes* GetInstance(); + + // Returns the compiled regex matcher corresponding to |pattern|. + icu::RegexMatcher* GetMatcher(const string16& pattern); + + private: + AutofillRegexes(); + ~AutofillRegexes(); + friend struct DefaultSingletonTraits<AutofillRegexes>; + + // Maps patterns to their corresponding regex matchers. + std::map<string16, icu::RegexMatcher*> matchers_; + + DISALLOW_COPY_AND_ASSIGN(AutofillRegexes); +}; + +// static +AutofillRegexes* AutofillRegexes::GetInstance() { + return Singleton<AutofillRegexes>::get(); +} + +AutofillRegexes::AutofillRegexes() { +} + +AutofillRegexes::~AutofillRegexes() { + STLDeleteContainerPairSecondPointers(matchers_.begin(), + matchers_.end()); +} + +icu::RegexMatcher* AutofillRegexes::GetMatcher(const string16& pattern) { + if (!matchers_.count(pattern)) { + const icu::UnicodeString icu_pattern(pattern.data(), pattern.length()); + + UErrorCode status = U_ZERO_ERROR; + icu::RegexMatcher* matcher = new icu::RegexMatcher(icu_pattern, + UREGEX_CASE_INSENSITIVE, + status); + DCHECK(U_SUCCESS(status)); + + matchers_.insert(std::make_pair(pattern, matcher)); + } + + return matchers_[pattern]; +} + +} // namespace + +namespace autofill { + +bool MatchesPattern(const string16& input, const string16& pattern) { + icu::RegexMatcher* matcher = + AutofillRegexes::GetInstance()->GetMatcher(pattern); + icu::UnicodeString icu_input(input.data(), input.length()); + matcher->reset(icu_input); + + UErrorCode status = U_ZERO_ERROR; + UBool match = matcher->find(0, status); + DCHECK(U_SUCCESS(status)); + return !!match; +} + +} // namespace autofill + |