UrlPatternIndex: Lazily compute lower cased url spec.

This CL changes UrlPattern::UrlInfo to ensure that the lower cased url spec is
computed lazily. Together with r591139, this helps prevent a string allocation
for the whole lower cased url unless absolutely necessary.

BUG=767605

Change-Id: I374c268a48900322f258212b05b906c541869031
Reviewed-on: https://chromium-review.googlesource.com/1226450
Reviewed-by: Charlie Harrison <[email protected]>
Commit-Queue: Karan Bhatia <[email protected]>
Cr-Commit-Position: refs/heads/master@{#591243}
diff --git a/components/url_pattern_index/url_pattern.cc b/components/url_pattern_index/url_pattern.cc
index 8589f131..3aeed08 100644
--- a/components/url_pattern_index/url_pattern.cc
+++ b/components/url_pattern_index/url_pattern.cc
@@ -238,13 +238,23 @@
 
 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());
 }
 
+base::StringPiece UrlPattern::UrlInfo::GetLowerCaseSpec() const {
+  if (lower_case_spec_cached_)
+    return *lower_case_spec_cached_;
+
+  if (!HasAnyUpperAscii(spec_)) {
+    lower_case_spec_cached_ = spec_;
+  } else {
+    lower_case_spec_owner_ = base::ToLowerASCII(spec_);
+    lower_case_spec_cached_ = lower_case_spec_owner_;
+  }
+  return *lower_case_spec_cached_;
+}
+
 UrlPattern::UrlInfo::~UrlInfo() = default;
 
 UrlPattern::UrlPattern() = default;
@@ -278,7 +288,7 @@
          type_ == proto::URL_PATTERN_TYPE_WILDCARDED);
   DCHECK(base::IsStringASCII(url_pattern_));
   DCHECK(base::IsStringASCII(url.spec()));
-  DCHECK(base::IsStringASCII(url.lower_case_spec()));
+  DCHECK(base::IsStringASCII(url.GetLowerCaseSpec()));
 
   if (match_case()) {
     return IsCaseSensitiveMatch(url_pattern_, anchor_left_, anchor_right_,
@@ -287,7 +297,8 @@
 
   // For case-insensitive matching, convert both pattern and url to lower case.
   return IsCaseSensitiveMatch(base::ToLowerASCII(url_pattern_), anchor_left_,
-                              anchor_right_, url.lower_case_spec(), url.host());
+                              anchor_right_, url.GetLowerCaseSpec(),
+                              url.host());
 }
 
 std::ostream& operator<<(std::ostream& out, const UrlPattern& pattern) {