summaryrefslogtreecommitdiff
path: root/Source/WebCore/loader/cache
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-09-18 15:53:33 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-09-18 15:53:33 +0200
commit6bbb7fbbac94d0f511a7bd0cbd50854ab643bfb2 (patch)
treed9c68d1cca0b3e352f1e438561f3e504e641a08f /Source/WebCore/loader/cache
parentd0424a769059c84ae20beb3c217812792ea6726b (diff)
downloadqtwebkit-6bbb7fbbac94d0f511a7bd0cbd50854ab643bfb2.tar.gz
Imported WebKit commit c7503cef7ecb236730d1309676ab9fc723fd061d (http://svn.webkit.org/repository/webkit/trunk@128886)
New snapshot with various build fixes
Diffstat (limited to 'Source/WebCore/loader/cache')
-rw-r--r--Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp7
-rw-r--r--Source/WebCore/loader/cache/CachedFont.cpp2
-rw-r--r--Source/WebCore/loader/cache/CachedImage.cpp4
-rw-r--r--Source/WebCore/loader/cache/CachedImage.h2
-rwxr-xr-xSource/WebCore/loader/cache/CachedResource.cpp24
-rw-r--r--Source/WebCore/loader/cache/CachedResource.h1
-rw-r--r--Source/WebCore/loader/cache/CachedResourceHandle.cpp2
-rw-r--r--Source/WebCore/loader/cache/CachedResourceLoader.cpp53
-rw-r--r--Source/WebCore/loader/cache/CachedResourceLoader.h10
-rw-r--r--Source/WebCore/loader/cache/CachedSVGDocument.cpp2
-rw-r--r--Source/WebCore/loader/cache/CachedScript.cpp2
-rw-r--r--Source/WebCore/loader/cache/CachedShader.cpp2
-rw-r--r--Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp2
-rw-r--r--Source/WebCore/loader/cache/MemoryCache.cpp4
14 files changed, 77 insertions, 40 deletions
diff --git a/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp b/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp
index 96432af2b..f18825f58 100644
--- a/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp
+++ b/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp
@@ -185,8 +185,7 @@ PassRefPtr<StyleSheetContents> CachedCSSStyleSheet::restoreParsedStyleSheet(cons
void CachedCSSStyleSheet::saveParsedStyleSheet(PassRefPtr<StyleSheetContents> sheet)
{
ASSERT(sheet && sheet->isCacheable());
- if (m_parsedStyleSheetCache == sheet)
- return;
+
if (m_parsedStyleSheetCache)
m_parsedStyleSheetCache->removedFromMemoryCache();
m_parsedStyleSheetCache = sheet;
@@ -200,8 +199,8 @@ void CachedCSSStyleSheet::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo)
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceCSS);
CachedResource::reportMemoryUsage(memoryObjectInfo);
info.addMember(m_decoder);
- info.addInstrumentedMember(m_parsedStyleSheetCache);
- info.addInstrumentedMember(m_decodedSheetText);
+ info.addMember(m_parsedStyleSheetCache);
+ info.addMember(m_decodedSheetText);
}
}
diff --git a/Source/WebCore/loader/cache/CachedFont.cpp b/Source/WebCore/loader/cache/CachedFont.cpp
index 4c4569ca3..d9a6752b2 100644
--- a/Source/WebCore/loader/cache/CachedFont.cpp
+++ b/Source/WebCore/loader/cache/CachedFont.cpp
@@ -203,7 +203,7 @@ void CachedFont::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceFont);
CachedResource::reportMemoryUsage(memoryObjectInfo);
#if ENABLE(SVG_FONTS)
- info.addInstrumentedMember(m_externalSVGDocument);
+ info.addMember(m_externalSVGDocument);
#endif
#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA
info.addMember(m_fontData);
diff --git a/Source/WebCore/loader/cache/CachedImage.cpp b/Source/WebCore/loader/cache/CachedImage.cpp
index 1527a63af..fa83a54f6 100644
--- a/Source/WebCore/loader/cache/CachedImage.cpp
+++ b/Source/WebCore/loader/cache/CachedImage.cpp
@@ -79,7 +79,7 @@ CachedImage::~CachedImage()
void CachedImage::load(CachedResourceLoader* cachedResourceLoader, const ResourceLoaderOptions& options)
{
- if (!cachedResourceLoader || cachedResourceLoader->autoLoadImages())
+ if (!cachedResourceLoader || !cachedResourceLoader->shouldDeferImageLoad(m_resourceRequest.url()))
CachedResource::load(cachedResourceLoader, options);
else
setLoading(false);
@@ -474,7 +474,7 @@ void CachedImage::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceImage);
CachedResource::reportMemoryUsage(memoryObjectInfo);
- info.addInstrumentedMember(m_image);
+ info.addMember(m_image);
#if ENABLE(SVG)
info.addMember(m_svgImageCache);
#endif
diff --git a/Source/WebCore/loader/cache/CachedImage.h b/Source/WebCore/loader/cache/CachedImage.h
index 4865c7e24..0c452c44a 100644
--- a/Source/WebCore/loader/cache/CachedImage.h
+++ b/Source/WebCore/loader/cache/CachedImage.h
@@ -82,7 +82,7 @@ public:
virtual bool shouldIgnoreHTTPStatusCodeErrors() const { return true; }
virtual bool isImage() const { return true; }
- bool stillNeedsLoad() const { return !errorOccurred() && status() == Unknown && !isLoading(); }
+ virtual bool stillNeedsLoad() const OVERRIDE { return !errorOccurred() && status() == Unknown && !isLoading(); }
void load();
// ImageObserver
diff --git a/Source/WebCore/loader/cache/CachedResource.cpp b/Source/WebCore/loader/cache/CachedResource.cpp
index 83bc8eed3..aa6c5a7fa 100755
--- a/Source/WebCore/loader/cache/CachedResource.cpp
+++ b/Source/WebCore/loader/cache/CachedResource.cpp
@@ -390,7 +390,7 @@ void CachedResource::didAddClient(CachedResourceClient* c)
m_clients.add(c);
m_clientsAwaitingCallback.remove(c);
}
- if (!isLoading())
+ if (!isLoading() && !stillNeedsLoad())
c->notifyFinished(this);
}
@@ -806,18 +806,18 @@ void CachedResource::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResource);
info.addMember(m_resourceRequest);
info.addHashSet(m_clients);
- info.addInstrumentedMember(m_accept);
- info.addInstrumentedMember(m_loader);
- info.addInstrumentedMember(m_response);
- info.addInstrumentedMember(m_data);
+ info.addMember(m_accept);
+ info.addMember(m_loader);
+ info.addMember(m_response);
+ info.addMember(m_data);
info.addMember(m_cachedMetadata);
- info.addInstrumentedMember(m_nextInAllResourcesList);
- info.addInstrumentedMember(m_prevInAllResourcesList);
- info.addInstrumentedMember(m_nextInLiveResourcesList);
- info.addInstrumentedMember(m_prevInLiveResourcesList);
- info.addInstrumentedMember(m_owningCachedResourceLoader);
- info.addInstrumentedMember(m_resourceToRevalidate);
- info.addInstrumentedMember(m_proxyResource);
+ info.addMember(m_nextInAllResourcesList);
+ info.addMember(m_prevInAllResourcesList);
+ info.addMember(m_nextInLiveResourcesList);
+ info.addMember(m_prevInLiveResourcesList);
+ info.addMember(m_owningCachedResourceLoader);
+ info.addMember(m_resourceToRevalidate);
+ info.addMember(m_proxyResource);
info.addInstrumentedHashSet(m_handlesToRevalidate);
if (m_purgeableData && !m_purgeableData->wasPurged())
diff --git a/Source/WebCore/loader/cache/CachedResource.h b/Source/WebCore/loader/cache/CachedResource.h
index 0cad3ee7c..7edafd508 100644
--- a/Source/WebCore/loader/cache/CachedResource.h
+++ b/Source/WebCore/loader/cache/CachedResource.h
@@ -144,6 +144,7 @@ public:
bool isLoading() const { return m_loading; }
void setLoading(bool b) { m_loading = b; }
+ virtual bool stillNeedsLoad() const { return false; }
SubresourceLoader* loader() { return m_loader.get(); }
diff --git a/Source/WebCore/loader/cache/CachedResourceHandle.cpp b/Source/WebCore/loader/cache/CachedResourceHandle.cpp
index d95459f06..6e4964ee9 100644
--- a/Source/WebCore/loader/cache/CachedResourceHandle.cpp
+++ b/Source/WebCore/loader/cache/CachedResourceHandle.cpp
@@ -44,7 +44,7 @@ void CachedResourceHandleBase::setResource(CachedResource* resource)
void CachedResourceHandleBase::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::MemoryCacheStructures);
- info.addInstrumentedMember(m_resource);
+ info.addMember(m_resource);
}
diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.cpp b/Source/WebCore/loader/cache/CachedResourceLoader.cpp
index 5fd7c505a..0e8c3f6a2 100644
--- a/Source/WebCore/loader/cache/CachedResourceLoader.cpp
+++ b/Source/WebCore/loader/cache/CachedResourceLoader.cpp
@@ -46,6 +46,7 @@
#include "MemoryCache.h"
#include "PingLoader.h"
#include "ResourceLoadScheduler.h"
+#include "SchemeRegistry.h"
#include "SecurityOrigin.h"
#include "Settings.h"
#include <wtf/UnusedParam.h>
@@ -115,6 +116,7 @@ CachedResourceLoader::CachedResourceLoader(Document* document)
, m_requestCount(0)
, m_garbageCollectDocumentResourcesTimer(this, &CachedResourceLoader::garbageCollectDocumentResourcesTimerFired)
, m_autoLoadImages(true)
+ , m_imagesEnabled(true)
, m_allowStaleResources(false)
{
}
@@ -160,7 +162,7 @@ CachedResourceHandle<CachedImage> CachedResourceLoader::requestImage(ResourceReq
}
}
CachedResourceHandle<CachedImage> resource(static_cast<CachedImage*>(requestResource(CachedResource::ImageResource, request, String(), defaultCachedResourceOptions()).get()));
- if (autoLoadImages() && resource && resource->stillNeedsLoad())
+ if (!shouldDeferImageLoad(request.url()) && resource && resource->stillNeedsLoad())
resource->load(this, defaultCachedResourceOptions());
return resource;
}
@@ -362,12 +364,6 @@ bool CachedResourceLoader::canRequest(CachedResource::Type type, const KURL& url
case CachedResource::ImageResource:
if (!m_document->contentSecurityPolicy()->allowImageFromSource(url))
return false;
-
- if (frame()) {
- Settings* settings = frame()->settings();
- if (!frame()->loader()->client()->allowImage(!settings || settings->areImagesEnabled(), url))
- return false;
- }
break;
case CachedResource::FontResource: {
if (!m_document->contentSecurityPolicy()->allowFontFromSource(url))
@@ -514,11 +510,11 @@ CachedResourceLoader::RevalidationPolicy CachedResourceLoader::determineRevalida
{
if (!existingResource)
return Load;
-
+
// We already have a preload going for this URL.
if (forPreload && existingResource->isPreloaded())
return Use;
-
+
// If the same URL has been loaded as a different type, we need to reload.
if (existingResource->type() != type) {
LOG(ResourceLoading, "CachedResourceLoader::determineRevalidationPolicy reloading due to type mismatch.");
@@ -533,6 +529,11 @@ CachedResourceLoader::RevalidationPolicy CachedResourceLoader::determineRevalida
// of things about how revalidation works that manual headers violate, so punt to Reload instead.
if (request.isConditional())
return Reload;
+
+ // Do not load from cache if images are not enabled. The load for this image will be blocked
+ // in requestImage.
+ if (existingResource->type() == CachedResource::ImageResource && !clientAllowsImage(existingResource->url()))
+ return Reload;
// Don't reload resources while pasting.
if (m_allowStaleResources)
@@ -629,13 +630,41 @@ void CachedResourceLoader::setAutoLoadImages(bool enable)
if (!m_autoLoadImages)
return;
+ reloadImagesIfNotDeferred();
+}
+
+void CachedResourceLoader::setImagesEnabled(bool enable)
+{
+ if (enable == m_imagesEnabled)
+ return;
+
+ m_imagesEnabled = enable;
+
+ if (!m_imagesEnabled)
+ return;
+
+ reloadImagesIfNotDeferred();
+}
+
+bool CachedResourceLoader::clientAllowsImage(const KURL& url) const
+{
+ return !frame() || frame()->loader()->client()->allowImage(m_imagesEnabled, url);
+}
+
+bool CachedResourceLoader::shouldDeferImageLoad(const KURL& url) const
+{
+ return !clientAllowsImage(url) || !m_autoLoadImages;
+}
+
+void CachedResourceLoader::reloadImagesIfNotDeferred()
+{
DocumentResourceMap::iterator end = m_documentResources.end();
for (DocumentResourceMap::iterator it = m_documentResources.begin(); it != end; ++it) {
CachedResource* resource = it->second.get();
if (resource->type() == CachedResource::ImageResource) {
CachedImage* image = const_cast<CachedImage*>(static_cast<const CachedImage*>(resource));
- if (image->stillNeedsLoad())
+ if (image->stillNeedsLoad() && !shouldDeferImageLoad(image->url()))
image->load(this, defaultCachedResourceOptions());
}
}
@@ -883,8 +912,8 @@ void CachedResourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo)
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Loader);
info.addHashMap(m_documentResources);
for (DocumentResourceMap::const_iterator i = m_documentResources.begin(); i != m_documentResources.end(); ++i) {
- info.addInstrumentedMember(i->first);
- info.addInstrumentedMember(i->second);
+ info.addMember(i->first);
+ info.addMember(i->second);
}
info.addHashSet(m_validatedURLs);
if (m_preloads)
diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.h b/Source/WebCore/loader/cache/CachedResourceLoader.h
index f4755c22f..21e4f391d 100644
--- a/Source/WebCore/loader/cache/CachedResourceLoader.h
+++ b/Source/WebCore/loader/cache/CachedResourceLoader.h
@@ -97,6 +97,10 @@ public:
bool autoLoadImages() const { return m_autoLoadImages; }
void setAutoLoadImages(bool);
+
+ void setImagesEnabled(bool);
+
+ bool shouldDeferImageLoad(const KURL&) const;
CachePolicy cachePolicy() const;
@@ -135,6 +139,9 @@ private:
void garbageCollectDocumentResourcesTimerFired(Timer<CachedResourceLoader>*);
void performPostLoadActions();
+
+ bool clientAllowsImage(const KURL&) const;
+ void reloadImagesIfNotDeferred();
HashSet<String> m_validatedURLs;
mutable DocumentResourceMap m_documentResources;
@@ -152,8 +159,9 @@ private:
Timer<CachedResourceLoader> m_garbageCollectDocumentResourcesTimer;
- // 30 bits left
+ // 29 bits left
bool m_autoLoadImages : 1;
+ bool m_imagesEnabled : 1;
bool m_allowStaleResources : 1;
};
diff --git a/Source/WebCore/loader/cache/CachedSVGDocument.cpp b/Source/WebCore/loader/cache/CachedSVGDocument.cpp
index 699b6886a..68f2fb483 100644
--- a/Source/WebCore/loader/cache/CachedSVGDocument.cpp
+++ b/Source/WebCore/loader/cache/CachedSVGDocument.cpp
@@ -75,7 +75,7 @@ void CachedSVGDocument::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) co
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceSVG);
CachedResource::reportMemoryUsage(memoryObjectInfo);
- info.addInstrumentedMember(m_document);
+ info.addMember(m_document);
info.addMember(m_decoder);
}
diff --git a/Source/WebCore/loader/cache/CachedScript.cpp b/Source/WebCore/loader/cache/CachedScript.cpp
index 5c493397a..41fea3d44 100644
--- a/Source/WebCore/loader/cache/CachedScript.cpp
+++ b/Source/WebCore/loader/cache/CachedScript.cpp
@@ -123,7 +123,7 @@ void CachedScript::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceScript);
CachedResource::reportMemoryUsage(memoryObjectInfo);
- info.addInstrumentedMember(m_script);
+ info.addMember(m_script);
info.addMember(m_decoder);
#if USE(JSC)
info.addMember(m_sourceProviderCache);
diff --git a/Source/WebCore/loader/cache/CachedShader.cpp b/Source/WebCore/loader/cache/CachedShader.cpp
index 8dc381c46..d31e267de 100644
--- a/Source/WebCore/loader/cache/CachedShader.cpp
+++ b/Source/WebCore/loader/cache/CachedShader.cpp
@@ -73,7 +73,7 @@ void CachedShader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceShader);
CachedResource::reportMemoryUsage(memoryObjectInfo);
info.addMember(m_decoder);
- info.addInstrumentedMember(m_shaderString);
+ info.addMember(m_shaderString);
}
} // namespace WebCore
diff --git a/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp b/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp
index 81e17d8cb..de6f40ea5 100644
--- a/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp
+++ b/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp
@@ -93,7 +93,7 @@ void CachedXSLStyleSheet::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo)
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CachedResourceXSLT);
CachedResource::reportMemoryUsage(memoryObjectInfo);
- info.addInstrumentedMember(m_sheet);
+ info.addMember(m_sheet);
info.addMember(m_decoder);
}
diff --git a/Source/WebCore/loader/cache/MemoryCache.cpp b/Source/WebCore/loader/cache/MemoryCache.cpp
index aaf852a95..66d3201eb 100644
--- a/Source/WebCore/loader/cache/MemoryCache.cpp
+++ b/Source/WebCore/loader/cache/MemoryCache.cpp
@@ -721,8 +721,8 @@ void MemoryCache::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
info.addHashMap(m_resources);
CachedResourceMap::const_iterator e = m_resources.end();
for (CachedResourceMap::const_iterator i = m_resources.begin(); i != e; ++i) {
- info.addInstrumentedMember(i->first);
- info.addInstrumentedMember(i->second);
+ info.addMember(i->first);
+ info.addMember(i->second);
}
info.addVector(m_allResources);
info.addMember(m_liveDecodedResources);