summaryrefslogtreecommitdiffstats
path: root/WebCore/loader/loader.cpp
diff options
context:
space:
mode:
authorLeon Clarke <leonclarke@google.com>2010-03-09 14:12:21 +0000
committerLeon Clarke <leonclarke@google.com>2010-05-04 10:59:37 +0100
commitf91ac8eab3399adb5325701bebe0590a77e49df7 (patch)
tree04ff055963cf2bfe147998ca3396134b243be38d /WebCore/loader/loader.cpp
parentb97e8541004c77ec0c85f74b896b9d3bdb6de6b4 (diff)
downloadexternal_webkit-f91ac8eab3399adb5325701bebe0590a77e49df7.zip
external_webkit-f91ac8eab3399adb5325701bebe0590a77e49df7.tar.gz
external_webkit-f91ac8eab3399adb5325701bebe0590a77e49df7.tar.bz2
Link prefetch support
http://b/issue?id=2268353
Diffstat (limited to 'WebCore/loader/loader.cpp')
-rw-r--r--WebCore/loader/loader.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/WebCore/loader/loader.cpp b/WebCore/loader/loader.cpp
index 4d2b474..24f141f 100644
--- a/WebCore/loader/loader.cpp
+++ b/WebCore/loader/loader.cpp
@@ -88,7 +88,12 @@ static ResourceRequest::TargetType cachedResourceTypeToTargetType(CachedResource
return ResourceRequest::TargetIsFontResource;
case CachedResource::ImageResource:
return ResourceRequest::TargetIsImage;
+#if ENABLE(LINK_PREFETCH)
+ case CachedResource::LinkPrefetch:
+ return ResourceRequest::TargetIsSubresource;
+#endif
}
+ ASSERT_NOT_REACHED();
return ResourceRequest::TargetIsSubresource;
}
@@ -109,6 +114,10 @@ Loader::Priority Loader::determinePriority(const CachedResource* resource) const
return Medium;
case CachedResource::ImageResource:
return Low;
+#if ENABLE(LINK_PREFETCH)
+ case CachedResource::LinkPrefetch:
+ return VeryLow;
+#endif
}
ASSERT_NOT_REACHED();
return Low;
@@ -138,9 +147,9 @@ void Loader::load(DocLoader* docLoader, CachedResource* resource, bool increment
bool hadRequests = host->hasRequests();
Priority priority = determinePriority(resource);
host->addRequest(request, priority);
- docLoader->incrementRequestCount();
+ docLoader->incrementRequestCount(request->cachedResource());
- if (priority > Low || !url.protocolInHTTPFamily() || !hadRequests) {
+ if (priority > Low || !url.protocolInHTTPFamily() || (priority == Low && !hadRequests)) {
// Try to request important resources immediately
host->servePendingRequests(priority);
} else {
@@ -352,6 +361,12 @@ void Loader::Host::servePendingRequests(RequestQueue& requestsPending, bool& ser
}
}
+#if ENABLE(LINK_PREFETCH)
+ if (request->cachedResource()->type() == CachedResource::LinkPrefetch) {
+ resourceRequest.setHTTPHeaderField("X-Moz", "prefetch");
+ }
+#endif
+
RefPtr<SubresourceLoader> loader = SubresourceLoader::create(docLoader->doc()->frame(),
this, resourceRequest, request->shouldDoSecurityCheck(), request->sendResourceLoadCallbacks());
if (loader) {
@@ -361,7 +376,7 @@ void Loader::Host::servePendingRequests(RequestQueue& requestsPending, bool& ser
printf("HOST %s COUNT %d LOADING %s\n", resourceRequest.url().host().latin1().data(), m_requestsLoading.size(), request->cachedResource()->url().latin1().data());
#endif
} else {
- docLoader->decrementRequestCount();
+ docLoader->decrementRequestCount(request->cachedResource());
docLoader->setLoadInProgress(true);
request->cachedResource()->error();
docLoader->setLoadInProgress(false);
@@ -385,7 +400,7 @@ void Loader::Host::didFinishLoading(SubresourceLoader* loader)
// the docLoader that it will delete when the document gets deleted.
RefPtr<Document> protector(docLoader->doc());
if (!request->isMultipart())
- docLoader->decrementRequestCount();
+ docLoader->decrementRequestCount(request->cachedResource());
CachedResource* resource = request->cachedResource();
ASSERT(!resource->resourceToRevalidate());
@@ -433,7 +448,7 @@ void Loader::Host::didFail(SubresourceLoader* loader, bool cancelled)
// the docLoader that it will delete when the document gets deleted.
RefPtr<Document> protector(docLoader->doc());
if (!request->isMultipart())
- docLoader->decrementRequestCount();
+ docLoader->decrementRequestCount(request->cachedResource());
CachedResource* resource = request->cachedResource();
@@ -478,7 +493,7 @@ void Loader::Host::didReceiveResponse(SubresourceLoader* loader, const ResourceR
// 304 Not modified / Use local copy
m_requestsLoading.remove(loader);
loader->clearClient();
- request->docLoader()->decrementRequestCount();
+ request->docLoader()->decrementRequestCount(request->cachedResource());
// Existing resource is ok, just use it updating the expiration time.
cache()->revalidationSucceeded(resource, response);
@@ -510,7 +525,7 @@ void Loader::Host::didReceiveResponse(SubresourceLoader* loader, const ResourceR
request->setIsMultipart(true);
// We don't count multiParts in a DocLoader's request count
- request->docLoader()->decrementRequestCount();
+ request->docLoader()->decrementRequestCount(request->cachedResource());
// If we get a multipart response, we must have a handle
ASSERT(loader->handle());
@@ -559,7 +574,7 @@ void Loader::Host::cancelPendingRequests(RequestQueue& requestsPending, DocLoade
if (request->docLoader() == docLoader) {
cache()->remove(request->cachedResource());
delete request;
- docLoader->decrementRequestCount();
+ docLoader->decrementRequestCount(request->cachedResource());
} else
remaining.append(request);
}