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