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