OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/common/url_pattern.h" | 5 #include "extensions/common/url_pattern.h" |
6 | 6 |
7 #include "base/string_number_conversions.h" | 7 #include "base/string_number_conversions.h" |
8 #include "base/string_piece.h" | 8 #include "base/string_piece.h" |
9 #include "base/string_split.h" | 9 #include "base/string_split.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 size_t wildcard_index = path.find('*'); | 104 size_t wildcard_index = path.find('*'); |
105 size_t path_last = path.size() - 1; | 105 size_t path_last = path.size() - 1; |
106 DCHECK(wildcard_index == std::string::npos || wildcard_index == path_last); | 106 DCHECK(wildcard_index == std::string::npos || wildcard_index == path_last); |
107 return wildcard_index == path_last ? path.substr(0, path_last) : path; | 107 return wildcard_index == path_last ? path.substr(0, path_last) : path; |
108 } | 108 } |
109 | 109 |
110 } // namespace | 110 } // namespace |
111 | 111 |
112 URLPattern::URLPattern() | 112 URLPattern::URLPattern() |
113 : valid_schemes_(SCHEME_NONE), | 113 : valid_schemes_(SCHEME_NONE), |
| 114 allowed_schemes_(SCHEME_NONE), |
114 match_all_urls_(false), | 115 match_all_urls_(false), |
115 match_subdomains_(false), | 116 match_subdomains_(false), |
116 port_("*") {} | 117 port_("*") {} |
117 | 118 |
118 URLPattern::URLPattern(int valid_schemes) | 119 URLPattern::URLPattern(int valid_schemes) |
119 : valid_schemes_(valid_schemes), | 120 : valid_schemes_(valid_schemes), |
| 121 allowed_schemes_(valid_schemes), |
120 match_all_urls_(false), | 122 match_all_urls_(false), |
121 match_subdomains_(false), | 123 match_subdomains_(false), |
122 port_("*") {} | 124 port_("*") {} |
123 | 125 |
124 URLPattern::URLPattern(int valid_schemes, const std::string& pattern) | 126 URLPattern::URLPattern(int valid_schemes, const std::string& pattern) |
125 // Strict error checking is used, because this constructor is only | 127 // Strict error checking is used, because this constructor is only |
126 // appropriate when we know |pattern| is valid. | 128 // appropriate when we know |pattern| is valid. |
127 : valid_schemes_(valid_schemes), | 129 : valid_schemes_(valid_schemes), |
| 130 allowed_schemes_(valid_schemes), |
128 match_all_urls_(false), | 131 match_all_urls_(false), |
129 match_subdomains_(false), | 132 match_subdomains_(false), |
130 port_("*") { | 133 port_("*") { |
131 if (PARSE_SUCCESS != Parse(pattern)) | 134 if (PARSE_SUCCESS != Parse(pattern)) |
132 NOTREACHED() << "URLPattern is invalid: " << pattern; | 135 NOTREACHED() << "URLPattern is invalid: " << pattern; |
133 } | 136 } |
134 | 137 |
135 URLPattern::~URLPattern() { | 138 URLPattern::~URLPattern() { |
136 } | 139 } |
137 | 140 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 return PARSE_ERROR_INVALID_PORT; | 235 return PARSE_ERROR_INVALID_PORT; |
233 host_ = host_.substr(0, port_pos); | 236 host_ = host_.substr(0, port_pos); |
234 } | 237 } |
235 | 238 |
236 // No other '*' can occur in the host, though. This isn't necessary, but is | 239 // No other '*' can occur in the host, though. This isn't necessary, but is |
237 // done as a convenience to developers who might otherwise be confused and | 240 // done as a convenience to developers who might otherwise be confused and |
238 // think '*' works as a glob in the host. | 241 // think '*' works as a glob in the host. |
239 if (host_.find('*') != std::string::npos) | 242 if (host_.find('*') != std::string::npos) |
240 return PARSE_ERROR_INVALID_HOST_WILDCARD; | 243 return PARSE_ERROR_INVALID_HOST_WILDCARD; |
241 | 244 |
| 245 SetAllowedSchemes(valid_schemes_); |
| 246 |
242 return PARSE_SUCCESS; | 247 return PARSE_SUCCESS; |
243 } | 248 } |
244 | 249 |
245 void URLPattern::SetValidSchemes(int valid_schemes) { | 250 void URLPattern::SetValidSchemes(int valid_schemes) { |
246 spec_.clear(); | 251 spec_.clear(); |
247 valid_schemes_ = valid_schemes; | 252 valid_schemes_ = valid_schemes; |
248 } | 253 } |
249 | 254 |
| 255 void URLPattern::SetAllowedSchemes(int allowed_schemes) { |
| 256 spec_.clear(); |
| 257 allowed_schemes_ = allowed_schemes; |
| 258 } |
| 259 |
250 void URLPattern::SetHost(const std::string& host) { | 260 void URLPattern::SetHost(const std::string& host) { |
251 spec_.clear(); | 261 spec_.clear(); |
252 host_ = host; | 262 host_ = host; |
253 } | 263 } |
254 | 264 |
255 void URLPattern::SetMatchAllURLs(bool val) { | 265 void URLPattern::SetMatchAllURLs(bool val) { |
256 spec_.clear(); | 266 spec_.clear(); |
257 match_all_urls_ = val; | 267 match_all_urls_ = val; |
258 | 268 |
259 if (val) { | 269 if (val) { |
(...skipping 13 matching lines...) Expand all Loading... |
273 spec_.clear(); | 283 spec_.clear(); |
274 scheme_ = scheme; | 284 scheme_ = scheme; |
275 if (scheme_ == "*") { | 285 if (scheme_ == "*") { |
276 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); | 286 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); |
277 } else if (!IsValidScheme(scheme_)) { | 287 } else if (!IsValidScheme(scheme_)) { |
278 return false; | 288 return false; |
279 } | 289 } |
280 return true; | 290 return true; |
281 } | 291 } |
282 | 292 |
| 293 bool URLPattern::IsAllowedScheme(const std::string& scheme) const { |
| 294 return URLPattern::IsSchemeBitSet(scheme, allowed_schemes_); |
| 295 } |
| 296 |
283 bool URLPattern::IsValidScheme(const std::string& scheme) const { | 297 bool URLPattern::IsValidScheme(const std::string& scheme) const { |
284 if (valid_schemes_ == SCHEME_ALL) | 298 return URLPattern::IsSchemeBitSet(scheme, valid_schemes_); |
| 299 } |
| 300 |
| 301 bool URLPattern::IsSchemeBitSet(const std::string& scheme, const int mask) { |
| 302 if (mask == SCHEME_ALL) |
285 return true; | 303 return true; |
286 | 304 |
287 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { | 305 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { |
288 if (scheme == kValidSchemes[i] && (valid_schemes_ & kValidSchemeMasks[i])) | 306 if (scheme == kValidSchemes[i] && (mask & kValidSchemeMasks[i])) |
289 return true; | 307 return true; |
290 } | 308 } |
291 | 309 |
292 return false; | 310 return false; |
293 } | 311 } |
294 | 312 |
295 void URLPattern::SetPath(const std::string& path) { | 313 void URLPattern::SetPath(const std::string& path) { |
296 spec_.clear(); | 314 spec_.clear(); |
297 path_ = path; | 315 path_ = path; |
298 path_escaped_ = path_; | 316 path_escaped_ = path_; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 if (!MatchesScheme(test_url->scheme())) | 364 if (!MatchesScheme(test_url->scheme())) |
347 return false; | 365 return false; |
348 | 366 |
349 if (match_all_urls_) | 367 if (match_all_urls_) |
350 return true; | 368 return true; |
351 | 369 |
352 return MatchesSecurityOriginHelper(*test_url); | 370 return MatchesSecurityOriginHelper(*test_url); |
353 } | 371 } |
354 | 372 |
355 bool URLPattern::MatchesScheme(const std::string& test) const { | 373 bool URLPattern::MatchesScheme(const std::string& test) const { |
356 if (!IsValidScheme(test)) | 374 if (!IsAllowedScheme(test)) |
357 return false; | 375 return false; |
358 | 376 |
359 return scheme_ == "*" || test == scheme_; | 377 return scheme_ == "*" || test == scheme_; |
360 } | 378 } |
361 | 379 |
362 bool URLPattern::MatchesHost(const std::string& host) const { | 380 bool URLPattern::MatchesHost(const std::string& host) const { |
363 std::string test(chrome::kHttpScheme); | 381 std::string test(chrome::kHttpScheme); |
364 test += content::kStandardSchemeSeparator; | 382 test += content::kStandardSchemeSeparator; |
365 test += host; | 383 test += host; |
366 test += "/"; | 384 test += "/"; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 } | 549 } |
532 | 550 |
533 return result; | 551 return result; |
534 } | 552 } |
535 | 553 |
536 // static | 554 // static |
537 const char* URLPattern::GetParseResultString( | 555 const char* URLPattern::GetParseResultString( |
538 URLPattern::ParseResult parse_result) { | 556 URLPattern::ParseResult parse_result) { |
539 return kParseResultMessages[parse_result]; | 557 return kParseResultMessages[parse_result]; |
540 } | 558 } |
OLD | NEW |