Chromium Code Reviews| 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 "chrome/common/extensions/url_pattern.h" | 5 #include "chrome/common/extensions/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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 if (!base::StringToInt(port, &parsed_port)) | 90 if (!base::StringToInt(port, &parsed_port)) |
| 91 return false; | 91 return false; |
| 92 return (parsed_port >= 0) && (parsed_port < 65536); | 92 return (parsed_port >= 0) && (parsed_port < 65536); |
| 93 } | 93 } |
| 94 | 94 |
| 95 } // namespace | 95 } // namespace |
| 96 | 96 |
| 97 URLPattern::URLPattern() | 97 URLPattern::URLPattern() |
| 98 : valid_schemes_(SCHEME_NONE), | 98 : valid_schemes_(SCHEME_NONE), |
| 99 match_all_urls_(false), | 99 match_all_urls_(false), |
| 100 partial_filesystem_support_hack_(false), | |
| 100 match_subdomains_(false), | 101 match_subdomains_(false), |
| 101 port_("*") {} | 102 port_("*") {} |
| 102 | 103 |
| 103 URLPattern::URLPattern(int valid_schemes) | 104 URLPattern::URLPattern(int valid_schemes) |
| 104 : valid_schemes_(valid_schemes), | 105 : valid_schemes_(valid_schemes), |
| 105 match_all_urls_(false), | 106 match_all_urls_(false), |
| 107 partial_filesystem_support_hack_(false), | |
| 106 match_subdomains_(false), | 108 match_subdomains_(false), |
| 107 port_("*") {} | 109 port_("*") {} |
| 108 | 110 |
| 109 URLPattern::URLPattern(int valid_schemes, const std::string& pattern) | 111 URLPattern::URLPattern(int valid_schemes, const std::string& pattern) |
| 110 // Strict error checking is used, because this constructor is only | 112 // Strict error checking is used, because this constructor is only |
| 111 // appropriate when we know |pattern| is valid. | 113 // appropriate when we know |pattern| is valid. |
| 112 : valid_schemes_(valid_schemes), | 114 : valid_schemes_(valid_schemes), |
| 113 match_all_urls_(false), | 115 match_all_urls_(false), |
| 116 partial_filesystem_support_hack_(false), | |
| 114 match_subdomains_(false), | 117 match_subdomains_(false), |
| 115 port_("*") { | 118 port_("*") { |
| 116 if (PARSE_SUCCESS != Parse(pattern)) | 119 if (PARSE_SUCCESS != Parse(pattern)) |
| 117 NOTREACHED() << "URLPattern is invalid: " << pattern; | 120 NOTREACHED() << "URLPattern is invalid: " << pattern; |
| 118 } | 121 } |
| 119 | 122 |
| 120 URLPattern::~URLPattern() { | 123 URLPattern::~URLPattern() { |
| 121 } | 124 } |
| 122 | 125 |
| 123 bool URLPattern::operator<(const URLPattern& other) const { | 126 bool URLPattern::operator<(const URLPattern& other) const { |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 242 match_all_urls_ = val; | 245 match_all_urls_ = val; |
| 243 | 246 |
| 244 if (val) { | 247 if (val) { |
| 245 match_subdomains_ = true; | 248 match_subdomains_ = true; |
| 246 scheme_ = "*"; | 249 scheme_ = "*"; |
| 247 host_.clear(); | 250 host_.clear(); |
| 248 SetPath("/*"); | 251 SetPath("/*"); |
| 249 } | 252 } |
| 250 } | 253 } |
| 251 | 254 |
| 255 void URLPattern::set_partial_filesystem_support_hack(bool val) { | |
|
Aaron Boodman
2012/03/23 21:48:32
Pure setters like this are typically in the .h fil
ericu
2012/03/23 22:47:15
Done.
| |
| 256 partial_filesystem_support_hack_ = val; | |
| 257 } | |
| 258 | |
| 252 void URLPattern::SetMatchSubdomains(bool val) { | 259 void URLPattern::SetMatchSubdomains(bool val) { |
| 253 spec_.clear(); | 260 spec_.clear(); |
| 254 match_subdomains_ = val; | 261 match_subdomains_ = val; |
| 255 } | 262 } |
| 256 | 263 |
| 257 bool URLPattern::SetScheme(const std::string& scheme) { | 264 bool URLPattern::SetScheme(const std::string& scheme) { |
| 258 spec_.clear(); | 265 spec_.clear(); |
| 259 scheme_ = scheme; | 266 scheme_ = scheme; |
| 260 if (scheme_ == "*") { | 267 if (scheme_ == "*") { |
| 261 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); | 268 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 288 bool URLPattern::SetPort(const std::string& port) { | 295 bool URLPattern::SetPort(const std::string& port) { |
| 289 spec_.clear(); | 296 spec_.clear(); |
| 290 if (IsValidPortForScheme(scheme_, port)) { | 297 if (IsValidPortForScheme(scheme_, port)) { |
| 291 port_ = port; | 298 port_ = port; |
| 292 return true; | 299 return true; |
| 293 } | 300 } |
| 294 return false; | 301 return false; |
| 295 } | 302 } |
| 296 | 303 |
| 297 bool URLPattern::MatchesURL(const GURL& test) const { | 304 bool URLPattern::MatchesURL(const GURL& test) const { |
| 298 if (!MatchesScheme(test.scheme())) | 305 const GURL* test_url = &test; |
| 306 bool has_inner_url = test.inner_url() != NULL; | |
| 307 | |
| 308 if (partial_filesystem_support_hack_ != has_inner_url) | |
| 309 return false; | |
| 310 | |
| 311 if (has_inner_url) | |
| 312 test_url = test.inner_url(); | |
| 313 | |
| 314 if (!MatchesScheme(test_url->scheme())) | |
| 299 return false; | 315 return false; |
| 300 | 316 |
| 301 if (match_all_urls_) | 317 if (match_all_urls_) |
| 302 return true; | 318 return true; |
| 303 | 319 |
| 304 return MatchesSecurityOriginHelper(test) && | 320 std::string path_for_request = test.PathForRequest(); |
| 305 MatchesPath(test.PathForRequest()); | 321 if (has_inner_url) |
| 322 path_for_request = test_url->path() + path_for_request; | |
| 323 | |
| 324 return MatchesSecurityOriginHelper(*test_url) && | |
| 325 MatchesPath(path_for_request, has_inner_url); | |
| 306 } | 326 } |
| 307 | 327 |
| 308 bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { | 328 bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { |
| 309 if (!MatchesScheme(test.scheme())) | 329 if (!MatchesScheme(test.scheme())) |
| 310 return false; | 330 return false; |
| 311 | 331 |
| 312 if (match_all_urls_) | 332 if (match_all_urls_) |
| 313 return true; | 333 return true; |
| 314 | 334 |
| 315 return MatchesSecurityOriginHelper(test); | 335 return MatchesSecurityOriginHelper(test); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 354 if (test.host().length() <= (host_.length() + 1)) | 374 if (test.host().length() <= (host_.length() + 1)) |
| 355 return false; | 375 return false; |
| 356 | 376 |
| 357 if (test.host().compare(test.host().length() - host_.length(), | 377 if (test.host().compare(test.host().length() - host_.length(), |
| 358 host_.length(), host_) != 0) | 378 host_.length(), host_) != 0) |
| 359 return false; | 379 return false; |
| 360 | 380 |
| 361 return test.host()[test.host().length() - host_.length() - 1] == '.'; | 381 return test.host()[test.host().length() - host_.length() - 1] == '.'; |
| 362 } | 382 } |
| 363 | 383 |
| 364 bool URLPattern::MatchesPath(const std::string& test) const { | 384 bool URLPattern::MatchesPath(const std::string& test, bool nested_url) |
|
Aaron Boodman
2012/03/23 21:48:32
I don't understand why the nested_url param is nec
ericu
2012/03/23 22:47:15
The caller is telling us where he got the path. I
ericu
2012/03/23 23:48:46
Param removed.
| |
| 385 const { | |
| 386 if (nested_url != partial_filesystem_support_hack_) | |
| 387 return false; | |
| 365 if (!MatchPattern(test, path_escaped_)) | 388 if (!MatchPattern(test, path_escaped_)) |
| 366 return false; | 389 return false; |
| 367 | 390 |
| 368 return true; | 391 return true; |
| 369 } | 392 } |
| 370 | 393 |
| 371 bool URLPattern::MatchesPort(int port) const { | 394 bool URLPattern::MatchesPort(int port) const { |
| 372 if (port == url_parse::PORT_INVALID) | 395 if (port == url_parse::PORT_INVALID) |
| 373 return false; | 396 return false; |
| 374 | 397 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 426 return false; | 449 return false; |
| 427 | 450 |
| 428 // We currently only use OverlapsWith() for the patterns inside | 451 // We currently only use OverlapsWith() for the patterns inside |
| 429 // URLPatternSet. In those cases, we know that the path will have only a | 452 // URLPatternSet. In those cases, we know that the path will have only a |
| 430 // single wildcard at the end. This makes figuring out overlap much easier. It | 453 // single wildcard at the end. This makes figuring out overlap much easier. It |
| 431 // seems like there is probably a computer-sciency way to solve the general | 454 // seems like there is probably a computer-sciency way to solve the general |
| 432 // case, but we don't need that yet. | 455 // case, but we don't need that yet. |
| 433 DCHECK(path_.find('*') == path_.size() - 1); | 456 DCHECK(path_.find('*') == path_.size() - 1); |
| 434 DCHECK(other.path().find('*') == other.path().size() - 1); | 457 DCHECK(other.path().find('*') == other.path().size() - 1); |
| 435 | 458 |
| 436 if (!MatchesPath(other.path().substr(0, other.path().size() - 1)) && | 459 if (partial_filesystem_support_hack_ != |
| 437 !other.MatchesPath(path_.substr(0, path_.size() - 1))) | 460 other.partial_filesystem_support_hack()) |
| 461 return false; | |
| 462 | |
| 463 if (!MatchesPath(other.path().substr(0, other.path().size() - 1), | |
| 464 partial_filesystem_support_hack_) && | |
| 465 !other.MatchesPath(path_.substr(0, path_.size() - 1), | |
| 466 partial_filesystem_support_hack_)) | |
| 438 return false; | 467 return false; |
| 439 | 468 |
| 440 return true; | 469 return true; |
| 441 } | 470 } |
| 442 | 471 |
| 443 bool URLPattern::MatchesAnyScheme( | 472 bool URLPattern::MatchesAnyScheme( |
| 444 const std::vector<std::string>& schemes) const { | 473 const std::vector<std::string>& schemes) const { |
| 445 for (std::vector<std::string>::const_iterator i = schemes.begin(); | 474 for (std::vector<std::string>::const_iterator i = schemes.begin(); |
| 446 i != schemes.end(); ++i) { | 475 i != schemes.end(); ++i) { |
| 447 if (MatchesScheme(*i)) | 476 if (MatchesScheme(*i)) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 492 } | 521 } |
| 493 | 522 |
| 494 return result; | 523 return result; |
| 495 } | 524 } |
| 496 | 525 |
| 497 // static | 526 // static |
| 498 const char* URLPattern::GetParseResultString( | 527 const char* URLPattern::GetParseResultString( |
| 499 URLPattern::ParseResult parse_result) { | 528 URLPattern::ParseResult parse_result) { |
| 500 return kParseResultMessages[parse_result]; | 529 return kParseResultMessages[parse_result]; |
| 501 } | 530 } |
| OLD | NEW |