| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_piece.h" | 7 #include "base/string_piece.h" |
| 8 #include "base/string_split.h" | 8 #include "base/string_split.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "chrome/common/url_constants.h" | 10 #include "chrome/common/url_constants.h" |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 spec += host_; | 304 spec += host_; |
| 305 } | 305 } |
| 306 | 306 |
| 307 if (!path_.empty()) | 307 if (!path_.empty()) |
| 308 spec += path_; | 308 spec += path_; |
| 309 | 309 |
| 310 return spec; | 310 return spec; |
| 311 } | 311 } |
| 312 | 312 |
| 313 bool URLPattern::OverlapsWith(const URLPattern& other) const { | 313 bool URLPattern::OverlapsWith(const URLPattern& other) const { |
| 314 if (!MatchesScheme(other.scheme_) && !other.MatchesScheme(scheme_)) | 314 if (!MatchesAnyScheme(other.GetExplicitSchemes()) && |
| 315 !other.MatchesAnyScheme(GetExplicitSchemes())) { |
| 315 return false; | 316 return false; |
| 317 } |
| 316 | 318 |
| 317 if (!MatchesHost(other.host()) && !other.MatchesHost(host_)) | 319 if (!MatchesHost(other.host()) && !other.MatchesHost(host_)) |
| 318 return false; | 320 return false; |
| 319 | 321 |
| 320 // We currently only use OverlapsWith() for the patterns inside | 322 // We currently only use OverlapsWith() for the patterns inside |
| 321 // ExtensionExtent. In those cases, we know that the path will have only a | 323 // ExtensionExtent. In those cases, we know that the path will have only a |
| 322 // single wildcard at the end. This makes figuring out overlap much easier. It | 324 // single wildcard at the end. This makes figuring out overlap much easier. It |
| 323 // seems like there is probably a computer-sciency way to solve the general | 325 // seems like there is probably a computer-sciency way to solve the general |
| 324 // case, but we don't need that yet. | 326 // case, but we don't need that yet. |
| 325 DCHECK(path_.find('*') == path_.size() - 1); | 327 DCHECK(path_.find('*') == path_.size() - 1); |
| 326 DCHECK(other.path().find('*') == other.path().size() - 1); | 328 DCHECK(other.path().find('*') == other.path().size() - 1); |
| 327 | 329 |
| 328 if (!MatchesPath(other.path().substr(0, other.path().size() - 1)) && | 330 if (!MatchesPath(other.path().substr(0, other.path().size() - 1)) && |
| 329 !other.MatchesPath(path_.substr(0, path_.size() - 1))) | 331 !other.MatchesPath(path_.substr(0, path_.size() - 1))) |
| 330 return false; | 332 return false; |
| 331 | 333 |
| 332 return true; | 334 return true; |
| 333 } | 335 } |
| 334 | 336 |
| 335 std::vector<URLPattern> URLPattern::ConvertToExplicitSchemes() const { | 337 bool URLPattern::MatchesAnyScheme( |
| 336 std::vector<URLPattern> result; | 338 const std::vector<std::string>& schemes) const { |
| 339 for (std::vector<std::string>::const_iterator i = schemes.begin(); |
| 340 i != schemes.end(); ++i) { |
| 341 if (MatchesScheme(*i)) |
| 342 return true; |
| 343 } |
| 344 |
| 345 return false; |
| 346 } |
| 347 |
| 348 std::vector<std::string> URLPattern::GetExplicitSchemes() const { |
| 349 std::vector<std::string> result; |
| 337 | 350 |
| 338 if (scheme_ != "*" && !match_all_urls_ && IsValidScheme(scheme_)) { | 351 if (scheme_ != "*" && !match_all_urls_ && IsValidScheme(scheme_)) { |
| 339 result.push_back(*this); | 352 result.push_back(scheme_); |
| 340 return result; | 353 return result; |
| 341 } | 354 } |
| 342 | 355 |
| 343 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { | 356 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { |
| 344 if (MatchesScheme(kValidSchemes[i])) { | 357 if (MatchesScheme(kValidSchemes[i])) { |
| 345 URLPattern temp = *this; | 358 result.push_back(kValidSchemes[i]); |
| 346 temp.SetScheme(kValidSchemes[i]); | |
| 347 temp.set_match_all_urls(false); | |
| 348 result.push_back(temp); | |
| 349 } | 359 } |
| 350 } | 360 } |
| 351 | 361 |
| 352 return result; | 362 return result; |
| 353 } | 363 } |
| 354 | 364 |
| 365 std::vector<URLPattern> URLPattern::ConvertToExplicitSchemes() const { |
| 366 std::vector<std::string> explicit_schemes = GetExplicitSchemes(); |
| 367 std::vector<URLPattern> result; |
| 368 |
| 369 for (std::vector<std::string>::const_iterator i = explicit_schemes.begin(); |
| 370 i != explicit_schemes.end(); ++i) { |
| 371 URLPattern temp = *this; |
| 372 temp.SetScheme(*i); |
| 373 temp.set_match_all_urls(false); |
| 374 result.push_back(temp); |
| 375 } |
| 376 |
| 377 return result; |
| 378 } |
| 379 |
| 355 // static | 380 // static |
| 356 const char* URLPattern::GetParseResultString( | 381 const char* URLPattern::GetParseResultString( |
| 357 URLPattern::ParseResult parse_result) { | 382 URLPattern::ParseResult parse_result) { |
| 358 return kParseResultMessages[parse_result]; | 383 return kParseResultMessages[parse_result]; |
| 359 } | 384 } |
| OLD | NEW |