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

Side by Side Diff: Source/core/fetch/ResourceFetcher.cpp

Issue 137983010: (Re)organize handling of CORS access control during resource loading. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: HTMLImportLoader no longer needs a ResourceFetcher Created 6 years, 11 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
« no previous file with comments | « Source/core/fetch/ResourceFetcher.h ('k') | Source/core/fetch/ResourceLoader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 Frame* top = f->tree().top(); 438 Frame* top = f->tree().top();
439 if (!top->loader().mixedContentChecker()->canDisplayInsecureContent( top->document()->securityOrigin(), url)) 439 if (!top->loader().mixedContentChecker()->canDisplayInsecureContent( top->document()->securityOrigin(), url))
440 return false; 440 return false;
441 } 441 }
442 } else { 442 } else {
443 ASSERT(treatment == TreatAsAlwaysAllowedContent); 443 ASSERT(treatment == TreatAsAlwaysAllowedContent);
444 } 444 }
445 return true; 445 return true;
446 } 446 }
447 447
448 bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res ourceLoaderOptions& options, bool forPreload, FetchRequest::OriginRestriction or iginRestriction) 448 bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res ourceLoaderOptions& options, bool forPreload, FetchRequest::OriginRestriction or iginRestriction) const
449 { 449 {
450 SecurityOrigin* securityOrigin = options.securityOrigin.get(); 450 SecurityOrigin* securityOrigin = options.securityOrigin.get();
451 if (!securityOrigin && document()) 451 if (!securityOrigin && document())
452 securityOrigin = document()->securityOrigin(); 452 securityOrigin = document()->securityOrigin();
453 453
454 if (securityOrigin && !securityOrigin->canDisplay(url)) { 454 if (securityOrigin && !securityOrigin->canDisplay(url)) {
455 if (!forPreload) 455 if (!forPreload)
456 context().reportLocalLoadFailed(url); 456 context().reportLocalLoadFailed(url);
457 WTF_LOG(ResourceLoading, "ResourceFetcher::requestResource URL was not a llowed by SecurityOrigin::canDisplay"); 457 WTF_LOG(ResourceLoading, "ResourceFetcher::requestResource URL was not a llowed by SecurityOrigin::canDisplay");
458 return 0; 458 return 0;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 // folks block insecure content with a CSP policy, they don't get a warning. 543 // folks block insecure content with a CSP policy, they don't get a warning.
544 // They'll still get a warning in the console about CSP blocking the load. 544 // They'll still get a warning in the console about CSP blocking the load.
545 545
546 // FIXME: Should we consider forPreload here? 546 // FIXME: Should we consider forPreload here?
547 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment)) 547 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment))
548 return false; 548 return false;
549 549
550 return true; 550 return true;
551 } 551 }
552 552
553 bool ResourceFetcher::canAccess(Resource* resource, CORSEnabled corsEnabled, Fet chRequest::OriginRestriction originRestriction) 553 bool ResourceFetcher::canAccessResource(Resource* resource, const KURL& url) con st
554 { 554 {
555 // Redirects can change the response URL different from one of request. 555 // Redirects can change the response URL different from one of request.
556 if (!canRequest(resource->type(), resource->response().url(), resource->opti ons(), false, originRestriction)) 556 if (!canRequest(resource->type(), url, resource->options(), false, FetchRequ est::UseDefaultOriginRestrictionForType))
557 return false; 557 return false;
558 558
559 String error; 559 if (!document() || document()->securityOrigin()->canRequest(url))
560 switch (resource->type()) { 560 return true;
561 case Resource::Script: 561
562 case Resource::ImportResource: 562 String errorDescription;
563 if (corsEnabled == PotentiallyCORSEnabled 563 if (!resource->passesAccessControlCheck(document()->securityOrigin(), errorD escription)) {
564 && !m_document->securityOrigin()->canRequest(resource->response().ur l()) 564 if (frame() && frame()->document()) {
565 && !resource->passesAccessControlCheck(m_document->securityOrigin(), error)) { 565 String resourceType = Resource::resourceTypeToString(resource->type( ), resource->options().initiatorInfo);
566 if (frame() && frame()->document()) 566 frame()->document()->addConsoleMessage(JSMessageSource, ErrorMessage Level, resourceType + " from origin '" + SecurityOrigin::create(url)->toString() + "' has been blocked from loading by Cross-Origin Resource Sharing policy: " + errorDescription);
567 frame()->document()->addConsoleMessage(JSMessageSource, ErrorMes sageLevel, "Script from origin '" + SecurityOrigin::create(resource->response(). url())->toString() + "' has been blocked from loading by Cross-Origin Resource S haring policy: " + error);
568 return false;
569 } 567 }
570
571 break;
572 default:
573 ASSERT_NOT_REACHED(); // FIXME: generalize to non-script resources
574 return false; 568 return false;
575 } 569 }
576
577 return true; 570 return true;
578 } 571 }
579 572
580 bool ResourceFetcher::shouldLoadNewResource(Resource::Type type) const 573 bool ResourceFetcher::shouldLoadNewResource(Resource::Type type) const
581 { 574 {
582 if (!frame()) 575 if (!frame())
583 return false; 576 return false;
584 if (!m_documentLoader) 577 if (!m_documentLoader)
585 return true; 578 return true;
586 if (type == Resource::MainResource) 579 if (type == Resource::MainResource)
(...skipping 28 matching lines...) Expand all
615 608
616 if (!canRequest(type, url, request.options(), request.forPreload(), request. originRestriction())) 609 if (!canRequest(type, url, request.options(), request.forPreload(), request. originRestriction()))
617 return 0; 610 return 0;
618 611
619 if (Frame* f = frame()) 612 if (Frame* f = frame())
620 f->loader().client()->dispatchWillRequestResource(&request); 613 f->loader().client()->dispatchWillRequestResource(&request);
621 614
622 // See if we can use an existing resource from the cache. 615 // See if we can use an existing resource from the cache.
623 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); 616 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url);
624 617
625 const RevalidationPolicy policy = determineRevalidationPolicy(type, request. mutableResourceRequest(), request.forPreload(), resource.get(), request.defer()) ; 618 const RevalidationPolicy policy = determineRevalidationPolicy(type, request. mutableResourceRequest(), request.forPreload(), resource.get(), request.defer(), request.options());
626 switch (policy) { 619 switch (policy) {
627 case Reload: 620 case Reload:
628 memoryCache()->remove(resource.get()); 621 memoryCache()->remove(resource.get());
629 // Fall through 622 // Fall through
630 case Load: 623 case Load:
631 resource = loadResource(type, request, request.charset()); 624 resource = loadResource(type, request, request.charset());
632 break; 625 break;
633 case Revalidate: 626 case Revalidate:
634 resource = revalidateResource(request, resource.get()); 627 resource = revalidateResource(request, resource.get());
635 break; 628 break;
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 if (frame()->ownerElement() && !frame()->ownerElement()->loadedNonEmptyD ocument()) { 828 if (frame()->ownerElement() && !frame()->ownerElement()->loadedNonEmptyD ocument()) {
836 info->setInitiatorType(frame()->ownerElement()->localName()); 829 info->setInitiatorType(frame()->ownerElement()->localName());
837 m_resourceTimingInfoMap.add(resource.get(), info); 830 m_resourceTimingInfoMap.add(resource.get(), info);
838 frame()->ownerElement()->didLoadNonEmptyDocument(); 831 frame()->ownerElement()->didLoadNonEmptyDocument();
839 } 832 }
840 } else { 833 } else {
841 m_resourceTimingInfoMap.add(resource.get(), info); 834 m_resourceTimingInfoMap.add(resource.get(), info);
842 } 835 }
843 } 836 }
844 837
845 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy (Resource::Type type, ResourceRequest& request, bool forPreload, Resource* exist ingResource, FetchRequest::DeferOption defer) const 838 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy (Resource::Type type, ResourceRequest& request, bool forPreload, Resource* exist ingResource, FetchRequest::DeferOption defer, const ResourceLoaderOptions& optio ns) const
846 { 839 {
847 if (!existingResource) 840 if (!existingResource)
848 return Load; 841 return Load;
849 842
850 // We already have a preload going for this URL. 843 // We already have a preload going for this URL.
851 if (forPreload && existingResource->isPreloaded()) 844 if (forPreload && existingResource->isPreloaded())
852 return Use; 845 return Use;
853 846
854 // If the same URL has been loaded as a different type, we need to reload. 847 // If the same URL has been loaded as a different type, we need to reload.
855 if (existingResource->type() != type) { 848 if (existingResource->type() != type) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 CachePolicy cachePolicy = context().cachePolicy(document()); 885 CachePolicy cachePolicy = context().cachePolicy(document());
893 if (cachePolicy == CachePolicyHistoryBuffer) 886 if (cachePolicy == CachePolicyHistoryBuffer)
894 return Use; 887 return Use;
895 888
896 // Don't reuse resources with Cache-control: no-store. 889 // Don't reuse resources with Cache-control: no-store.
897 if (existingResource->response().cacheControlContainsNoStore()) { 890 if (existingResource->response().cacheControlContainsNoStore()) {
898 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to Cache-control: no-store."); 891 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to Cache-control: no-store.");
899 return Reload; 892 return Reload;
900 } 893 }
901 894
895 // If fetching a resource with a different 'CORS enabled' flag, reload.
896 if (type != Resource::MainResource && options.corsEnabled != existingResourc e->options().corsEnabled)
897 return Reload;
898
902 // If credentials were sent with the previous request and won't be 899 // If credentials were sent with the previous request and won't be
903 // with this one, or vice versa, re-fetch the resource. 900 // with this one, or vice versa, re-fetch the resource.
904 // 901 //
905 // This helps with the case where the server sends back 902 // This helps with the case where the server sends back
906 // "Access-Control-Allow-Origin: *" all the time, but some of the 903 // "Access-Control-Allow-Origin: *" all the time, but some of the
907 // client's requests are made without CORS and some with. 904 // client's requests are made without CORS and some with.
908 if (existingResource->resourceRequest().allowCookies() != request.allowCooki es()) { 905 if (existingResource->resourceRequest().allowCookies() != request.allowCooki es()) {
909 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to difference in credentials settings."); 906 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to difference in credentials settings.");
910 return Reload; 907 return Reload;
911 } 908 }
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 } 1367 }
1371 #endif 1368 #endif
1372 1369
1373 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() 1370 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions()
1374 { 1371 {
1375 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SniffContent, BufferDat a, AllowStoredCredentials, ClientRequestedCredentials, AskClientForCrossOriginCr edentials, DoSecurityCheck, CheckContentSecurityPolicy, DocumentContext)); 1372 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SniffContent, BufferDat a, AllowStoredCredentials, ClientRequestedCredentials, AskClientForCrossOriginCr edentials, DoSecurityCheck, CheckContentSecurityPolicy, DocumentContext));
1376 return options; 1373 return options;
1377 } 1374 }
1378 1375
1379 } 1376 }
OLDNEW
« no previous file with comments | « Source/core/fetch/ResourceFetcher.h ('k') | Source/core/fetch/ResourceLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698