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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 int parsed_port = url_parse::PORT_UNSPECIFIED; | 89 int parsed_port = url_parse::PORT_UNSPECIFIED; |
| 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 valid_inner_schemes_(SCHEME_NONE), | |
| 99 match_all_urls_(false), | 100 match_all_urls_(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), |
| 106 valid_inner_schemes_(valid_schemes), | |
| 105 match_all_urls_(false), | 107 match_all_urls_(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), |
| 115 valid_inner_schemes_(valid_schemes), | |
| 113 match_all_urls_(false), | 116 match_all_urls_(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 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 134 SetMatchSubdomains(false); | 137 SetMatchSubdomains(false); |
| 135 SetPort("*"); | 138 SetPort("*"); |
| 136 | 139 |
| 137 // Special case pattern to match every valid URL. | 140 // Special case pattern to match every valid URL. |
| 138 if (pattern == kAllUrlsPattern) { | 141 if (pattern == kAllUrlsPattern) { |
| 139 SetMatchAllURLs(true); | 142 SetMatchAllURLs(true); |
| 140 return PARSE_SUCCESS; | 143 return PARSE_SUCCESS; |
| 141 } | 144 } |
| 142 | 145 |
| 143 // Parse out the scheme. | 146 // Parse out the scheme. |
| 144 size_t scheme_end_pos = pattern.find(chrome::kStandardSchemeSeparator); | 147 size_t scheme_end_pos = pattern.find(':'); |
| 145 bool has_standard_scheme_separator = true; | |
| 146 | |
| 147 // Some urls also use ':' alone as the scheme separator. | |
| 148 if (scheme_end_pos == std::string::npos) { | |
| 149 scheme_end_pos = pattern.find(':'); | |
| 150 has_standard_scheme_separator = false; | |
| 151 } | |
| 152 | |
| 153 if (scheme_end_pos == std::string::npos) | 148 if (scheme_end_pos == std::string::npos) |
| 154 return PARSE_ERROR_MISSING_SCHEME_SEPARATOR; | 149 return PARSE_ERROR_MISSING_SCHEME_SEPARATOR; |
| 155 | 150 |
| 151 bool has_standard_scheme_separator = false; | |
| 152 if (scheme_end_pos + 2 < pattern.length() && | |
| 153 pattern[scheme_end_pos + 1] == '/' && | |
| 154 pattern[scheme_end_pos + 2] == '/') { | |
| 155 has_standard_scheme_separator = true; | |
| 156 } | |
| 157 | |
| 156 if (!SetScheme(pattern.substr(0, scheme_end_pos))) | 158 if (!SetScheme(pattern.substr(0, scheme_end_pos))) |
| 157 return PARSE_ERROR_INVALID_SCHEME; | 159 return PARSE_ERROR_INVALID_SCHEME; |
| 158 | 160 |
| 159 bool standard_scheme = IsStandardScheme(scheme_); | 161 bool standard_scheme = IsStandardScheme(scheme_); |
| 162 | |
| 163 if (scheme_ == chrome::kFileSystemScheme) { | |
|
Aaron Boodman
2012/03/12 23:17:13
Yeah, would prefer this was something like if (Sup
ericu
2012/03/13 21:58:47
Done.
| |
| 164 size_t inner_scheme_start_pos = scheme_end_pos + 1; | |
| 165 scheme_end_pos = pattern.find(chrome::kStandardSchemeSeparator, | |
| 166 inner_scheme_start_pos); | |
| 167 if (scheme_end_pos == std::string::npos) | |
| 168 return PARSE_ERROR_MISSING_SCHEME_SEPARATOR; | |
| 169 has_standard_scheme_separator = true; | |
| 170 if (!SetInnerScheme( | |
| 171 pattern.substr(inner_scheme_start_pos, | |
| 172 scheme_end_pos - inner_scheme_start_pos))) | |
| 173 return PARSE_ERROR_INVALID_SCHEME; | |
|
Aaron Boodman
2012/03/12 23:17:13
PARSE_ERROR_INVALID_INNER_SCHEME seems better here
ericu
2012/03/13 21:58:47
Done.
| |
| 174 standard_scheme = IsStandardScheme(inner_scheme_); | |
| 175 } | |
| 176 | |
| 160 if (standard_scheme != has_standard_scheme_separator) | 177 if (standard_scheme != has_standard_scheme_separator) |
|
Aaron Boodman
2012/03/12 23:17:13
I still think this method has gotten too long and
ericu
2012/03/13 21:58:47
Done.
| |
| 161 return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; | 178 return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; |
| 162 | 179 |
| 163 // Advance past the scheme separator. | 180 // Advance past the scheme separator. |
| 164 scheme_end_pos += | 181 scheme_end_pos += |
| 165 (standard_scheme ? strlen(chrome::kStandardSchemeSeparator) : 1); | 182 (has_standard_scheme_separator ? |
| 183 strlen(chrome::kStandardSchemeSeparator) : 1); | |
| 166 if (scheme_end_pos >= pattern.size()) | 184 if (scheme_end_pos >= pattern.size()) |
| 167 return PARSE_ERROR_EMPTY_HOST; | 185 return PARSE_ERROR_EMPTY_HOST; |
| 168 | 186 |
| 169 // Parse out the host and path. | 187 // Parse out the host and path. |
| 170 size_t host_start_pos = scheme_end_pos; | 188 size_t host_start_pos = scheme_end_pos; |
| 171 size_t path_start_pos = 0; | 189 size_t path_start_pos = 0; |
| 172 | 190 |
| 173 if (!standard_scheme) { | 191 if (!standard_scheme) { |
| 174 path_start_pos = host_start_pos; | 192 path_start_pos = host_start_pos; |
| 175 } else if (scheme_ == chrome::kFileScheme) { | 193 } else if (scheme_ == chrome::kFileScheme) { |
| 176 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); | 194 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); |
| 177 if (host_end_pos == std::string::npos) { | 195 if (host_end_pos == std::string::npos) { |
| 178 // Allow hostname omission. | 196 // Allow hostname omission. |
| 179 // e.g. file://* is interpreted as file:///*, | 197 // e.g. file://* is interpreted as file:///*, |
| 180 // file://foo* is interpreted as file:///foo*. | 198 // file://foo* is interpreted as file:///foo*. |
| 181 path_start_pos = host_start_pos - 1; | 199 path_start_pos = host_start_pos - 1; |
| 182 } else { | 200 } else { |
| 183 // Ignore hostname if scheme is file://. | 201 // Ignore hostname if scheme is file://. |
| 184 // e.g. file://localhost/foo is equal to file:///foo. | 202 // e.g. file://localhost/foo is equal to file:///foo. |
| 185 path_start_pos = host_end_pos; | 203 path_start_pos = host_end_pos; |
| 186 } | 204 } |
| 205 } else if (scheme_ == chrome::kFileSystemScheme && | |
| 206 inner_scheme_ == chrome::kFileScheme) { | |
| 207 // We can't distinguish between a host and a storage type in a | |
| 208 // filesystem:file URL, so just let it be part of the path. | |
| 209 path_start_pos = host_start_pos; | |
| 187 } else { | 210 } else { |
| 188 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); | 211 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); |
| 189 | 212 |
| 190 // Host is required. | 213 // Host is required. |
| 191 if (host_start_pos == host_end_pos) | 214 if (host_start_pos == host_end_pos) |
| 192 return PARSE_ERROR_EMPTY_HOST; | 215 return PARSE_ERROR_EMPTY_HOST; |
| 193 | 216 |
| 194 if (host_end_pos == std::string::npos) | 217 if (host_end_pos == std::string::npos) |
| 195 return PARSE_ERROR_EMPTY_PATH; | 218 return PARSE_ERROR_EMPTY_PATH; |
| 196 | 219 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 223 // think '*' works as a glob in the host. | 246 // think '*' works as a glob in the host. |
| 224 if (host_.find('*') != std::string::npos) | 247 if (host_.find('*') != std::string::npos) |
| 225 return PARSE_ERROR_INVALID_HOST_WILDCARD; | 248 return PARSE_ERROR_INVALID_HOST_WILDCARD; |
| 226 | 249 |
| 227 return PARSE_SUCCESS; | 250 return PARSE_SUCCESS; |
| 228 } | 251 } |
| 229 | 252 |
| 230 void URLPattern::SetValidSchemes(int valid_schemes) { | 253 void URLPattern::SetValidSchemes(int valid_schemes) { |
| 231 spec_.clear(); | 254 spec_.clear(); |
| 232 valid_schemes_ = valid_schemes; | 255 valid_schemes_ = valid_schemes; |
| 256 valid_inner_schemes_ = valid_schemes; | |
| 257 } | |
| 258 | |
| 259 void URLPattern::SetValidInnerSchemes(int valid_schemes) { | |
| 260 spec_.clear(); | |
| 261 valid_inner_schemes_ = valid_schemes; | |
| 233 } | 262 } |
| 234 | 263 |
| 235 void URLPattern::SetHost(const std::string& host) { | 264 void URLPattern::SetHost(const std::string& host) { |
| 236 spec_.clear(); | 265 spec_.clear(); |
| 237 host_ = host; | 266 host_ = host; |
| 238 } | 267 } |
| 239 | 268 |
| 240 void URLPattern::SetMatchAllURLs(bool val) { | 269 void URLPattern::SetMatchAllURLs(bool val) { |
| 241 spec_.clear(); | 270 spec_.clear(); |
| 242 match_all_urls_ = val; | 271 match_all_urls_ = val; |
| 243 | 272 |
| 244 if (val) { | 273 if (val) { |
| 245 match_subdomains_ = true; | 274 match_subdomains_ = true; |
| 246 scheme_ = "*"; | 275 scheme_ = "*"; |
| 247 host_.clear(); | 276 host_.clear(); |
| 248 SetPath("/*"); | 277 SetPath("/*"); |
| 249 } | 278 } |
| 250 } | 279 } |
| 251 | 280 |
| 252 void URLPattern::SetMatchSubdomains(bool val) { | 281 void URLPattern::SetMatchSubdomains(bool val) { |
| 253 spec_.clear(); | 282 spec_.clear(); |
| 254 match_subdomains_ = val; | 283 match_subdomains_ = val; |
| 255 } | 284 } |
| 256 | 285 |
| 257 bool URLPattern::SetScheme(const std::string& scheme) { | 286 bool URLPattern::SetScheme(const std::string& scheme) { |
| 258 spec_.clear(); | 287 spec_.clear(); |
| 259 scheme_ = scheme; | 288 inner_scheme_.clear(); |
| 260 if (scheme_ == "*") { | 289 if (scheme == "*") { |
| 261 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); | 290 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); |
| 262 } else if (!IsValidScheme(scheme_)) { | 291 } else if (!IsValidScheme(scheme)) { |
| 263 return false; | 292 return false; |
| 264 } | 293 } |
| 294 scheme_ = scheme; | |
| 265 return true; | 295 return true; |
| 266 } | 296 } |
| 267 | 297 |
| 298 bool URLPattern::SetInnerScheme(const std::string& inner_scheme) { | |
| 299 spec_.clear(); | |
| 300 DCHECK(scheme_ == chrome::kFileSystemScheme); | |
| 301 if (inner_scheme == "*") { | |
| 302 valid_inner_schemes_ = SCHEME_HTTP | SCHEME_HTTPS | SCHEME_FTP | | |
|
Aaron Boodman
2012/03/12 23:17:13
I am not sure why SetScheme modifies the valid sch
Aaron Boodman
2012/03/12 23:17:13
Why this particular interpretation of "*"? Note th
ericu
2012/03/13 21:58:47
I implemented it based on the comment in url_patte
ericu
2012/03/13 21:58:47
I'm OK with changing the behavior--there aren't al
| |
| 303 SCHEME_EXTENSION; // Exclude file: and chrome:. | |
| 304 } else if (!IsValidInnerScheme(inner_scheme)) { | |
| 305 return false; | |
| 306 } | |
| 307 inner_scheme_ = inner_scheme; | |
| 308 return true; | |
| 309 } | |
| 310 | |
| 268 bool URLPattern::IsValidScheme(const std::string& scheme) const { | 311 bool URLPattern::IsValidScheme(const std::string& scheme) const { |
| 269 if (valid_schemes_ == SCHEME_ALL) | 312 if (valid_schemes_ == SCHEME_ALL) |
| 270 return true; | 313 return true; |
| 271 | 314 |
| 272 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { | 315 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { |
| 273 if (scheme == kValidSchemes[i] && (valid_schemes_ & kValidSchemeMasks[i])) | 316 if (scheme == kValidSchemes[i] && (valid_schemes_ & kValidSchemeMasks[i])) |
| 274 return true; | 317 return true; |
| 275 } | 318 } |
| 276 | 319 |
| 277 return false; | 320 return false; |
| 278 } | 321 } |
| 279 | 322 |
| 323 bool URLPattern::IsValidInnerScheme(const std::string& scheme) const { | |
| 324 // kFileSystemScheme is never a valid inner scheme, even if using SCHEME_ALL. | |
| 325 if (scheme == chrome::kFileSystemScheme) | |
| 326 return false; | |
| 327 | |
| 328 if (valid_inner_schemes_ == SCHEME_ALL) | |
| 329 return true; | |
| 330 | |
| 331 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { | |
| 332 if (scheme == kValidSchemes[i] && | |
| 333 (valid_inner_schemes_ & kValidSchemeMasks[i])) | |
| 334 return true; | |
| 335 } | |
| 336 | |
| 337 return false; | |
| 338 } | |
| 339 | |
| 280 void URLPattern::SetPath(const std::string& path) { | 340 void URLPattern::SetPath(const std::string& path) { |
| 281 spec_.clear(); | 341 spec_.clear(); |
| 282 path_ = path; | 342 path_ = path; |
| 283 path_escaped_ = path_; | 343 path_escaped_ = path_; |
| 284 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "\\", "\\\\"); | 344 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "\\", "\\\\"); |
| 285 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "?", "\\?"); | 345 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "?", "\\?"); |
| 286 } | 346 } |
| 287 | 347 |
| 288 bool URLPattern::SetPort(const std::string& port) { | 348 bool URLPattern::SetPort(const std::string& port) { |
| 289 spec_.clear(); | 349 spec_.clear(); |
| 290 if (IsValidPortForScheme(scheme_, port)) { | 350 std::string scheme = |
| 351 (scheme_ == chrome::kFileSystemScheme) ? inner_scheme_ : scheme_; | |
| 352 if (IsValidPortForScheme(scheme, port)) { | |
| 291 port_ = port; | 353 port_ = port; |
| 292 return true; | 354 return true; |
| 293 } | 355 } |
| 294 return false; | 356 return false; |
| 295 } | 357 } |
| 296 | 358 |
| 297 bool URLPattern::MatchesURL(const GURL& test) const { | 359 bool URLPattern::MatchesURL(const GURL& test) const { |
| 298 if (!MatchesScheme(test.scheme())) | 360 if (!MatchesScheme(test.scheme())) |
| 299 return false; | 361 return false; |
| 300 | 362 |
| 301 if (match_all_urls_) | 363 if (match_all_urls_) |
| 302 return true; | 364 return true; |
| 303 | 365 |
| 304 return MatchesSecurityOriginHelper(test) && | 366 DCHECK(!test.SchemeIsFileSystem() || test.inner_url()); |
| 305 MatchesPath(test.PathForRequest()); | 367 if (scheme_ == chrome::kFileSystemScheme && |
| 368 (!test.SchemeIsFileSystem() || | |
| 369 !MatchesInnerScheme(test.inner_url()->scheme()))) | |
|
Aaron Boodman
2012/03/12 23:17:13
Style guide requires curly braces here.
ericu
2012/03/13 21:58:47
Done.
| |
| 370 return false; | |
| 371 | |
| 372 std::string path = test.PathForRequest(); | |
| 373 | |
| 374 // Filesystem URLs have the first path segment on the inner_url. | |
| 375 if (test.SchemeIsFileSystem()) | |
| 376 path = test.inner_url()->path() + path; | |
| 377 | |
| 378 return MatchesSecurityOriginHelper(test) && MatchesPath(path); | |
| 306 } | 379 } |
| 307 | 380 |
| 308 bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { | 381 bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { |
| 309 if (!MatchesScheme(test.scheme())) | 382 if (!MatchesScheme(test.scheme())) |
| 310 return false; | 383 return false; |
| 311 | 384 |
| 312 if (match_all_urls_) | 385 if (match_all_urls_) |
| 313 return true; | 386 return true; |
| 314 | 387 |
| 315 return MatchesSecurityOriginHelper(test); | 388 return MatchesSecurityOriginHelper(test); |
| 316 } | 389 } |
| 317 | 390 |
| 318 bool URLPattern::MatchesScheme(const std::string& test) const { | 391 bool URLPattern::MatchesScheme(const std::string& test) const { |
| 319 if (!IsValidScheme(test)) | 392 if (!IsValidScheme(test)) |
| 320 return false; | 393 return false; |
| 321 | 394 |
| 322 return scheme_ == "*" || test == scheme_; | 395 return scheme_ == "*" || test == scheme_; |
| 323 } | 396 } |
| 324 | 397 |
| 398 bool URLPattern::MatchesInnerScheme(const std::string& test) const { | |
| 399 DCHECK(scheme_ == chrome::kFileSystemScheme); | |
| 400 if (!IsValidInnerScheme(test)) | |
| 401 return false; | |
| 402 | |
| 403 return inner_scheme_ == "*" || test == inner_scheme_; | |
| 404 } | |
| 405 | |
| 325 bool URLPattern::MatchesHost(const std::string& host) const { | 406 bool URLPattern::MatchesHost(const std::string& host) const { |
| 326 std::string test(chrome::kHttpScheme); | 407 std::string test(chrome::kHttpScheme); |
| 327 test += chrome::kStandardSchemeSeparator; | 408 test += chrome::kStandardSchemeSeparator; |
| 328 test += host; | 409 test += host; |
| 329 test += "/"; | 410 test += "/"; |
| 330 return MatchesHost(GURL(test)); | 411 return MatchesHost(GURL(test)); |
| 331 } | 412 } |
| 332 | 413 |
| 333 bool URLPattern::MatchesHost(const GURL& test) const { | 414 bool URLPattern::MatchesHost(const GURL& test) const { |
| 334 // If the hosts are exactly equal, we have a match. | 415 // If the hosts are exactly equal, we have a match. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 378 | 459 |
| 379 const std::string& URLPattern::GetAsString() const { | 460 const std::string& URLPattern::GetAsString() const { |
| 380 if (!spec_.empty()) | 461 if (!spec_.empty()) |
| 381 return spec_; | 462 return spec_; |
| 382 | 463 |
| 383 if (match_all_urls_) { | 464 if (match_all_urls_) { |
| 384 spec_ = kAllUrlsPattern; | 465 spec_ = kAllUrlsPattern; |
| 385 return spec_; | 466 return spec_; |
| 386 } | 467 } |
| 387 | 468 |
| 388 bool standard_scheme = IsStandardScheme(scheme_); | 469 bool standard_scheme = IsStandardScheme(scheme_); |
|
Aaron Boodman
2012/03/12 23:17:13
Can you rename this to 'is_standard_scheme' while
ericu
2012/03/13 21:58:47
Done.
| |
| 389 | 470 |
| 390 std::string spec = scheme_ + | 471 std::string spec = scheme_; |
| 391 (standard_scheme ? chrome::kStandardSchemeSeparator : ":"); | 472 std::string scheme = scheme_; |
| 473 bool add_standard_separator = standard_scheme; | |
| 474 if (scheme_ == chrome::kFileSystemScheme) { | |
| 475 spec += ":" + inner_scheme_; | |
| 476 add_standard_separator = true; | |
| 477 standard_scheme = IsStandardScheme(inner_scheme_); | |
| 478 scheme = inner_scheme_; | |
| 479 } | |
| 480 spec += (add_standard_separator ? chrome::kStandardSchemeSeparator : ":"); | |
| 392 | 481 |
| 393 if (scheme_ != chrome::kFileScheme && standard_scheme) { | 482 if (scheme != chrome::kFileScheme && standard_scheme) { |
| 394 if (match_subdomains_) { | 483 if (match_subdomains_) { |
| 395 spec += "*"; | 484 spec += "*"; |
| 396 if (!host_.empty()) | 485 if (!host_.empty()) |
| 397 spec += "."; | 486 spec += "."; |
| 398 } | 487 } |
| 399 | 488 |
| 400 if (!host_.empty()) | 489 if (!host_.empty()) |
| 401 spec += host_; | 490 spec += host_; |
| 402 | 491 |
| 403 if (port_ != "*") { | 492 if (port_ != "*") { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 445 for (std::vector<std::string>::const_iterator i = schemes.begin(); | 534 for (std::vector<std::string>::const_iterator i = schemes.begin(); |
| 446 i != schemes.end(); ++i) { | 535 i != schemes.end(); ++i) { |
| 447 if (MatchesScheme(*i)) | 536 if (MatchesScheme(*i)) |
| 448 return true; | 537 return true; |
| 449 } | 538 } |
| 450 | 539 |
| 451 return false; | 540 return false; |
| 452 } | 541 } |
| 453 | 542 |
| 454 bool URLPattern::MatchesSecurityOriginHelper(const GURL& test) const { | 543 bool URLPattern::MatchesSecurityOriginHelper(const GURL& test) const { |
| 455 // Ignore hostname if scheme is file://. | 544 // Ignore hostname if scheme is file:// or filesystem:file://. |
| 456 if (scheme_ != chrome::kFileScheme && !MatchesHost(test)) | 545 std::string scheme = scheme_; |
| 546 const GURL* test_url = &test; | |
| 547 if (scheme == chrome::kFileSystemScheme) { | |
| 548 scheme = inner_scheme_; | |
| 549 test_url = test.inner_url(); | |
| 550 DCHECK(test_url); | |
| 551 } | |
| 552 if (scheme != chrome::kFileScheme && !MatchesHost(*test_url)) | |
| 457 return false; | 553 return false; |
| 458 | 554 |
| 459 if (!MatchesPort(test.EffectiveIntPort())) | 555 if (!MatchesPort(test_url->EffectiveIntPort())) |
| 460 return false; | 556 return false; |
| 461 | 557 |
| 462 return true; | 558 return true; |
| 463 } | 559 } |
| 464 | 560 |
| 465 std::vector<std::string> URLPattern::GetExplicitSchemes() const { | 561 std::vector<std::string> URLPattern::GetExplicitSchemes() const { |
| 466 std::vector<std::string> result; | 562 std::vector<std::string> result; |
| 467 | 563 |
| 468 if (scheme_ != "*" && !match_all_urls_ && IsValidScheme(scheme_)) { | 564 if (scheme_ != "*" && !match_all_urls_ && IsValidScheme(scheme_)) { |
| 469 result.push_back(scheme_); | 565 result.push_back(scheme_); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 492 } | 588 } |
| 493 | 589 |
| 494 return result; | 590 return result; |
| 495 } | 591 } |
| 496 | 592 |
| 497 // static | 593 // static |
| 498 const char* URLPattern::GetParseResultString( | 594 const char* URLPattern::GetParseResultString( |
| 499 URLPattern::ParseResult parse_result) { | 595 URLPattern::ParseResult parse_result) { |
| 500 return kParseResultMessages[parse_result]; | 596 return kParseResultMessages[parse_result]; |
| 501 } | 597 } |
| OLD | NEW |