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 standard_scheme_end_pos = |
145 bool has_standard_scheme_separator = true; | 148 pattern.find(chrome::kStandardSchemeSeparator); |
149 bool has_standard_scheme_separator = | |
150 (standard_scheme_end_pos != std::string::npos); | |
146 | 151 |
147 // Some urls also use ':' alone as the scheme separator. | 152 // Some urls also use ':' alone as the scheme separator. |
148 if (scheme_end_pos == std::string::npos) { | 153 size_t simple_scheme_end_pos = pattern.find(':'); |
149 scheme_end_pos = pattern.find(':'); | 154 bool has_simple_scheme_separator = |
150 has_standard_scheme_separator = false; | 155 (simple_scheme_end_pos != std::string::npos) && |
151 } | 156 (!has_standard_scheme_separator || |
157 simple_scheme_end_pos < standard_scheme_end_pos); | |
152 | 158 |
153 if (scheme_end_pos == std::string::npos) | 159 size_t scheme_end_pos; |
Aaron Boodman
2012/02/15 21:31:18
Please always initialize primitives. I wish we had
Aaron Boodman
2012/02/15 21:31:18
So is it true at this point that has_simple_scheme
ericu
2012/02/16 01:42:56
Done.
ericu
2012/02/16 01:42:56
No. It used to be true, but now we have "filesyst
| |
160 | |
161 if (has_simple_scheme_separator) | |
162 scheme_end_pos = simple_scheme_end_pos; | |
163 else if (has_standard_scheme_separator) | |
164 scheme_end_pos = standard_scheme_end_pos; | |
165 else | |
154 return PARSE_ERROR_MISSING_SCHEME_SEPARATOR; | 166 return PARSE_ERROR_MISSING_SCHEME_SEPARATOR; |
155 | 167 |
156 if (!SetScheme(pattern.substr(0, scheme_end_pos))) | 168 if (!SetScheme(pattern.substr(0, scheme_end_pos))) |
Aaron Boodman
2012/02/15 21:31:18
Would it be simpler to restructure parsing the sch
ericu
2012/02/16 01:42:56
Thanks for the suggestion; I think it's a lot clea
| |
157 return PARSE_ERROR_INVALID_SCHEME; | 169 return PARSE_ERROR_INVALID_SCHEME; |
158 | 170 |
171 if (!has_simple_scheme_separator && has_standard_scheme_separator && | |
Aaron Boodman
2012/02/15 21:31:18
This method is getting pretty hairy. Is it possibl
ericu
2012/02/16 01:42:56
Do you still think it's necessary after the rewrit
| |
172 scheme_ == chrome::kFileSystemScheme) | |
173 return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; | |
174 | |
175 if (has_simple_scheme_separator && has_standard_scheme_separator) { | |
176 if (scheme_ != chrome::kFileSystemScheme) | |
177 return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; | |
178 if (!SetInnerScheme( | |
179 pattern.substr(simple_scheme_end_pos + 1, | |
180 standard_scheme_end_pos - simple_scheme_end_pos - 1))) | |
181 return PARSE_ERROR_INVALID_SCHEME; | |
182 scheme_end_pos = standard_scheme_end_pos; | |
183 } | |
184 | |
159 bool standard_scheme = IsStandardScheme(scheme_); | 185 bool standard_scheme = IsStandardScheme(scheme_); |
160 if (standard_scheme != has_standard_scheme_separator) | 186 if (standard_scheme != has_standard_scheme_separator) |
161 return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; | 187 return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; |
162 | 188 |
163 // Advance past the scheme separator. | 189 // Advance past the scheme separator. |
164 scheme_end_pos += | 190 scheme_end_pos += |
165 (standard_scheme ? strlen(chrome::kStandardSchemeSeparator) : 1); | 191 (has_standard_scheme_separator ? |
192 strlen(chrome::kStandardSchemeSeparator) : 1); | |
166 if (scheme_end_pos >= pattern.size()) | 193 if (scheme_end_pos >= pattern.size()) |
167 return PARSE_ERROR_EMPTY_HOST; | 194 return PARSE_ERROR_EMPTY_HOST; |
168 | 195 |
169 // Parse out the host and path. | 196 // Parse out the host and path. |
170 size_t host_start_pos = scheme_end_pos; | 197 size_t host_start_pos = scheme_end_pos; |
171 size_t path_start_pos = 0; | 198 size_t path_start_pos = 0; |
172 | 199 |
173 if (!standard_scheme) { | 200 if (!standard_scheme) { |
174 path_start_pos = host_start_pos; | 201 path_start_pos = host_start_pos; |
175 } else if (scheme_ == chrome::kFileScheme) { | 202 } else if (scheme_ == chrome::kFileScheme) { |
176 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); | 203 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); |
177 if (host_end_pos == std::string::npos) { | 204 if (host_end_pos == std::string::npos) { |
178 // Allow hostname omission. | 205 // Allow hostname omission. |
179 // e.g. file://* is interpreted as file:///*, | 206 // e.g. file://* is interpreted as file:///*, |
180 // file://foo* is interpreted as file:///foo*. | 207 // file://foo* is interpreted as file:///foo*. |
181 path_start_pos = host_start_pos - 1; | 208 path_start_pos = host_start_pos - 1; |
182 } else { | 209 } else { |
183 // Ignore hostname if scheme is file://. | 210 // Ignore hostname if scheme is file://. |
184 // e.g. file://localhost/foo is equal to file:///foo. | 211 // e.g. file://localhost/foo is equal to file:///foo. |
185 path_start_pos = host_end_pos; | 212 path_start_pos = host_end_pos; |
186 } | 213 } |
214 } else if (scheme_ == chrome::kFileSystemScheme && | |
215 inner_scheme_ == chrome::kFileScheme) { | |
216 // We can't distinguish between a host and a storage type in a | |
217 // filesystem:file URL, so just let it be part of the path. | |
218 path_start_pos = host_start_pos; | |
187 } else { | 219 } else { |
188 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); | 220 size_t host_end_pos = pattern.find(kPathSeparator, host_start_pos); |
189 | 221 |
190 // Host is required. | 222 // Host is required. |
191 if (host_start_pos == host_end_pos) | 223 if (host_start_pos == host_end_pos) |
192 return PARSE_ERROR_EMPTY_HOST; | 224 return PARSE_ERROR_EMPTY_HOST; |
193 | 225 |
194 if (host_end_pos == std::string::npos) | 226 if (host_end_pos == std::string::npos) |
195 return PARSE_ERROR_EMPTY_PATH; | 227 return PARSE_ERROR_EMPTY_PATH; |
196 | 228 |
(...skipping 26 matching lines...) Expand all Loading... | |
223 // think '*' works as a glob in the host. | 255 // think '*' works as a glob in the host. |
224 if (host_.find('*') != std::string::npos) | 256 if (host_.find('*') != std::string::npos) |
225 return PARSE_ERROR_INVALID_HOST_WILDCARD; | 257 return PARSE_ERROR_INVALID_HOST_WILDCARD; |
226 | 258 |
227 return PARSE_SUCCESS; | 259 return PARSE_SUCCESS; |
228 } | 260 } |
229 | 261 |
230 void URLPattern::SetValidSchemes(int valid_schemes) { | 262 void URLPattern::SetValidSchemes(int valid_schemes) { |
231 spec_.clear(); | 263 spec_.clear(); |
232 valid_schemes_ = valid_schemes; | 264 valid_schemes_ = valid_schemes; |
265 valid_inner_schemes_ = valid_schemes; | |
266 } | |
267 | |
268 void URLPattern::SetValidInnerSchemes(int valid_schemes) { | |
269 spec_.clear(); | |
270 valid_inner_schemes_ = valid_schemes; | |
233 } | 271 } |
234 | 272 |
235 void URLPattern::SetHost(const std::string& host) { | 273 void URLPattern::SetHost(const std::string& host) { |
236 spec_.clear(); | 274 spec_.clear(); |
237 host_ = host; | 275 host_ = host; |
238 } | 276 } |
239 | 277 |
240 void URLPattern::SetMatchAllURLs(bool val) { | 278 void URLPattern::SetMatchAllURLs(bool val) { |
241 spec_.clear(); | 279 spec_.clear(); |
242 match_all_urls_ = val; | 280 match_all_urls_ = val; |
243 | 281 |
244 if (val) { | 282 if (val) { |
245 match_subdomains_ = true; | 283 match_subdomains_ = true; |
246 scheme_ = "*"; | 284 scheme_ = "*"; |
247 host_.clear(); | 285 host_.clear(); |
248 SetPath("/*"); | 286 SetPath("/*"); |
249 } | 287 } |
250 } | 288 } |
251 | 289 |
252 void URLPattern::SetMatchSubdomains(bool val) { | 290 void URLPattern::SetMatchSubdomains(bool val) { |
253 spec_.clear(); | 291 spec_.clear(); |
254 match_subdomains_ = val; | 292 match_subdomains_ = val; |
255 } | 293 } |
256 | 294 |
257 bool URLPattern::SetScheme(const std::string& scheme) { | 295 bool URLPattern::SetScheme(const std::string& scheme) { |
258 spec_.clear(); | 296 spec_.clear(); |
259 scheme_ = scheme; | 297 inner_scheme_.clear(); |
260 if (scheme_ == "*") { | 298 if (scheme == "*") { |
261 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); | 299 valid_schemes_ &= (SCHEME_HTTP | SCHEME_HTTPS); |
262 } else if (!IsValidScheme(scheme_)) { | 300 } else if (!IsValidScheme(scheme)) { |
263 return false; | 301 return false; |
264 } | 302 } |
303 scheme_ = scheme; | |
265 return true; | 304 return true; |
266 } | 305 } |
267 | 306 |
307 bool URLPattern::SetInnerScheme(const std::string& scheme) { | |
Aaron Boodman
2012/02/15 21:31:18
It would be more clear to name this param "inner_s
ericu
2012/02/16 01:42:56
Done.
| |
308 spec_.clear(); | |
309 DCHECK(scheme_ == chrome::kFileSystemScheme); | |
310 if (scheme == "*") { | |
311 valid_inner_schemes_ = SCHEME_HTTP | SCHEME_HTTPS | SCHEME_FTP | | |
Aaron Boodman
2012/02/15 21:31:18
This looks weird. In your travels, did you come to
ericu
2012/02/16 01:42:56
It only does so if you're putting in a wildcard.
| |
312 SCHEME_EXTENSION; // Exclude file: and chrome:. | |
313 } else if (!IsValidInnerScheme(scheme)) { | |
314 return false; | |
315 } | |
316 inner_scheme_ = scheme; | |
317 return true; | |
318 } | |
319 | |
268 bool URLPattern::IsValidScheme(const std::string& scheme) const { | 320 bool URLPattern::IsValidScheme(const std::string& scheme) const { |
269 if (valid_schemes_ == SCHEME_ALL) | 321 if (valid_schemes_ == SCHEME_ALL) |
270 return true; | 322 return true; |
271 | 323 |
272 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { | 324 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { |
273 if (scheme == kValidSchemes[i] && (valid_schemes_ & kValidSchemeMasks[i])) | 325 if (scheme == kValidSchemes[i] && (valid_schemes_ & kValidSchemeMasks[i])) |
274 return true; | 326 return true; |
275 } | 327 } |
276 | 328 |
277 return false; | 329 return false; |
278 } | 330 } |
279 | 331 |
332 bool URLPattern::IsValidInnerScheme(const std::string& scheme) const { | |
333 // kFileSystemScheme is never a valid inner scheme, even if using SCHEME_ALL. | |
334 if (scheme == chrome::kFileSystemScheme) | |
335 return false; | |
336 | |
337 if (valid_inner_schemes_ == SCHEME_ALL) | |
338 return true; | |
339 | |
340 for (size_t i = 0; i < arraysize(kValidSchemes); ++i) { | |
341 if (scheme == kValidSchemes[i] && | |
342 (valid_inner_schemes_ & kValidSchemeMasks[i])) | |
343 return true; | |
344 } | |
345 | |
346 return false; | |
347 } | |
348 | |
280 void URLPattern::SetPath(const std::string& path) { | 349 void URLPattern::SetPath(const std::string& path) { |
281 spec_.clear(); | 350 spec_.clear(); |
282 path_ = path; | 351 path_ = path; |
283 path_escaped_ = path_; | 352 path_escaped_ = path_; |
284 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "\\", "\\\\"); | 353 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "\\", "\\\\"); |
285 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "?", "\\?"); | 354 ReplaceSubstringsAfterOffset(&path_escaped_, 0, "?", "\\?"); |
286 } | 355 } |
287 | 356 |
288 bool URLPattern::SetPort(const std::string& port) { | 357 bool URLPattern::SetPort(const std::string& port) { |
289 spec_.clear(); | 358 spec_.clear(); |
290 if (IsValidPortForScheme(scheme_, port)) { | 359 std::string scheme = scheme_; |
Aaron Boodman
2012/02/15 21:31:18
More clear to use a ternary operator here?
ericu
2012/02/16 01:42:56
Done.
| |
360 if (scheme == chrome::kFileSystemScheme) | |
361 scheme = inner_scheme_; | |
362 if (IsValidPortForScheme(scheme, port)) { | |
291 port_ = port; | 363 port_ = port; |
292 return true; | 364 return true; |
293 } | 365 } |
294 return false; | 366 return false; |
295 } | 367 } |
296 | 368 |
297 bool URLPattern::MatchesURL(const GURL& test) const { | 369 bool URLPattern::MatchesURL(const GURL& test) const { |
298 if (!MatchesScheme(test.scheme())) | 370 if (!MatchesScheme(test.scheme())) |
299 return false; | 371 return false; |
300 | 372 |
301 if (match_all_urls_) | 373 if (match_all_urls_) |
302 return true; | 374 return true; |
303 | 375 |
304 return MatchesSecurityOriginHelper(test) && | 376 DCHECK(!test.SchemeIsFileSystem() || test.inner_url()); |
305 MatchesPath(test.PathForRequest()); | 377 if (scheme_ == chrome::kFileSystemScheme && |
378 (!test.SchemeIsFileSystem() || | |
379 !MatchesInnerScheme(test.inner_url()->scheme()))) | |
380 return false; | |
381 | |
382 std::string path = test.PathForRequest(); | |
383 | |
384 // Filesystem URLs have the first path segment on the inner_url. | |
385 if (test.SchemeIsFileSystem()) | |
386 path = test.inner_url()->path() + path; | |
387 | |
388 return MatchesSecurityOriginHelper(test) && MatchesPath(path); | |
306 } | 389 } |
307 | 390 |
308 bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { | 391 bool URLPattern::MatchesSecurityOrigin(const GURL& test) const { |
309 if (!MatchesScheme(test.scheme())) | 392 if (!MatchesScheme(test.scheme())) |
310 return false; | 393 return false; |
311 | 394 |
312 if (match_all_urls_) | 395 if (match_all_urls_) |
313 return true; | 396 return true; |
314 | 397 |
315 return MatchesSecurityOriginHelper(test); | 398 return MatchesSecurityOriginHelper(test); |
316 } | 399 } |
317 | 400 |
318 bool URLPattern::MatchesScheme(const std::string& test) const { | 401 bool URLPattern::MatchesScheme(const std::string& test) const { |
319 if (!IsValidScheme(test)) | 402 if (!IsValidScheme(test)) |
320 return false; | 403 return false; |
321 | 404 |
322 return scheme_ == "*" || test == scheme_; | 405 return scheme_ == "*" || test == scheme_; |
323 } | 406 } |
324 | 407 |
408 bool URLPattern::MatchesInnerScheme(const std::string& test) const { | |
409 DCHECK(scheme_ == chrome::kFileSystemScheme); | |
410 if (!IsValidInnerScheme(test)) | |
411 return false; | |
412 | |
413 return inner_scheme_ == "*" || test == inner_scheme_; | |
414 } | |
415 | |
325 bool URLPattern::MatchesHost(const std::string& host) const { | 416 bool URLPattern::MatchesHost(const std::string& host) const { |
326 std::string test(chrome::kHttpScheme); | 417 std::string test(chrome::kHttpScheme); |
327 test += chrome::kStandardSchemeSeparator; | 418 test += chrome::kStandardSchemeSeparator; |
328 test += host; | 419 test += host; |
329 test += "/"; | 420 test += "/"; |
330 return MatchesHost(GURL(test)); | 421 return MatchesHost(GURL(test)); |
331 } | 422 } |
332 | 423 |
333 bool URLPattern::MatchesHost(const GURL& test) const { | 424 bool URLPattern::MatchesHost(const GURL& test) const { |
334 // If the hosts are exactly equal, we have a match. | 425 // If the hosts are exactly equal, we have a match. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
380 if (!spec_.empty()) | 471 if (!spec_.empty()) |
381 return spec_; | 472 return spec_; |
382 | 473 |
383 if (match_all_urls_) { | 474 if (match_all_urls_) { |
384 spec_ = kAllUrlsPattern; | 475 spec_ = kAllUrlsPattern; |
385 return spec_; | 476 return spec_; |
386 } | 477 } |
387 | 478 |
388 bool standard_scheme = IsStandardScheme(scheme_); | 479 bool standard_scheme = IsStandardScheme(scheme_); |
389 | 480 |
390 std::string spec = scheme_ + | 481 std::string spec = scheme_; |
391 (standard_scheme ? chrome::kStandardSchemeSeparator : ":"); | 482 std::string scheme = scheme_; |
483 bool add_standard_separator = standard_scheme; | |
484 if (scheme_ == chrome::kFileSystemScheme) { | |
485 spec += ":" + inner_scheme_; | |
486 add_standard_separator = true; | |
487 standard_scheme = IsStandardScheme(inner_scheme_); | |
488 scheme = inner_scheme_; | |
489 } | |
490 spec += (add_standard_separator ? chrome::kStandardSchemeSeparator : ":"); | |
392 | 491 |
393 if (scheme_ != chrome::kFileScheme && standard_scheme) { | 492 if (scheme != chrome::kFileScheme && standard_scheme) { |
394 if (match_subdomains_) { | 493 if (match_subdomains_) { |
395 spec += "*"; | 494 spec += "*"; |
396 if (!host_.empty()) | 495 if (!host_.empty()) |
397 spec += "."; | 496 spec += "."; |
398 } | 497 } |
399 | 498 |
400 if (!host_.empty()) | 499 if (!host_.empty()) |
401 spec += host_; | 500 spec += host_; |
402 | 501 |
403 if (port_ != "*") { | 502 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(); | 544 for (std::vector<std::string>::const_iterator i = schemes.begin(); |
446 i != schemes.end(); ++i) { | 545 i != schemes.end(); ++i) { |
447 if (MatchesScheme(*i)) | 546 if (MatchesScheme(*i)) |
448 return true; | 547 return true; |
449 } | 548 } |
450 | 549 |
451 return false; | 550 return false; |
452 } | 551 } |
453 | 552 |
454 bool URLPattern::MatchesSecurityOriginHelper(const GURL& test) const { | 553 bool URLPattern::MatchesSecurityOriginHelper(const GURL& test) const { |
455 // Ignore hostname if scheme is file://. | 554 // Ignore hostname if scheme is file:// or filesystem:file://. |
456 if (scheme_ != chrome::kFileScheme && !MatchesHost(test)) | 555 std::string scheme = scheme_; |
556 const GURL* test_url = &test; | |
557 if (scheme == chrome::kFileSystemScheme) { | |
558 scheme = inner_scheme_; | |
559 test_url = test.inner_url(); | |
560 DCHECK(test_url); | |
561 } | |
562 if (scheme != chrome::kFileScheme && !MatchesHost(*test_url)) | |
457 return false; | 563 return false; |
458 | 564 |
459 if (!MatchesPort(test.EffectiveIntPort())) | 565 if (!MatchesPort(test_url->EffectiveIntPort())) |
460 return false; | 566 return false; |
461 | 567 |
462 return true; | 568 return true; |
463 } | 569 } |
464 | 570 |
465 std::vector<std::string> URLPattern::GetExplicitSchemes() const { | 571 std::vector<std::string> URLPattern::GetExplicitSchemes() const { |
466 std::vector<std::string> result; | 572 std::vector<std::string> result; |
467 | 573 |
468 if (scheme_ != "*" && !match_all_urls_ && IsValidScheme(scheme_)) { | 574 if (scheme_ != "*" && !match_all_urls_ && IsValidScheme(scheme_)) { |
469 result.push_back(scheme_); | 575 result.push_back(scheme_); |
(...skipping 22 matching lines...) Expand all Loading... | |
492 } | 598 } |
493 | 599 |
494 return result; | 600 return result; |
495 } | 601 } |
496 | 602 |
497 // static | 603 // static |
498 const char* URLPattern::GetParseResultString( | 604 const char* URLPattern::GetParseResultString( |
499 URLPattern::ParseResult parse_result) { | 605 URLPattern::ParseResult parse_result) { |
500 return kParseResultMessages[parse_result]; | 606 return kParseResultMessages[parse_result]; |
501 } | 607 } |
OLD | NEW |