Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(812)

Side by Side Diff: chrome/common/content_settings_pattern.cc

Issue 7811006: Add full support for filesystem URLs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix merge errors Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/web_applications/web_app.cc ('k') | chrome/common/content_settings_pattern_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698