Index: Source/core/fetch/ResourceFetcher.cpp |
diff --git a/Source/core/fetch/ResourceFetcher.cpp b/Source/core/fetch/ResourceFetcher.cpp |
index b79496ad978b14ac2c5678920b110412760b29fe..ea44911232428333aea6d34d69eedae383194cb6 100644 |
--- a/Source/core/fetch/ResourceFetcher.cpp |
+++ b/Source/core/fetch/ResourceFetcher.cpp |
@@ -445,7 +445,7 @@ bool ResourceFetcher::checkInsecureContent(Resource::Type type, const KURL& url, |
return true; |
} |
-bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const ResourceLoaderOptions& options, bool forPreload, FetchRequest::OriginRestriction originRestriction) |
+bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const ResourceLoaderOptions& options, bool forPreload, FetchRequest::OriginRestriction originRestriction) const |
{ |
SecurityOrigin* securityOrigin = options.securityOrigin.get(); |
if (!securityOrigin && document()) |
@@ -550,30 +550,23 @@ bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res |
return true; |
} |
-bool ResourceFetcher::canAccess(Resource* resource, CORSEnabled corsEnabled, FetchRequest::OriginRestriction originRestriction) |
+bool ResourceFetcher::canAccessResource(Resource* resource, const KURL& url) const |
{ |
// Redirects can change the response URL different from one of request. |
- if (!canRequest(resource->type(), resource->response().url(), resource->options(), false, originRestriction)) |
+ if (!canRequest(resource->type(), url, resource->options(), false, FetchRequest::UseDefaultOriginRestrictionForType)) |
return false; |
- String error; |
- switch (resource->type()) { |
- case Resource::Script: |
- case Resource::ImportResource: |
- if (corsEnabled == PotentiallyCORSEnabled |
- && !m_document->securityOrigin()->canRequest(resource->response().url()) |
- && !resource->passesAccessControlCheck(m_document->securityOrigin(), error)) { |
- if (frame() && frame()->document()) |
- frame()->document()->addConsoleMessage(JSMessageSource, ErrorMessageLevel, "Script from origin '" + SecurityOrigin::create(resource->response().url())->toString() + "' has been blocked from loading by Cross-Origin Resource Sharing policy: " + error); |
- return false; |
- } |
+ if (!document() || document()->securityOrigin()->canRequest(url)) |
+ return true; |
- break; |
- default: |
- ASSERT_NOT_REACHED(); // FIXME: generalize to non-script resources |
+ String errorDescription; |
+ if (!resource->passesAccessControlCheck(document()->securityOrigin(), errorDescription)) { |
+ if (frame() && frame()->document()) { |
+ String resourceType = Resource::resourceTypeToString(resource->type(), resource->options().initiatorInfo); |
+ frame()->document()->addConsoleMessage(JSMessageSource, ErrorMessageLevel, resourceType + " from origin '" + SecurityOrigin::create(url)->toString() + "' has been blocked from loading by Cross-Origin Resource Sharing policy: " + errorDescription); |
+ } |
return false; |
} |
- |
return true; |
} |
@@ -622,7 +615,7 @@ ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc |
// See if we can use an existing resource from the cache. |
ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); |
- const RevalidationPolicy policy = determineRevalidationPolicy(type, request.mutableResourceRequest(), request.forPreload(), resource.get(), request.defer()); |
+ const RevalidationPolicy policy = determineRevalidationPolicy(type, request.mutableResourceRequest(), request.forPreload(), resource.get(), request.defer(), request.options()); |
switch (policy) { |
case Reload: |
memoryCache()->remove(resource.get()); |
@@ -842,7 +835,7 @@ void ResourceFetcher::storeResourceTimingInitiatorInformation(const ResourcePtr< |
} |
} |
-ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy(Resource::Type type, ResourceRequest& request, bool forPreload, Resource* existingResource, FetchRequest::DeferOption defer) const |
+ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy(Resource::Type type, ResourceRequest& request, bool forPreload, Resource* existingResource, FetchRequest::DeferOption defer, const ResourceLoaderOptions& options) const |
{ |
if (!existingResource) |
return Load; |
@@ -899,6 +892,10 @@ ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy |
return Reload; |
} |
+ // If fetching a resource with a different 'CORS enabled' flag, reload. |
+ if (type != Resource::MainResource && options.corsEnabled != existingResource->options().corsEnabled) |
+ return Reload; |
+ |
// If credentials were sent with the previous request and won't be |
// with this one, or vice versa, re-fetch the resource. |
// |