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) {