UrlPatternIndex: Reduce redundant computations while matching.
r590118 implemented case-insensitive matching which led to some regression in url
matching performance. Currently, it's possible for a url to be lower-cased each
time it's matched with a pattern in UrlPattern::MatchesUrl. This CL aims to
reduce this redundant computation. A thin wrapper over GURL, UrlInfo is
introduced to cache the computation performed on the GURL.
BUG=767605
Change-Id: Ibe977f34e649068453c5a01e3619b93a76c9ae7d
Reviewed-on: https://chromium-review.googlesource.com/1220628
Reviewed-by: Charlie Harrison <[email protected]>
Commit-Queue: Karan Bhatia <[email protected]>
Cr-Commit-Position: refs/heads/master@{#590767}
diff --git a/components/url_pattern_index/url_pattern.cc b/components/url_pattern_index/url_pattern.cc
index 0c2fcd8..8589f131 100644
--- a/components/url_pattern_index/url_pattern.cc
+++ b/components/url_pattern_index/url_pattern.cc
@@ -236,6 +236,17 @@
} // namespace
+UrlPattern::UrlInfo::UrlInfo(const GURL& url)
+ : spec_(url.possibly_invalid_spec()),
+ lower_case_spec_(HasAnyUpperAscii(spec_) ? base::Optional<std::string>(
+ base::ToLowerASCII(spec_))
+ : base::nullopt),
+ host_(url.parsed_for_possibly_invalid_spec().host) {
+ DCHECK(url.is_valid());
+}
+
+UrlPattern::UrlInfo::~UrlInfo() = default;
+
UrlPattern::UrlPattern() = default;
UrlPattern::UrlPattern(base::StringPiece url_pattern,
@@ -262,28 +273,21 @@
UrlPattern::~UrlPattern() = default;
-bool UrlPattern::MatchesUrl(const GURL& url) const {
- // Note: Empty domains are also invalid.
- DCHECK(url.is_valid());
+bool UrlPattern::MatchesUrl(const UrlInfo& url) const {
DCHECK(type_ == proto::URL_PATTERN_TYPE_SUBSTRING ||
type_ == proto::URL_PATTERN_TYPE_WILDCARDED);
DCHECK(base::IsStringASCII(url_pattern_));
- DCHECK(base::IsStringASCII(url.possibly_invalid_spec()));
+ DCHECK(base::IsStringASCII(url.spec()));
+ DCHECK(base::IsStringASCII(url.lower_case_spec()));
- if (match_case() || (!HasAnyUpperAscii(url_pattern_) &&
- !HasAnyUpperAscii(url.possibly_invalid_spec()))) {
+ if (match_case()) {
return IsCaseSensitiveMatch(url_pattern_, anchor_left_, anchor_right_,
- url.possibly_invalid_spec(),
- url.parsed_for_possibly_invalid_spec().host);
+ url.spec(), url.host());
}
// For case-insensitive matching, convert both pattern and url to lower case.
- const std::string lower_case_url_pattern = base::ToLowerASCII(url_pattern_);
- const std::string lower_case_url_spec =
- base::ToLowerASCII(url.possibly_invalid_spec());
- return IsCaseSensitiveMatch(lower_case_url_pattern, anchor_left_,
- anchor_right_, lower_case_url_spec,
- url.parsed_for_possibly_invalid_spec().host);
+ return IsCaseSensitiveMatch(base::ToLowerASCII(url_pattern_), anchor_left_,
+ anchor_right_, url.lower_case_spec(), url.host());
}
std::ostream& operator<<(std::ostream& out, const UrlPattern& pattern) {