Index: Source/core/loader/cache/ResourceFetcher.cpp |
diff --git a/Source/core/loader/cache/ResourceFetcher.cpp b/Source/core/loader/cache/ResourceFetcher.cpp |
index bbe34861fa7cf90800cf8bf03f2196ca5acdb1b4..af2b0bc55094c8b707b5cafd1ab25a576d19e25c 100644 |
--- a/Source/core/loader/cache/ResourceFetcher.cpp |
+++ b/Source/core/loader/cache/ResourceFetcher.cpp |
@@ -31,6 +31,7 @@ |
#include "core/dom/Document.h" |
#include "core/html/HTMLElement.h" |
#include "core/html/HTMLFrameOwnerElement.h" |
+#include "core/html/HTMLImport.h" |
#include "core/inspector/InspectorInstrumentation.h" |
#include "core/loader/DocumentLoader.h" |
#include "core/loader/FrameLoader.h" |
@@ -93,7 +94,10 @@ static CachedResource* createResource(CachedResource::Type type, const ResourceR |
return new CachedTextTrack(request); |
case CachedResource::ShaderResource: |
return new CachedShader(request); |
+ case CachedResource::ImportResource: |
+ return new CachedRawResource(request, type); |
} |
+ |
ASSERT_NOT_REACHED(); |
return 0; |
} |
@@ -111,6 +115,7 @@ static ResourceLoadPriority loadPriority(CachedResource::Type type, const FetchR |
case CachedResource::Script: |
case CachedResource::FontResource: |
case CachedResource::RawResource: |
+ case CachedResource::ImportResource: |
return ResourceLoadPriorityMedium; |
case CachedResource::ImageResource: |
return request.forPreload() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityLow; |
@@ -188,7 +193,11 @@ CachedResource* ResourceFetcher::cachedResource(const KURL& resourceURL) const |
Frame* ResourceFetcher::frame() const |
{ |
- return m_documentLoader ? m_documentLoader->frame() : 0; |
+ if (m_documentLoader) |
+ return m_documentLoader->frame(); |
+ if (m_document && m_document->import()) |
+ return m_document->import()->frame(); |
+ return 0; |
} |
CachedResourceHandle<CachedImage> ResourceFetcher::requestImage(FetchRequest& request) |
@@ -236,6 +245,11 @@ CachedResourceHandle<CachedShader> ResourceFetcher::requestShader(FetchRequest& |
return static_cast<CachedShader*>(requestResource(CachedResource::ShaderResource, request).get()); |
} |
+CachedResourceHandle<CachedRawResource> ResourceFetcher::requestImport(FetchRequest& request) |
+{ |
+ return static_cast<CachedRawResource*>(requestResource(CachedResource::ImportResource, request).get()); |
+} |
+ |
CachedResourceHandle<CachedCSSStyleSheet> ResourceFetcher::requestCSSStyleSheet(FetchRequest& request) |
{ |
return static_cast<CachedCSSStyleSheet*>(requestResource(CachedResource::CSSStyleSheet, request).get()); |
@@ -294,6 +308,7 @@ bool ResourceFetcher::checkInsecureContent(CachedResource::Type type, const KURL |
case CachedResource::XSLStyleSheet: |
case CachedResource::SVGDocumentResource: |
case CachedResource::CSSStyleSheet: |
+ case CachedResource::ImportResource: |
// These resource can inject script into the current document (Script, |
// XSL) or exfiltrate the content of the current document (CSS). |
if (Frame* f = frame()) { |
@@ -350,6 +365,7 @@ bool ResourceFetcher::canRequest(CachedResource::Type type, const KURL& url, con |
case CachedResource::LinkSubresource: |
case CachedResource::TextTrackResource: |
case CachedResource::ShaderResource: |
+ case CachedResource::ImportResource: |
// By default these types of resources can be loaded from any origin. |
// FIXME: Are we sure about CachedResource::FontResource? |
if (options.requestOriginPolicy == RestrictToSameOrigin && !m_document->securityOrigin()->canRequest(url)) { |
@@ -372,6 +388,7 @@ bool ResourceFetcher::canRequest(CachedResource::Type type, const KURL& url, con |
return false; |
break; |
case CachedResource::Script: |
+ case CachedResource::ImportResource: |
if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentSecurityPolicy()->allowScriptFromSource(url)) |
return false; |
@@ -432,7 +449,7 @@ bool ResourceFetcher::canAccess(CachedResource* resource) |
String error; |
switch (resource->type()) { |
case CachedResource::Script: |
- case CachedResource::RawResource: |
+ case CachedResource::ImportResource: |
if (resource->options().requestOriginPolicy == PotentiallyCrossOriginEnabled |
&& !m_document->securityOrigin()->canRequest(resource->response().url()) |
&& !resource->passesAccessControlCheck(m_document->securityOrigin(), error)) { |
@@ -449,6 +466,20 @@ bool ResourceFetcher::canAccess(CachedResource* resource) |
return true; |
} |
+bool ResourceFetcher::shouldLoadNewResource() const |
+{ |
+ if (!frame()) |
+ return false; |
+ if (m_documentLoader) { |
+ if (m_documentLoader != frame()->loader()->activeDocumentLoader()) |
+ return false; |
+ if (m_documentLoader->isStopping()) |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
CachedResourceHandle<CachedResource> ResourceFetcher::requestResource(CachedResource::Type type, FetchRequest& request) |
{ |
KURL url = request.resourceRequest().url(); |
@@ -502,13 +533,13 @@ CachedResourceHandle<CachedResource> ResourceFetcher::requestResource(CachedReso |
} |
if ((policy != Use || resource->stillNeedsLoad()) && FetchRequest::NoDefer == request.defer()) { |
- if (!frame() || m_documentLoader != frame()->loader()->activeDocumentLoader() || m_documentLoader->isStopping()) { |
+ if (!shouldLoadNewResource()) { |
if (resource->inCache()) |
memoryCache()->remove(resource.get()); |
return 0; |
} |
- if (!m_documentLoader->scheduleArchiveLoad(resource.get(), request.resourceRequest())) |
+ if (!m_documentLoader || !m_documentLoader->scheduleArchiveLoad(resource.get(), request.resourceRequest())) |
resource->load(this, request.options()); |
// We don't support immediate loads, but we do support immediate failure. |
@@ -568,6 +599,7 @@ void ResourceFetcher::determineTargetType(ResourceRequest& request, CachedResour |
break; |
case CachedResource::ShaderResource: |
case CachedResource::RawResource: |
+ case CachedResource::ImportResource: |
targetType = ResourceRequest::TargetIsSubresource; |
break; |
case CachedResource::LinkPrefetch: |
@@ -607,7 +639,7 @@ ResourceRequestCachePolicy ResourceFetcher::resourceRequestCachePolicy(const Res |
if (request.isConditional()) |
return ReloadIgnoringCacheData; |
- if (m_documentLoader->isLoadingInAPISense()) { |
+ if (m_documentLoader && m_documentLoader->isLoadingInAPISense()) { |
// For POST requests, we mutate the main resource's cache policy to avoid form resubmission. |
// This policy should not be inherited by subresources. |
ResourceRequestCachePolicy mainResourceCachePolicy = m_documentLoader->request().cachePolicy(); |
@@ -920,7 +952,8 @@ void ResourceFetcher::didLoadResource(CachedResource* resource) |
info->setInitialRequest(resource->resourceRequest()); |
info->setFinalResponse(resource->response()); |
info->setLoadFinishTime(resource->loadFinishTime()); |
- initiatorDocument->domWindow()->performance()->addResourceTiming(*info, initiatorDocument); |
+ if (DOMWindow* initiatorWindow = initiatorDocument->domWindow()) |
+ initiatorWindow->performance()->addResourceTiming(*info, initiatorDocument); |
m_resourceTimingInfoMap.remove(it); |
} |
} |
@@ -1092,7 +1125,9 @@ void ResourceFetcher::clearPendingPreloads() |
inline FrameLoader* ResourceFetcher::frameLoader() |
{ |
- return frame() ? frame()->loader() : 0; |
+ if (Frame* frame = this->frame()) |
+ return frame->loader(); |
+ return 0; |
} |
void ResourceFetcher::didFinishLoading(const CachedResource* resource, double finishTime, const ResourceLoaderOptions& options) |