summaryrefslogtreecommitdiff
path: root/Source/WebCore/loader/cache
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
commitcd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch)
tree8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebCore/loader/cache
parentd11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff)
downloadqtwebkit-cd44dc59cdfc39534aef4d417e9f3c412e3be139.tar.gz
Imported WebKit commit fce473cb4d55aa9fe9d0b0322a2fffecb731b961 (http://svn.webkit.org/repository/webkit/trunk@106560)
Diffstat (limited to 'Source/WebCore/loader/cache')
-rw-r--r--Source/WebCore/loader/cache/CachedImage.cpp10
-rw-r--r--Source/WebCore/loader/cache/CachedImage.h6
-rw-r--r--Source/WebCore/loader/cache/CachedResource.cpp12
-rw-r--r--Source/WebCore/loader/cache/CachedResource.h2
-rw-r--r--Source/WebCore/loader/cache/CachedResourceLoader.cpp4
-rw-r--r--Source/WebCore/loader/cache/CachedShader.cpp5
-rw-r--r--Source/WebCore/loader/cache/MemoryCache.cpp1
7 files changed, 29 insertions, 11 deletions
diff --git a/Source/WebCore/loader/cache/CachedImage.cpp b/Source/WebCore/loader/cache/CachedImage.cpp
index d624e3677..5b77301ef 100644
--- a/Source/WebCore/loader/cache/CachedImage.cpp
+++ b/Source/WebCore/loader/cache/CachedImage.cpp
@@ -205,6 +205,7 @@ void CachedImage::setContainerSizeForRenderer(const RenderObject* renderer, cons
m_svgImageCache->setRequestedSizeAndZoom(renderer, SVGImageCache::SizeAndZoom(containerSize, containerZoom));
#else
UNUSED_PARAM(renderer);
+ UNUSED_PARAM(containerZoom);
m_image->setContainerSize(containerSize);
#endif
}
@@ -255,6 +256,8 @@ IntSize CachedImage::imageSizeForRenderer(const RenderObject* renderer, float mu
}
return sizeAndZoom.size;
}
+#else
+ UNUSED_PARAM(renderer);
#endif
if (multiplier == 1.0f)
@@ -387,6 +390,13 @@ void CachedImage::error(CachedResource::Status status)
checkNotify();
}
+void CachedImage::setResponse(const ResourceResponse& response)
+{
+ if (!m_response.isNull())
+ clear();
+ CachedResource::setResponse(response);
+}
+
void CachedImage::destroyDecodedData()
{
bool canDeleteImage = !m_image || (m_image->hasOneRef() && m_image->isBitmapImage());
diff --git a/Source/WebCore/loader/cache/CachedImage.h b/Source/WebCore/loader/cache/CachedImage.h
index bc1bfb194..e7184e130 100644
--- a/Source/WebCore/loader/cache/CachedImage.h
+++ b/Source/WebCore/loader/cache/CachedImage.h
@@ -75,14 +75,12 @@ public:
virtual void data(PassRefPtr<SharedBuffer> data, bool allDataReceived);
virtual void error(CachedResource::Status);
+ virtual void setResponse(const ResourceResponse&);
// For compatibility, images keep loading even if there are HTTP errors.
virtual bool shouldIgnoreHTTPStatusCodeErrors() const { return true; }
virtual bool isImage() const { return true; }
-
- void clear();
-
bool stillNeedsLoad() const { return !errorOccurred() && status() == Unknown && !isLoading(); }
void load();
@@ -97,6 +95,8 @@ public:
private:
Image* lookupOrCreateImageForRenderer(const RenderObject*);
+ void clear();
+
void createImage();
size_t maximumDecodedImageSize();
// If not null, changeRect is the changed part of the image.
diff --git a/Source/WebCore/loader/cache/CachedResource.cpp b/Source/WebCore/loader/cache/CachedResource.cpp
index d003c4ad2..80d373c30 100644
--- a/Source/WebCore/loader/cache/CachedResource.cpp
+++ b/Source/WebCore/loader/cache/CachedResource.cpp
@@ -140,6 +140,7 @@ CachedResource::CachedResource(const ResourceRequest& request, Type type)
, m_requestedFromNetworkingLayer(false)
, m_inCache(false)
, m_loading(false)
+ , m_switchingClientsToRevalidatedResource(false)
, m_type(type)
, m_status(Pending)
#ifndef NDEBUG
@@ -214,7 +215,7 @@ void CachedResource::load(CachedResourceLoader* cachedResourceLoader, const Reso
m_resourceRequest.setPriority(loadPriority());
m_loader = resourceLoadScheduler()->scheduleSubresourceLoad(cachedResourceLoader->document()->frame(), this, m_resourceRequest, m_resourceRequest.priority(), options);
- if (!m_loader || m_loader->reachedTerminalState()) {
+ if (!m_loader) {
// FIXME: What if resources in other frames were waiting for this revalidation?
LOG(ResourceLoading, "Cannot start loading '%s'", url().string().latin1().data());
if (m_resourceToRevalidate)
@@ -224,7 +225,6 @@ void CachedResource::load(CachedResourceLoader* cachedResourceLoader, const Reso
}
m_status = Pending;
- cachedResourceLoader->incrementRequestCount(this);
}
void CachedResource::checkNotify()
@@ -521,6 +521,9 @@ void CachedResource::setResourceToRevalidate(CachedResource* resource)
void CachedResource::clearResourceToRevalidate()
{
ASSERT(m_resourceToRevalidate);
+ if (m_switchingClientsToRevalidatedResource)
+ return;
+
// A resource may start revalidation before this method has been called, so check that this resource is still the proxy resource before clearing it out.
if (m_resourceToRevalidate->m_proxyResource == this) {
m_resourceToRevalidate->m_proxyResource = 0;
@@ -539,6 +542,7 @@ void CachedResource::switchClientsToRevalidatedResource()
LOG(ResourceLoading, "CachedResource %p switchClientsToRevalidatedResource %p", this, m_resourceToRevalidate);
+ m_switchingClientsToRevalidatedResource = true;
HashSet<CachedResourceHandleBase*>::iterator end = m_handlesToRevalidate.end();
for (HashSet<CachedResourceHandleBase*>::iterator it = m_handlesToRevalidate.begin(); it != end; ++it) {
CachedResourceHandleBase* handle = *it;
@@ -566,10 +570,14 @@ void CachedResource::switchClientsToRevalidatedResource()
for (unsigned n = 0; n < moveCount; ++n)
m_resourceToRevalidate->addClientToSet(clientsToMove[n]);
for (unsigned n = 0; n < moveCount; ++n) {
+ // Calling didAddClient may do anything, including trying to cancel revalidation.
+ // Assert that it didn't succeed.
+ ASSERT(m_resourceToRevalidate);
// Calling didAddClient for a client may end up removing another client. In that case it won't be in the set anymore.
if (m_resourceToRevalidate->m_clients.contains(clientsToMove[n]))
m_resourceToRevalidate->didAddClient(clientsToMove[n]);
}
+ m_switchingClientsToRevalidatedResource = false;
}
void CachedResource::updateResponseAfterRevalidation(const ResourceResponse& validatingResponse)
diff --git a/Source/WebCore/loader/cache/CachedResource.h b/Source/WebCore/loader/cache/CachedResource.h
index eac262101..b87da71ac 100644
--- a/Source/WebCore/loader/cache/CachedResource.h
+++ b/Source/WebCore/loader/cache/CachedResource.h
@@ -293,6 +293,8 @@ private:
bool m_inCache : 1;
bool m_loading : 1;
+ bool m_switchingClientsToRevalidatedResource : 1;
+
unsigned m_type : 4; // Type
unsigned m_status : 3; // Status
diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.cpp b/Source/WebCore/loader/cache/CachedResourceLoader.cpp
index c7f068632..5df4a0dc3 100644
--- a/Source/WebCore/loader/cache/CachedResourceLoader.cpp
+++ b/Source/WebCore/loader/cache/CachedResourceLoader.cpp
@@ -608,8 +608,8 @@ void CachedResourceLoader::printAccessDeniedMessage(const KURL& url) const
else
message = "Unsafe attempt to load URL " + url.string() + " from frame with URL " + m_document->url().string() + ". Domains, protocols and ports must match.\n";
- // FIXME: provide a real line number and source URL.
- frame()->domWindow()->console()->addMessage(OtherMessageSource, LogMessageType, ErrorMessageLevel, message, 1, String());
+ // FIXME: provide line number and source URL.
+ frame()->domWindow()->console()->addMessage(OtherMessageSource, LogMessageType, ErrorMessageLevel, message);
}
void CachedResourceLoader::setAutoLoadImages(bool enable)
diff --git a/Source/WebCore/loader/cache/CachedShader.cpp b/Source/WebCore/loader/cache/CachedShader.cpp
index 8d7f06b3f..16d780adc 100644
--- a/Source/WebCore/loader/cache/CachedShader.cpp
+++ b/Source/WebCore/loader/cache/CachedShader.cpp
@@ -62,11 +62,8 @@ const String& CachedShader::shaderString()
void CachedShader::data(PassRefPtr<SharedBuffer> data, bool allDataReceived)
{
- if (allDataReceived) {
+ if (allDataReceived)
m_data = data;
- return;
- }
-
CachedResource::data(data, allDataReceived);
}
diff --git a/Source/WebCore/loader/cache/MemoryCache.cpp b/Source/WebCore/loader/cache/MemoryCache.cpp
index 7de315ef0..f46889fd0 100644
--- a/Source/WebCore/loader/cache/MemoryCache.cpp
+++ b/Source/WebCore/loader/cache/MemoryCache.cpp
@@ -125,6 +125,7 @@ void MemoryCache::revalidationSucceeded(CachedResource* revalidatingResource, co
adjustSize(resource->hasClients(), delta);
revalidatingResource->switchClientsToRevalidatedResource();
+ ASSERT(!revalidatingResource->m_deleted);
// this deletes the revalidating resource
revalidatingResource->clearResourceToRevalidate();
}