diff options
Diffstat (limited to 'Source/WebCore/loader/cache/CachedResourceLoader.h')
-rw-r--r-- | Source/WebCore/loader/cache/CachedResourceLoader.h | 145 |
1 files changed, 75 insertions, 70 deletions
diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.h b/Source/WebCore/loader/cache/CachedResourceLoader.h index bcc793e0c..23eb1dd6f 100644 --- a/Source/WebCore/loader/cache/CachedResourceLoader.h +++ b/Source/WebCore/loader/cache/CachedResourceLoader.h @@ -23,14 +23,15 @@ pages from the web. It has a memory cache for these objects. */ -#ifndef CachedResourceLoader_h -#define CachedResourceLoader_h +#pragma once #include "CachePolicy.h" #include "CachedResource.h" #include "CachedResourceHandle.h" #include "CachedResourceRequest.h" +#include "ContentSecurityPolicy.h" #include "ResourceLoadPriority.h" +#include "ResourceTimingInformation.h" #include "Timer.h" #include <wtf/Deque.h> #include <wtf/HashMap.h> @@ -68,28 +69,26 @@ friend class ImageLoader; friend class ResourceCacheValidationSuppressor; public: - static PassRef<CachedResourceLoader> create(DocumentLoader* documentLoader) { return adoptRef(*new CachedResourceLoader(documentLoader)); } + static Ref<CachedResourceLoader> create(DocumentLoader* documentLoader) { return adoptRef(*new CachedResourceLoader(documentLoader)); } ~CachedResourceLoader(); - CachedResourceHandle<CachedImage> requestImage(CachedResourceRequest&); - CachedResourceHandle<CachedCSSStyleSheet> requestCSSStyleSheet(CachedResourceRequest&); - CachedResourceHandle<CachedCSSStyleSheet> requestUserCSSStyleSheet(CachedResourceRequest&); - CachedResourceHandle<CachedScript> requestScript(CachedResourceRequest&); - CachedResourceHandle<CachedFont> requestFont(CachedResourceRequest&); - CachedResourceHandle<CachedRawResource> requestRawResource(CachedResourceRequest&); - CachedResourceHandle<CachedRawResource> requestMainResource(CachedResourceRequest&); - -#if ENABLE(SVG) - CachedResourceHandle<CachedSVGDocument> requestSVGDocument(CachedResourceRequest&); -#endif + CachedResourceHandle<CachedImage> requestImage(CachedResourceRequest&&); + CachedResourceHandle<CachedCSSStyleSheet> requestCSSStyleSheet(CachedResourceRequest&&); + CachedResourceHandle<CachedCSSStyleSheet> requestUserCSSStyleSheet(CachedResourceRequest&&); + CachedResourceHandle<CachedScript> requestScript(CachedResourceRequest&&); + CachedResourceHandle<CachedFont> requestFont(CachedResourceRequest&&, bool isSVG); + CachedResourceHandle<CachedRawResource> requestMedia(CachedResourceRequest&&); + CachedResourceHandle<CachedRawResource> requestRawResource(CachedResourceRequest&&); + CachedResourceHandle<CachedRawResource> requestMainResource(CachedResourceRequest&&); + CachedResourceHandle<CachedSVGDocument> requestSVGDocument(CachedResourceRequest&&); #if ENABLE(XSLT) - CachedResourceHandle<CachedXSLStyleSheet> requestXSLStyleSheet(CachedResourceRequest&); + CachedResourceHandle<CachedXSLStyleSheet> requestXSLStyleSheet(CachedResourceRequest&&); #endif #if ENABLE(LINK_PREFETCH) - CachedResourceHandle<CachedResource> requestLinkResource(CachedResource::Type, CachedResourceRequest&); + CachedResourceHandle<CachedResource> requestLinkResource(CachedResource::Type, CachedResourceRequest&&); #endif #if ENABLE(VIDEO_TRACK) - CachedResourceHandle<CachedTextTrack> requestTextTrack(CachedResourceRequest&); + CachedResourceHandle<CachedTextTrack> requestTextTrack(CachedResourceRequest&&); #endif // Logs an access denied message to the console for the specified URL. @@ -97,67 +96,89 @@ public: CachedResource* cachedResource(const String& url) const; CachedResource* cachedResource(const URL& url) const; - + typedef HashMap<String, CachedResourceHandle<CachedResource>> DocumentResourceMap; const DocumentResourceMap& allCachedResources() const { return m_documentResources; } bool autoLoadImages() const { return m_autoLoadImages; } void setAutoLoadImages(bool); + bool imagesEnabled() const { return m_imagesEnabled; } void setImagesEnabled(bool); bool shouldDeferImageLoad(const URL&) const; + bool shouldPerformImageLoad(const URL&) const; CachePolicy cachePolicy(CachedResource::Type) const; Frame* frame() const; // Can be null Document* document() const { return m_document; } // Can be null void setDocument(Document* document) { m_document = document; } - void clearDocumentLoader() { m_documentLoader = 0; } + void clearDocumentLoader() { m_documentLoader = nullptr; } + SessionID sessionID() const; - void removeCachedResource(CachedResource*) const; + void removeCachedResource(CachedResource&); - void loadDone(CachedResource*, bool shouldPerformPostLoadActions = true); + void loadDone(bool shouldPerformPostLoadActions = true); - void garbageCollectDocumentResources(); - - void incrementRequestCount(const CachedResource*); - void decrementRequestCount(const CachedResource*); + WEBCORE_EXPORT void garbageCollectDocumentResources(); + + void incrementRequestCount(const CachedResource&); + void decrementRequestCount(const CachedResource&); int requestCount() const { return m_requestCount; } - bool isPreloaded(const String& urlString) const; - void clearPreloads(); - void clearPendingPreloads(); - void preload(CachedResource::Type, CachedResourceRequest&, const String& charset); - void checkForPendingPreloads(); + WEBCORE_EXPORT bool isPreloaded(const String& urlString) const; + enum class ClearPreloadsMode { ClearSpeculativePreloads, ClearAllPreloads }; + void clearPreloads(ClearPreloadsMode); + CachedResourceHandle<CachedResource> preload(CachedResource::Type, CachedResourceRequest&&); void printPreloadStats(); - bool canRequest(CachedResource::Type, const URL&, const ResourceLoaderOptions&, bool forPreload = false); + + bool updateRequestAfterRedirection(CachedResource::Type, ResourceRequest&, const ResourceLoaderOptions&); static const ResourceLoaderOptions& defaultCachedResourceOptions(); + void documentDidFinishLoadEvent(); + +#if ENABLE(WEB_TIMING) + ResourceTimingInformation& resourceTimingInformation() { return m_resourceTimingInfo; } +#endif + + bool isAlwaysOnLoggingAllowed() const; + private: explicit CachedResourceLoader(DocumentLoader*); - CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, CachedResourceRequest&); - CachedResourceHandle<CachedResource> revalidateResource(const CachedResourceRequest&, CachedResource*); - CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, CachedResourceRequest&, const String& charset); -#if ENABLE(RESOURCE_TIMING) - void storeResourceTimingInitiatorInformation(const CachedResourceHandle<CachedResource>&, const CachedResourceRequest&); -#endif - void requestPreload(CachedResource::Type, CachedResourceRequest&, const String& charset); + enum class ForPreload { Yes, No }; + enum class DeferOption { NoDefer, DeferredByClient }; + + CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, CachedResourceRequest&&, ForPreload = ForPreload::No, DeferOption = DeferOption::NoDefer); + CachedResourceHandle<CachedResource> revalidateResource(CachedResourceRequest&&, CachedResource&); + CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, CachedResourceRequest&&); + + void prepareFetch(CachedResource::Type, CachedResourceRequest&); + void updateHTTPRequestHeaders(CachedResource::Type, CachedResourceRequest&); + void updateReferrerOriginAndUserAgentHeaders(CachedResourceRequest&); + + bool canRequest(CachedResource::Type, const URL&, const CachedResourceRequest&, ForPreload); enum RevalidationPolicy { Use, Revalidate, Reload, Load }; - RevalidationPolicy determineRevalidationPolicy(CachedResource::Type, ResourceRequest&, bool forPreload, CachedResource* existingResource, CachedResourceRequest::DeferOption) const; - - bool shouldContinueAfterNotifyingLoadedFromMemoryCache(CachedResource*); + RevalidationPolicy determineRevalidationPolicy(CachedResource::Type, CachedResourceRequest&, CachedResource* existingResource, ForPreload, DeferOption) const; + + bool shouldUpdateCachedResourceWithCurrentRequest(const CachedResource&, const CachedResourceRequest&); + CachedResourceHandle<CachedResource> updateCachedResourceWithCurrentRequest(const CachedResource&, CachedResourceRequest&&); + + bool shouldContinueAfterNotifyingLoadedFromMemoryCache(const CachedResourceRequest&, CachedResource*); bool checkInsecureContent(CachedResource::Type, const URL&) const; + bool allowedByContentSecurityPolicy(CachedResource::Type, const URL&, const ResourceLoaderOptions&, ContentSecurityPolicy::RedirectResponseReceived) const; - void garbageCollectDocumentResourcesTimerFired(Timer<CachedResourceLoader>&); void performPostLoadActions(); bool clientDefersImage(const URL&) const; void reloadImagesIfNotDeferred(); - + + bool canRequestAfterRedirection(CachedResource::Type, const URL&, const ResourceLoaderOptions&) const; + bool canRequestInContentDispositionAttachmentSandbox(CachedResource::Type, const URL&) const; + HashSet<String> m_validatedURLs; mutable DocumentResourceMap m_documentResources; Document* m_document; @@ -165,22 +186,12 @@ private: int m_requestCount; - OwnPtr<ListHashSet<CachedResource*>> m_preloads; - struct PendingPreload { - CachedResource::Type m_type; - CachedResourceRequest m_request; - String m_charset; - }; - Deque<PendingPreload> m_pendingPreloads; - - Timer<CachedResourceLoader> m_garbageCollectDocumentResourcesTimer; - -#if ENABLE(RESOURCE_TIMING) - struct InitiatorInfo { - AtomicString name; - double startTime; - }; - HashMap<CachedResource*, InitiatorInfo> m_initiatorMap; + std::unique_ptr<ListHashSet<CachedResource*>> m_preloads; + + Timer m_garbageCollectDocumentResourcesTimer; + +#if ENABLE(WEB_TIMING) + ResourceTimingInformation m_resourceTimingInfo; #endif // 29 bits left @@ -193,25 +204,19 @@ class ResourceCacheValidationSuppressor { WTF_MAKE_NONCOPYABLE(ResourceCacheValidationSuppressor); WTF_MAKE_FAST_ALLOCATED; public: - ResourceCacheValidationSuppressor(CachedResourceLoader* loader) + ResourceCacheValidationSuppressor(CachedResourceLoader& loader) : m_loader(loader) - , m_previousState(false) + , m_previousState(m_loader.m_allowStaleResources) { - if (m_loader) { - m_previousState = m_loader->m_allowStaleResources; - m_loader->m_allowStaleResources = true; - } + m_loader.m_allowStaleResources = true; } ~ResourceCacheValidationSuppressor() { - if (m_loader) - m_loader->m_allowStaleResources = m_previousState; + m_loader.m_allowStaleResources = m_previousState; } private: - CachedResourceLoader* m_loader; + CachedResourceLoader& m_loader; bool m_previousState; }; } // namespace WebCore - -#endif |