diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-09-25 13:02:02 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-09-25 13:02:02 +0200 |
commit | 715be629d51174233403237bfc563cf150087dc8 (patch) | |
tree | 4cff72df808db977624338b0a38d8b6d1bd73c57 /Source/WebCore/loader/cache | |
parent | dc6262b587c71c14e30d93e57ed812e36a79a33e (diff) | |
download | qtwebkit-715be629d51174233403237bfc563cf150087dc8.tar.gz |
Imported WebKit commit ce614b0924ba46f78d4435e28ff93c8525fbb7cc (http://svn.webkit.org/repository/webkit/trunk@129485)
New snapshot that includes MingW build fixes
Diffstat (limited to 'Source/WebCore/loader/cache')
-rw-r--r-- | Source/WebCore/loader/cache/CachedImage.cpp | 1 | ||||
-rw-r--r-- | Source/WebCore/loader/cache/CachedImage.h | 3 | ||||
-rwxr-xr-x | Source/WebCore/loader/cache/CachedResource.cpp | 3 | ||||
-rw-r--r-- | Source/WebCore/loader/cache/CachedResource.h | 2 | ||||
-rw-r--r-- | Source/WebCore/loader/cache/CachedResourceLoader.cpp | 116 | ||||
-rw-r--r-- | Source/WebCore/loader/cache/CachedResourceLoader.h | 19 | ||||
-rw-r--r-- | Source/WebCore/loader/cache/MemoryCache.cpp | 3 |
7 files changed, 84 insertions, 63 deletions
diff --git a/Source/WebCore/loader/cache/CachedImage.cpp b/Source/WebCore/loader/cache/CachedImage.cpp index 4316616b3..41075a7b3 100644 --- a/Source/WebCore/loader/cache/CachedImage.cpp +++ b/Source/WebCore/loader/cache/CachedImage.cpp @@ -29,7 +29,6 @@ #include "CachedResourceClient.h" #include "CachedResourceClientWalker.h" #include "CachedResourceLoader.h" -#include "Frame.h" #include "FrameLoaderClient.h" #include "FrameLoaderTypes.h" #include "FrameView.h" diff --git a/Source/WebCore/loader/cache/CachedImage.h b/Source/WebCore/loader/cache/CachedImage.h index 4865c7e24..078f7ab1c 100644 --- a/Source/WebCore/loader/cache/CachedImage.h +++ b/Source/WebCore/loader/cache/CachedImage.h @@ -82,8 +82,7 @@ public: virtual bool shouldIgnoreHTTPStatusCodeErrors() const { return true; } virtual bool isImage() const { return true; } - bool stillNeedsLoad() const { return !errorOccurred() && status() == Unknown && !isLoading(); } - void load(); + virtual bool stillNeedsLoad() const OVERRIDE { return !errorOccurred() && status() == Unknown && !isLoading(); } // ImageObserver virtual void decodedSizeChanged(const Image* image, int delta); diff --git a/Source/WebCore/loader/cache/CachedResource.cpp b/Source/WebCore/loader/cache/CachedResource.cpp index 43c3d144f..33d1ba823 100755 --- a/Source/WebCore/loader/cache/CachedResource.cpp +++ b/Source/WebCore/loader/cache/CachedResource.cpp @@ -32,7 +32,6 @@ #include "CachedResourceLoader.h" #include "CrossOriginAccessControl.h" #include "Document.h" -#include "Frame.h" #include "FrameLoaderClient.h" #include "InspectorInstrumentation.h" #include "KURL.h" @@ -390,7 +389,7 @@ void CachedResource::didAddClient(CachedResourceClient* c) m_clients.add(c); m_clientsAwaitingCallback.remove(c); } - if (!isLoading()) + if (!isLoading() && !stillNeedsLoad()) c->notifyFinished(this); } diff --git a/Source/WebCore/loader/cache/CachedResource.h b/Source/WebCore/loader/cache/CachedResource.h index 0cad3ee7c..b739d68af 100644 --- a/Source/WebCore/loader/cache/CachedResource.h +++ b/Source/WebCore/loader/cache/CachedResource.h @@ -45,7 +45,6 @@ class CachedMetadata; class CachedResourceClient; class CachedResourceHandleBase; class CachedResourceLoader; -class Frame; class InspectorResource; class PurgeableBuffer; class SecurityOrigin; @@ -144,6 +143,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/CachedResourceLoader.cpp b/Source/WebCore/loader/cache/CachedResourceLoader.cpp index 353a62aa6..593d532a1 100644 --- a/Source/WebCore/loader/cache/CachedResourceLoader.cpp +++ b/Source/WebCore/loader/cache/CachedResourceLoader.cpp @@ -115,6 +115,7 @@ CachedResourceLoader::CachedResourceLoader(Document* document) , m_requestCount(0) , m_garbageCollectDocumentResourcesTimer(this, &CachedResourceLoader::garbageCollectDocumentResourcesTimerFired) , m_autoLoadImages(true) + , m_imagesEnabled(true) , m_allowStaleResources(false) { } @@ -159,10 +160,7 @@ CachedResourceHandle<CachedImage> CachedResourceLoader::requestImage(ResourceReq return 0; } } - CachedResourceHandle<CachedImage> resource(static_cast<CachedImage*>(requestResource(CachedResource::ImageResource, request, String(), defaultCachedResourceOptions()).get())); - if (autoLoadImages() && resource && resource->stillNeedsLoad()) - resource->load(this, defaultCachedResourceOptions()); - return resource; + return static_cast<CachedImage*>(requestResource(CachedResource::ImageResource, request, String(), defaultCachedResourceOptions(), ResourceLoadPriorityUnresolved, false, clientDefersImage(request.url()) ? DeferredByClient : NoDefer).get()); } CachedResourceHandle<CachedFont> CachedResourceLoader::requestFont(ResourceRequest& request) @@ -362,12 +360,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)) @@ -401,7 +393,7 @@ bool CachedResourceLoader::canRequest(CachedResource::Type type, const KURL& url return true; } -CachedResourceHandle<CachedResource> CachedResourceLoader::requestResource(CachedResource::Type type, ResourceRequest& request, const String& charset, const ResourceLoaderOptions& options, ResourceLoadPriority priority, bool forPreload) +CachedResourceHandle<CachedResource> CachedResourceLoader::requestResource(CachedResource::Type type, ResourceRequest& request, const String& charset, const ResourceLoaderOptions& options, ResourceLoadPriority priority, bool forPreload, DeferOption defer) { KURL url = request.url(); @@ -430,16 +422,16 @@ CachedResourceHandle<CachedResource> CachedResourceLoader::requestResource(Cache if (request.url() != url) request.setURL(url); - switch (determineRevalidationPolicy(type, request, forPreload, resource.get())) { - case Load: - resource = loadResource(type, request, charset, priority, options); - break; + const RevalidationPolicy policy = determineRevalidationPolicy(type, request, forPreload, resource.get(), defer); + switch (policy) { case Reload: memoryCache()->remove(resource.get()); - resource = loadResource(type, request, charset, priority, options); + // Fall through + case Load: + resource = loadResource(type, request, charset); break; case Revalidate: - resource = revalidateResource(resource.get(), priority, options); + resource = revalidateResource(resource.get()); break; case Use: memoryCache()->resourceAccessed(resource.get()); @@ -450,12 +442,27 @@ CachedResourceHandle<CachedResource> CachedResourceLoader::requestResource(Cache if (!resource) return 0; + resource->setLoadPriority(priority); + if ((policy != Use || resource->stillNeedsLoad()) && NoDefer == defer) { + resource->load(this, options); + + // We don't support immediate loads, but we do support immediate failure. + if (resource->errorOccurred()) { + if (resource->inCache()) + memoryCache()->remove(resource.get()); + return 0; + } + } + + if (!request.url().protocolIsData()) + m_validatedURLs.add(request.url()); + ASSERT(resource->url() == url.string()); m_documentResources.set(resource->url(), resource); return resource; } -CachedResourceHandle<CachedResource> CachedResourceLoader::revalidateResource(CachedResource* resource, ResourceLoadPriority priority, const ResourceLoaderOptions& options) +CachedResourceHandle<CachedResource> CachedResourceLoader::revalidateResource(CachedResource* resource) { ASSERT(resource); ASSERT(resource->inCache()); @@ -465,7 +472,6 @@ CachedResourceHandle<CachedResource> CachedResourceLoader::revalidateResource(Ca // Copy the URL out of the resource to be revalidated in case it gets deleted by the remove() call below. String url = resource->url(); - bool urlProtocolIsData = resource->url().protocolIsData(); CachedResourceHandle<CachedResource> newResource = createResource(resource->type(), resource->resourceRequest(), resource->encoding()); LOG(ResourceLoading, "Resource %p created to revalidate %p", newResource.get(), resource); @@ -473,16 +479,10 @@ CachedResourceHandle<CachedResource> CachedResourceLoader::revalidateResource(Ca memoryCache()->remove(resource); memoryCache()->add(newResource.get()); - - newResource->setLoadPriority(priority); - newResource->load(this, options); - - if (!urlProtocolIsData) - m_validatedURLs.add(url); return newResource; } -CachedResourceHandle<CachedResource> CachedResourceLoader::loadResource(CachedResource::Type type, ResourceRequest& request, const String& charset, ResourceLoadPriority priority, const ResourceLoaderOptions& options) +CachedResourceHandle<CachedResource> CachedResourceLoader::loadResource(CachedResource::Type type, ResourceRequest& request, const String& charset) { ASSERT(!memoryCache()->resourceForURL(request.url())); @@ -490,35 +490,20 @@ CachedResourceHandle<CachedResource> CachedResourceLoader::loadResource(CachedRe CachedResourceHandle<CachedResource> resource = createResource(type, request, charset); - bool inCache = memoryCache()->add(resource.get()); - - resource->setLoadPriority(priority); - resource->load(this, options); - - if (!inCache) + if (!memoryCache()->add(resource.get())) resource->setOwningCachedResourceLoader(this); - - // We don't support immediate loads, but we do support immediate failure. - if (resource->errorOccurred()) { - if (inCache) - memoryCache()->remove(resource.get()); - return 0; - } - - if (!request.url().protocolIsData()) - m_validatedURLs.add(request.url()); return resource; } -CachedResourceLoader::RevalidationPolicy CachedResourceLoader::determineRevalidationPolicy(CachedResource::Type type, ResourceRequest& request, bool forPreload, CachedResource* existingResource) const +CachedResourceLoader::RevalidationPolicy CachedResourceLoader::determineRevalidationPolicy(CachedResource::Type type, ResourceRequest& request, bool forPreload, CachedResource* existingResource, DeferOption defer) const { 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 +518,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 CachedImage::load. + if (DeferredByClient == defer) + return Reload; // Don't reload resources while pasting. if (m_allowStaleResources) @@ -629,15 +619,39 @@ 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::clientDefersImage(const KURL& url) const +{ + return frame() && !frame()->loader()->client()->allowImage(m_imagesEnabled, url); +} + +bool CachedResourceLoader::shouldDeferImageLoad(const KURL& url) const +{ + return clientDefersImage(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()) - image->load(this, defaultCachedResourceOptions()); - } + if (resource->type() == CachedResource::ImageResource && resource->stillNeedsLoad() && !clientDefersImage(resource->url())) + const_cast<CachedResource*>(resource)->load(this, defaultCachedResourceOptions()); } } diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.h b/Source/WebCore/loader/cache/CachedResourceLoader.h index f4755c22f..b5dc69482 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; @@ -122,19 +126,23 @@ public: void reportMemoryUsage(MemoryObjectInfo*) const; private: - CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, ResourceRequest&, const String& charset, const ResourceLoaderOptions&, ResourceLoadPriority = ResourceLoadPriorityUnresolved, bool isPreload = false); - CachedResourceHandle<CachedResource> revalidateResource(CachedResource*, ResourceLoadPriority, const ResourceLoaderOptions&); - CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, ResourceRequest&, const String& charset, ResourceLoadPriority, const ResourceLoaderOptions&); + enum DeferOption { NoDefer, DeferredByClient }; + CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, ResourceRequest&, const String& charset, const ResourceLoaderOptions&, ResourceLoadPriority = ResourceLoadPriorityUnresolved, bool isPreload = false, DeferOption = NoDefer); + CachedResourceHandle<CachedResource> revalidateResource(CachedResource*); + CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, ResourceRequest&, const String& charset); void requestPreload(CachedResource::Type, ResourceRequest&, const String& charset); enum RevalidationPolicy { Use, Revalidate, Reload, Load }; - RevalidationPolicy determineRevalidationPolicy(CachedResource::Type, ResourceRequest&, bool forPreload, CachedResource* existingResource) const; + RevalidationPolicy determineRevalidationPolicy(CachedResource::Type, ResourceRequest&, bool forPreload, CachedResource* existingResource, DeferOption) const; void notifyLoadedFromMemoryCache(CachedResource*); bool checkInsecureContent(CachedResource::Type, const KURL&) const; void garbageCollectDocumentResourcesTimerFired(Timer<CachedResourceLoader>*); void performPostLoadActions(); + + bool clientDefersImage(const KURL&) const; + void reloadImagesIfNotDeferred(); HashSet<String> m_validatedURLs; mutable DocumentResourceMap m_documentResources; @@ -152,8 +160,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/MemoryCache.cpp b/Source/WebCore/loader/cache/MemoryCache.cpp index 66d3201eb..c1af09d69 100644 --- a/Source/WebCore/loader/cache/MemoryCache.cpp +++ b/Source/WebCore/loader/cache/MemoryCache.cpp @@ -45,6 +45,7 @@ #include "WorkerThread.h" #include <stdio.h> #include <wtf/CurrentTime.h> +#include <wtf/MemoryInstrumentationVector.h> #include <wtf/TemporaryChange.h> #include <wtf/text/CString.h> @@ -724,7 +725,7 @@ void MemoryCache::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const info.addMember(i->first); info.addMember(i->second); } - info.addVector(m_allResources); + info.addMember(m_allResources); info.addMember(m_liveDecodedResources); } |