Index: Source/core/loader/ResourceLoader.cpp |
diff --git a/Source/core/loader/ResourceLoader.cpp b/Source/core/loader/ResourceLoader.cpp |
index 53809dfb9d2313f8d7debc848744e75a6e81319d..967dc7572d03a1510e2939fe8714e71538b5c993 100644 |
--- a/Source/core/loader/ResourceLoader.cpp |
+++ b/Source/core/loader/ResourceLoader.cpp |
@@ -31,12 +31,7 @@ |
#include "core/loader/ResourceLoader.h" |
#include "core/inspector/InspectorInstrumentation.h" |
-#include "core/loader/DocumentLoader.h" |
-#include "core/loader/FrameLoader.h" |
-#include "core/loader/FrameLoaderClient.h" |
-#include "core/loader/appcache/ApplicationCacheHost.h" |
-#include "core/loader/cache/CachedResourceLoader.h" |
-#include "core/page/Frame.h" |
+#include "core/loader/ResourceLoaderHost.h" |
#include "core/page/Page.h" |
#include "core/platform/Logging.h" |
#include "core/platform/network/ResourceError.h" |
@@ -44,37 +39,36 @@ |
namespace WebCore { |
-ResourceLoader::RequestCountTracker::RequestCountTracker(CachedResourceLoader* cachedResourceLoader, CachedResource* resource) |
- : m_cachedResourceLoader(cachedResourceLoader) |
+ResourceLoader::RequestCountTracker::RequestCountTracker(ResourceLoaderHost* host, CachedResource* resource) |
+ : m_host(host) |
, m_resource(resource) |
{ |
- m_cachedResourceLoader->incrementRequestCount(m_resource); |
+ m_host->incrementRequestCount(m_resource); |
} |
ResourceLoader::RequestCountTracker::~RequestCountTracker() |
{ |
- m_cachedResourceLoader->decrementRequestCount(m_resource); |
+ m_host->decrementRequestCount(m_resource); |
} |
-PassRefPtr<ResourceLoader> ResourceLoader::create(DocumentLoader* documentLoader, CachedResource* resource, const ResourceRequest& request, const ResourceLoaderOptions& options) |
+PassRefPtr<ResourceLoader> ResourceLoader::create(ResourceLoaderHost* host, CachedResource* resource, const ResourceRequest& request, const ResourceLoaderOptions& options) |
{ |
- RefPtr<ResourceLoader> loader(adoptRef(new ResourceLoader(documentLoader, resource, options))); |
+ RefPtr<ResourceLoader> loader(adoptRef(new ResourceLoader(host, resource, options))); |
if (!loader->init(request)) |
return 0; |
loader->start(); |
return loader.release(); |
} |
-ResourceLoader::ResourceLoader(DocumentLoader* documentLoader, CachedResource* resource, ResourceLoaderOptions options) |
- : m_frame(documentLoader->frame()) |
- , m_documentLoader(documentLoader) |
+ResourceLoader::ResourceLoader(ResourceLoaderHost* host, CachedResource* resource, const ResourceLoaderOptions& options) |
+ : m_host(host) |
, m_loadingMultipartContent(false) |
, m_notifiedLoadComplete(false) |
- , m_defersLoading(m_frame->page()->defersLoading()) |
+ , m_defersLoading(host->defersLoading()) |
, m_options(options) |
, m_resource(resource) |
, m_state(Uninitialized) |
- , m_requestCountTracker(adoptPtr(new RequestCountTracker(documentLoader->cachedResourceLoader(), resource))) |
+ , m_requestCountTracker(adoptPtr(new RequestCountTracker(host, resource))) |
{ |
} |
@@ -88,11 +82,11 @@ void ResourceLoader::releaseResources() |
ASSERT(m_state != Terminated); |
if (m_state != Uninitialized) { |
m_requestCountTracker.clear(); |
- m_documentLoader->cachedResourceLoader()->loadDone(m_resource); |
+ m_host->didLoadResource(m_resource); |
if (m_state == Terminated) |
return; |
m_resource->clearLoader(); |
- m_documentLoader->removeResourceLoader(this); |
+ m_host->willTerminateResourceLoader(this); |
} |
ASSERT(m_state != Terminated); |
@@ -103,9 +97,7 @@ void ResourceLoader::releaseResources() |
// has been deallocated and also to avoid reentering this method. |
RefPtr<ResourceLoader> protector(this); |
- m_frame = 0; |
- m_documentLoader = 0; |
- |
+ m_host.clear(); |
m_state = Terminated; |
if (m_handle) { |
@@ -136,7 +128,7 @@ bool ResourceLoader::init(const ResourceRequest& r) |
m_originalRequest = m_request = clientRequest; |
m_state = Initialized; |
- m_documentLoader->addResourceLoader(this); |
+ m_host->didInitializeResourceLoader(this); |
return true; |
} |
@@ -146,7 +138,7 @@ void ResourceLoader::start() |
ASSERT(!m_request.isNull()); |
ASSERT(m_deferredRequest.isNull()); |
- m_documentLoader->applicationCacheHost()->willStartLoadingResource(m_request); |
+ m_host->willStartLoadingResource(m_request); |
if (m_defersLoading) { |
m_deferredRequest = m_request; |
@@ -169,13 +161,6 @@ void ResourceLoader::setDefersLoading(bool defers) |
} |
} |
-FrameLoader* ResourceLoader::frameLoader() const |
-{ |
- if (!m_frame) |
- return 0; |
- return m_frame->loader(); |
-} |
- |
void ResourceLoader::didDownloadData(ResourceHandle*, int length) |
{ |
RefPtr<ResourceLoader> protect(this); |
@@ -192,14 +177,13 @@ void ResourceLoader::didFinishLoadingOnePart(double finishTime) |
if (m_notifiedLoadComplete) |
return; |
m_notifiedLoadComplete = true; |
- if (m_options.sendLoadCallbacks == SendCallbacks) |
- frameLoader()->notifier()->dispatchDidFinishLoading(m_documentLoader.get(), m_resource->identifier(), finishTime); |
+ m_host->didFinishLoading(m_resource, finishTime, m_options); |
} |
void ResourceLoader::didChangePriority(ResourceLoadPriority loadPriority) |
{ |
if (handle()) { |
- frameLoader()->client()->dispatchDidChangeResourcePriority(m_resource->identifier(), loadPriority); |
+ m_host->didChangeLoadingPriority(m_resource, loadPriority); |
handle()->didChangePriority(loadPriority); |
} |
} |
@@ -242,8 +226,7 @@ void ResourceLoader::cancel(const ResourceError& error) |
m_handle = 0; |
} |
- if (m_options.sendLoadCallbacks == SendCallbacks && !m_notifiedLoadComplete) |
- frameLoader()->notifier()->dispatchDidFail(m_documentLoader.get(), m_resource->identifier(), nonNullError); |
+ m_host->didFailLoading(m_resource, nonNullError, m_options); |
if (m_state == Finishing) |
m_resource->error(CachedResource::LoadError); |
@@ -259,25 +242,18 @@ void ResourceLoader::willSendRequest(ResourceHandle*, ResourceRequest& request, |
ASSERT(!request.isNull()); |
if (!redirectResponse.isNull()) { |
- if (!m_documentLoader->cachedResourceLoader()->canRequest(m_resource->type(), request.url(), m_options)) { |
- cancel(); |
- return; |
- } |
- if (m_resource->type() == CachedResource::ImageResource && m_documentLoader->cachedResourceLoader()->shouldDeferImageLoad(request.url())) { |
+ if (!m_host->shouldRequest(m_resource, request, m_options)) { |
cancel(); |
return; |
} |
+ |
m_resource->willSendRequest(request, redirectResponse); |
} |
if (request.isNull() || m_state == Terminated) |
return; |
- if (m_options.sendLoadCallbacks == SendCallbacks) |
- frameLoader()->notifier()->dispatchWillSendRequest(m_documentLoader.get(), m_resource->identifier(), request, redirectResponse, m_options.initiatorInfo); |
- else |
- InspectorInstrumentation::willSendRequest(m_frame.get(), m_resource->identifier(), m_documentLoader.get(), request, redirectResponse, m_options.initiatorInfo); |
- |
+ m_host->willSendRequest(m_resource, request, redirectResponse, m_options); |
m_request = request; |
if (request.isNull()) |
@@ -309,8 +285,7 @@ void ResourceLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& |
if (m_state == Terminated) |
return; |
- if (m_options.sendLoadCallbacks == SendCallbacks) |
- frameLoader()->notifier()->dispatchDidReceiveResponse(m_documentLoader.get(), m_resource->identifier(), response); |
+ m_host->didReceiveResponse(m_resource, response, m_options); |
if (response.isMultipart()) { |
m_loadingMultipartContent = true; |
@@ -324,7 +299,7 @@ void ResourceLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& |
} else if (m_loadingMultipartContent) { |
// Since a subresource loader does not load multipart sections progressively, data was delivered to the loader all at once. |
// After the first multipart section is complete, signal to delegates that this load is "finished" |
- m_documentLoader->subresourceLoaderFinishedLoadingOnePart(this); |
+ m_host->subresourceLoaderFinishedLoadingOnePart(this); |
didFinishLoadingOnePart(0); |
} |
@@ -341,7 +316,7 @@ void ResourceLoader::didReceiveData(ResourceHandle*, const char* data, int lengt |
// loop. When this occurs, ignoring the data is the correct action. |
if (m_resource->response().httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusCodeErrors()) |
return; |
- InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceData(m_frame.get(), m_resource->identifier(), encodedDataLength); |
+ InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceData(m_host->inspectedFrame(), m_resource->identifier(), encodedDataLength); |
ASSERT(m_state == Initialized); |
// Reference the object in this method since the additional processing can do |
@@ -351,9 +326,7 @@ void ResourceLoader::didReceiveData(ResourceHandle*, const char* data, int lengt |
// FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing. |
// However, with today's computers and networking speeds, this won't happen in practice. |
// Could be an issue with a giant local file. |
- if (m_options.sendLoadCallbacks == SendCallbacks && m_frame) |
- frameLoader()->notifier()->dispatchDidReceiveData(m_documentLoader.get(), m_resource->identifier(), data, length, static_cast<int>(encodedDataLength)); |
- |
+ m_host->didReceiveData(m_resource, data, length, encodedDataLength, m_options); |
m_resource->appendData(data, length); |
InspectorInstrumentation::didReceiveResourceData(cookie); |
@@ -385,6 +358,7 @@ void ResourceLoader::didFail(ResourceHandle*, const ResourceError& error) |
LOG(ResourceLoading, "Failed to load '%s'.\n", m_resource->url().string().latin1().data()); |
RefPtr<ResourceLoader> protect(this); |
+ RefPtr<ResourceLoaderHost> protectHost(m_host); |
CachedResourceHandle<CachedResource> protectResource(m_resource); |
m_state = Finishing; |
m_resource->setResourceError(error); |
@@ -395,11 +369,15 @@ void ResourceLoader::didFail(ResourceHandle*, const ResourceError& error) |
if (!m_notifiedLoadComplete) { |
m_notifiedLoadComplete = true; |
- if (m_options.sendLoadCallbacks == SendCallbacks) |
- frameLoader()->notifier()->dispatchDidFail(m_documentLoader.get(), m_resource->identifier(), error); |
+ m_host->didFailLoading(m_resource, error, m_options); |
} |
releaseResources(); |
} |
+bool ResourceLoader::isLoadedBy(ResourceLoaderHost* loader) const |
+{ |
+ return m_host->isLoadedBy(loader); |
+} |
+ |
} |