Index: extensions/common/url_pattern.cc |
diff --git a/extensions/common/url_pattern.cc b/extensions/common/url_pattern.cc |
index 820aacf51aa03031f49af356caffc541ef88c666..f46e22ccaa0b8e629a9d60cdeaccd85c59d119d7 100644 |
--- a/extensions/common/url_pattern.cc |
+++ b/extensions/common/url_pattern.cc |
@@ -111,12 +111,14 @@ std::string StripTrailingWildcard(const std::string& path) { |
URLPattern::URLPattern() |
: valid_schemes_(SCHEME_NONE), |
+ allowed_schemes_(SCHEME_NONE), |
match_all_urls_(false), |
match_subdomains_(false), |
port_("*") {} |
URLPattern::URLPattern(int valid_schemes) |
: valid_schemes_(valid_schemes), |
+ allowed_schemes_(valid_schemes), |
match_all_urls_(false), |
match_subdomains_(false), |
port_("*") {} |
@@ -125,6 +127,7 @@ URLPattern::URLPattern(int valid_schemes, const std::string& pattern) |
// Strict error checking is used, because this constructor is only |
// appropriate when we know |pattern| is valid. |
: valid_schemes_(valid_schemes), |
+ allowed_schemes_(valid_schemes), |
match_all_urls_(false), |
match_subdomains_(false), |
port_("*") { |
@@ -239,6 +242,8 @@ URLPattern::ParseResult URLPattern::Parse(const std::string& pattern) { |
if (host_.find('*') != std::string::npos) |
return PARSE_ERROR_INVALID_HOST_WILDCARD; |
+ SetAllowedSchemes(valid_schemes_); |
+ |
return PARSE_SUCCESS; |
} |
@@ -247,6 +252,11 @@ void URLPattern::SetValidSchemes(int valid_schemes) { |
valid_schemes_ = valid_schemes; |
} |
+void URLPattern::SetAllowedSchemes(int allowed_schemes) { |
+ spec_.clear(); |
+ allowed_schemes_ = allowed_schemes; |
+} |
+ |
void URLPattern::SetHost(const std::string& host) { |
spec_.clear(); |
host_ = host; |
@@ -280,12 +290,20 @@ bool URLPattern::SetScheme(const std::string& scheme) { |
return true; |
} |
+bool URLPattern::IsAllowedScheme(const std::string& scheme) const { |
+ return URLPattern::IsSchemeBitSet(scheme, allowed_schemes_); |
+} |
+ |
bool URLPattern::IsValidScheme(const std::string& scheme) const { |
- if (valid_schemes_ == SCHEME_ALL) |
+ return URLPattern::IsSchemeBitSet(scheme, valid_schemes_); |
+} |
+ |
+bool URLPattern::IsSchemeBitSet(const std::string& scheme, const int mask) { |
+ if (mask == SCHEME_ALL) |
return true; |
for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { |
- if (scheme == kValidSchemes[i] && (valid_schemes_ & kValidSchemeMasks[i])) |
+ if (scheme == kValidSchemes[i] && (mask & kValidSchemeMasks[i])) |
return true; |
} |
@@ -353,7 +371,7 @@ bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { |
} |
bool URLPattern::MatchesScheme(const std::string& test) const { |
- if (!IsValidScheme(test)) |
+ if (!IsAllowedScheme(test)) |
return false; |
return scheme_ == "*" || test == scheme_; |