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/content_settings_pattern.h" | 5 #include "chrome/common/content_settings_pattern.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/string_split.h" | 10 #include "base/string_split.h" |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 bool validate) { | 308 bool validate) { |
309 return new Builder(validate); | 309 return new Builder(validate); |
310 } | 310 } |
311 | 311 |
312 // static | 312 // static |
313 ContentSettingsPattern ContentSettingsPattern::FromURL( | 313 ContentSettingsPattern ContentSettingsPattern::FromURL( |
314 const GURL& url) { | 314 const GURL& url) { |
315 scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( | 315 scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( |
316 ContentSettingsPattern::CreateBuilder(false)); | 316 ContentSettingsPattern::CreateBuilder(false)); |
317 | 317 |
318 if (url.SchemeIsFile()) { | 318 const GURL* local_url = &url; |
319 builder->WithScheme(url.scheme())->WithPath(url.path()); | 319 if (url.SchemeIsFileSystem() && url.inner_url()) { |
| 320 local_url = url.inner_url(); |
| 321 } |
| 322 if (local_url->SchemeIsFile()) { |
| 323 builder->WithScheme(local_url->scheme())->WithPath(local_url->path()); |
320 } else { | 324 } else { |
321 // Please keep the order of the ifs below as URLs with an IP as host can | 325 // Please keep the order of the ifs below as URLs with an IP as host can |
322 // also have a "http" scheme. | 326 // also have a "http" scheme. |
323 if (url.HostIsIPAddress()) { | 327 if (local_url->HostIsIPAddress()) { |
324 builder->WithScheme(url.scheme())->WithHost(url.host()); | 328 builder->WithScheme(local_url->scheme())->WithHost(local_url->host()); |
325 } else if (url.SchemeIs(chrome::kHttpScheme)) { | 329 } else if (local_url->SchemeIs(chrome::kHttpScheme)) { |
326 builder->WithSchemeWildcard()->WithDomainWildcard()->WithHost(url.host()); | 330 builder->WithSchemeWildcard()->WithDomainWildcard()->WithHost( |
327 } else if (url.SchemeIs(chrome::kHttpsScheme)) { | 331 local_url->host()); |
328 builder->WithScheme(url.scheme())->WithDomainWildcard()->WithHost( | 332 } else if (local_url->SchemeIs(chrome::kHttpsScheme)) { |
329 url.host()); | 333 builder->WithScheme(local_url->scheme())->WithDomainWildcard()->WithHost( |
| 334 local_url->host()); |
330 } else { | 335 } else { |
331 // Unsupported scheme | 336 // Unsupported scheme |
332 } | 337 } |
333 if (url.port().empty()) { | 338 if (local_url->port().empty()) { |
334 if (url.SchemeIs(chrome::kHttpsScheme)) | 339 if (local_url->SchemeIs(chrome::kHttpsScheme)) |
335 builder->WithPort(GetDefaultPort(chrome::kHttpsScheme)); | 340 builder->WithPort(GetDefaultPort(chrome::kHttpsScheme)); |
336 else | 341 else |
337 builder->WithPortWildcard(); | 342 builder->WithPortWildcard(); |
338 } else { | 343 } else { |
339 builder->WithPort(url.port()); | 344 builder->WithPort(local_url->port()); |
340 } | 345 } |
341 } | 346 } |
342 return builder->Build(); | 347 return builder->Build(); |
343 } | 348 } |
344 | 349 |
345 // static | 350 // static |
346 ContentSettingsPattern ContentSettingsPattern::FromURLNoWildcard( | 351 ContentSettingsPattern ContentSettingsPattern::FromURLNoWildcard( |
347 const GURL& url) { | 352 const GURL& url) { |
348 scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( | 353 scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( |
349 ContentSettingsPattern::CreateBuilder(false)); | 354 ContentSettingsPattern::CreateBuilder(false)); |
350 | 355 |
351 if (url.SchemeIsFile()) { | 356 const GURL* local_url = &url; |
352 builder->WithScheme(url.scheme())->WithPath(url.path()); | 357 if (url.SchemeIsFileSystem() && url.inner_url()) { |
| 358 local_url = url.inner_url(); |
| 359 } |
| 360 if (local_url->SchemeIsFile()) { |
| 361 builder->WithScheme(local_url->scheme())->WithPath(local_url->path()); |
353 } else { | 362 } else { |
354 builder->WithScheme(url.scheme())->WithHost(url.host()); | 363 builder->WithScheme(local_url->scheme())->WithHost(local_url->host()); |
355 if (url.port().empty()) { | 364 if (local_url->port().empty()) { |
356 builder->WithPort(GetDefaultPort(url.scheme())); | 365 builder->WithPort(GetDefaultPort(local_url->scheme())); |
357 } else { | 366 } else { |
358 builder->WithPort(url.port()); | 367 builder->WithPort(local_url->port()); |
359 } | 368 } |
360 } | 369 } |
361 return builder->Build(); | 370 return builder->Build(); |
362 } | 371 } |
363 | 372 |
364 // static | 373 // static |
365 ContentSettingsPattern ContentSettingsPattern::FromString( | 374 ContentSettingsPattern ContentSettingsPattern::FromString( |
366 const std::string& pattern_spec) { | 375 const std::string& pattern_spec) { |
367 scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( | 376 scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( |
368 ContentSettingsPattern::CreateBuilder(false)); | 377 ContentSettingsPattern::CreateBuilder(false)); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 return IPC::ReadParam(m, iter, &is_valid_) && | 418 return IPC::ReadParam(m, iter, &is_valid_) && |
410 IPC::ReadParam(m, iter, &parts_); | 419 IPC::ReadParam(m, iter, &parts_); |
411 } | 420 } |
412 | 421 |
413 bool ContentSettingsPattern::Matches( | 422 bool ContentSettingsPattern::Matches( |
414 const GURL& url) const { | 423 const GURL& url) const { |
415 // An invalid pattern matches nothing. | 424 // An invalid pattern matches nothing. |
416 if (!is_valid_) | 425 if (!is_valid_) |
417 return false; | 426 return false; |
418 | 427 |
| 428 const GURL* local_url = &url; |
| 429 if (url.SchemeIsFileSystem() && url.inner_url()) { |
| 430 local_url = url.inner_url(); |
| 431 } |
| 432 |
419 // Match the scheme part. | 433 // Match the scheme part. |
420 const std::string scheme(url.scheme()); | 434 const std::string scheme(local_url->scheme()); |
421 if (!parts_.is_scheme_wildcard && | 435 if (!parts_.is_scheme_wildcard && |
422 parts_.scheme != scheme) { | 436 parts_.scheme != scheme) { |
423 return false; | 437 return false; |
424 } | 438 } |
425 | 439 |
426 // File URLs have no host. Matches if the pattern has the path wildcard set, | 440 // File URLs have no host. Matches if the pattern has the path wildcard set, |
427 // or if the path in the URL is identical to the one in the pattern. | 441 // or if the path in the URL is identical to the one in the pattern. |
| 442 // For filesystem:file URLs, the path used is the filesystem type, so all |
| 443 // filesystem:file:///temporary/... are equivalent. |
428 if (!parts_.is_scheme_wildcard && scheme == chrome::kFileScheme) | 444 if (!parts_.is_scheme_wildcard && scheme == chrome::kFileScheme) |
429 return parts_.is_path_wildcard || parts_.path == std::string(url.path()); | 445 return parts_.is_path_wildcard || |
| 446 parts_.path == std::string(local_url->path()); |
430 | 447 |
431 // Match the host part. | 448 // Match the host part. |
432 const std::string host(net::TrimEndingDot(url.host())); | 449 const std::string host(net::TrimEndingDot(local_url->host())); |
433 if (!parts_.has_domain_wildcard) { | 450 if (!parts_.has_domain_wildcard) { |
434 if (parts_.host != host) | 451 if (parts_.host != host) |
435 return false; | 452 return false; |
436 } else { | 453 } else { |
437 if (!IsSubDomainOrEqual(host, parts_.host)) | 454 if (!IsSubDomainOrEqual(host, parts_.host)) |
438 return false; | 455 return false; |
439 } | 456 } |
440 | 457 |
441 // For chrome extensions URLs ignore the port. | 458 // For chrome extensions URLs ignore the port. |
442 if (parts_.scheme == std::string(chrome::kExtensionScheme)) | 459 if (parts_.scheme == std::string(chrome::kExtensionScheme)) |
443 return true; | 460 return true; |
444 | 461 |
445 // Match the port part. | 462 // Match the port part. |
446 std::string port(url.port()); | 463 std::string port(local_url->port()); |
447 | 464 |
448 // Use the default port if the port string is empty. GURL returns an empty | 465 // Use the default port if the port string is empty. GURL returns an empty |
449 // string if no port at all was specified or if the default port was | 466 // string if no port at all was specified or if the default port was |
450 // specified. | 467 // specified. |
451 if (port.empty()) { | 468 if (port.empty()) { |
452 port = GetDefaultPort(scheme); | 469 port = GetDefaultPort(scheme); |
453 } | 470 } |
454 | 471 |
455 if (!parts_.is_port_wildcard && | 472 if (!parts_.is_port_wildcard && |
456 parts_.port != port ) { | 473 parts_.port != port ) { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 if (!parts.is_port_wildcard && other_parts.is_port_wildcard) | 654 if (!parts.is_port_wildcard && other_parts.is_port_wildcard) |
638 return ContentSettingsPattern::PREDECESSOR; | 655 return ContentSettingsPattern::PREDECESSOR; |
639 | 656 |
640 int result = parts.port.compare(other_parts.port); | 657 int result = parts.port.compare(other_parts.port); |
641 if (result == 0) | 658 if (result == 0) |
642 return ContentSettingsPattern::IDENTITY; | 659 return ContentSettingsPattern::IDENTITY; |
643 if (result > 0) | 660 if (result > 0) |
644 return ContentSettingsPattern::DISJOINT_ORDER_PRE; | 661 return ContentSettingsPattern::DISJOINT_ORDER_PRE; |
645 return ContentSettingsPattern::DISJOINT_ORDER_POST; | 662 return ContentSettingsPattern::DISJOINT_ORDER_POST; |
646 } | 663 } |
OLD | NEW |