15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This class provides all functionality needed for loading images, style sheets and html
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pages from the web. It has a memory cache for these objects.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
263464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch#ifndef ResourceFetcher_h
273464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch#define ResourceFetcher_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/loader/ResourceLoaderHost.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/cache/CachePolicy.h"
31fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch#include "core/loader/cache/FetchInitiatorInfo.h"
323464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch#include "core/loader/cache/FetchRequest.h"
33fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch#include "core/loader/cache/Resource.h"
34fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch#include "core/loader/cache/ResourcePtr.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/Timer.h"
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Deque.h"
37591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashSet.h"
39591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/ListHashSet.h"
40591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringHash.h"
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass CSSStyleSheetResource;
45e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass DocumentResource;
46e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass FontResource;
47e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass ImageResource;
48e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass RawResource;
49e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass ScriptResource;
50e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass ShaderResource;
51e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass TextTrackResource;
52e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass XSLStyleSheetResource;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DocumentLoader;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Frame;
567757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochclass FrameLoader;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ImageLoader;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class KURL;
5983750176c3ee2cea66c8a9751271026a5901be3aBen Murdochclass ResourceTimingInfo;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
613464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch// The ResourceFetcher provides a per-context interface to the MemoryCache
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// and enforces a bunch of security checks and rules for resource revalidation.
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Its lifetime is roughly per-DocumentLoader, in that it is generally created
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// in the DocumentLoader constructor and loses its ability to generate network
653464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch// requests when the DocumentLoader is destroyed. Documents also hold a
663464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch// RefPtr<ResourceFetcher> for their lifetime (and will create one if they
673464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch// are initialized without a Frame), so a Document can keep a ResourceFetcher
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// alive past detach if scripts still reference the Document.
693464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdochclass ResourceFetcher : public RefCounted<ResourceFetcher>, public ResourceLoaderHost {
703464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    WTF_MAKE_NONCOPYABLE(ResourceFetcher); WTF_MAKE_FAST_ALLOCATED;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)friend class ImageLoader;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)friend class ResourceCacheValidationSuppressor;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
753464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    static PassRefPtr<ResourceFetcher> create(DocumentLoader* documentLoader) { return adoptRef(new ResourceFetcher(documentLoader)); }
763464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    virtual ~ResourceFetcher();
773464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
783464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    using RefCounted<ResourceFetcher>::ref;
793464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    using RefCounted<ResourceFetcher>::deref;
803464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
81e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<ImageResource> requestImage(FetchRequest&);
82e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<CSSStyleSheetResource> requestCSSStyleSheet(FetchRequest&);
83e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<CSSStyleSheetResource> requestUserCSSStyleSheet(FetchRequest&);
84e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<ScriptResource> requestScript(FetchRequest&);
85e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<FontResource> requestFont(FetchRequest&);
86e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<RawResource> requestRawResource(FetchRequest&);
87e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<RawResource> requestMainResource(FetchRequest&);
88e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<DocumentResource> requestSVGDocument(FetchRequest&);
89e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<XSLStyleSheetResource> requestXSLStyleSheet(FetchRequest&);
90fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourcePtr<Resource> requestLinkResource(Resource::Type, FetchRequest&);
91e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<TextTrackResource> requestTextTrack(FetchRequest&);
92e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<ShaderResource> requestShader(FetchRequest&);
93e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourcePtr<RawResource> requestImport(FetchRequest&);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Logs an access denied message to the console for the specified URL.
963464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    void printAccessDeniedMessage(const KURL&) const;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    Resource* cachedResource(const String& url) const;
99fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    Resource* cachedResource(const KURL&) const;
1003464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
101fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    typedef HashMap<String, ResourcePtr<Resource> > DocumentResourceMap;
102fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    const DocumentResourceMap& allResources() const { return m_documentResources; }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool autoLoadImages() const { return m_autoLoadImages; }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setAutoLoadImages(bool);
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setImagesEnabled(bool);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shouldDeferImageLoad(const KURL&) const;
1103464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
111fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    CachePolicy cachePolicy(Resource::Type) const;
1123464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* frame() const; // Can be null
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document() const { return m_document; } // Can be null
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setDocument(Document* document) { m_document = document; }
11693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    DocumentLoader* documentLoader() const { return m_documentLoader; }
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearDocumentLoader() { m_documentLoader = 0; }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void garbageCollectDocumentResources();
1213464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int requestCount() const { return m_requestCount; }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isPreloaded(const String& urlString) const;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearPreloads();
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearPendingPreloads();
127fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void preload(Resource::Type, FetchRequest&, const String& charset);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkForPendingPreloads();
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void printPreloadStats();
130fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool canRequest(Resource::Type, const KURL&, const ResourceLoaderOptions&, bool forPreload = false);
131fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool canAccess(Resource*);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // ResourceLoaderHost
134fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void incrementRequestCount(const Resource*) OVERRIDE;
135fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void decrementRequestCount(const Resource*) OVERRIDE;
136fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didLoadResource(Resource*) OVERRIDE;
137fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void redirectReceived(Resource*, const ResourceResponse&) OVERRIDE;
138fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didFinishLoading(const Resource*, double finishTime, const ResourceLoaderOptions&) OVERRIDE;
139fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didChangeLoadingPriority(const Resource*, ResourceLoadPriority) OVERRIDE;
140fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didFailLoading(const Resource*, const ResourceError&, const ResourceLoaderOptions&) OVERRIDE;
141fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void willSendRequest(const Resource*, ResourceRequest&, const ResourceResponse& redirectResponse, const ResourceLoaderOptions&) OVERRIDE;
142fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didReceiveResponse(const Resource*, const ResourceResponse&, const ResourceLoaderOptions&) OVERRIDE;
143fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didReceiveData(const Resource*, const char* data, int dataLength, int encodedDataLength, const ResourceLoaderOptions&) OVERRIDE;
1447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual void subresourceLoaderFinishedLoadingOnePart(ResourceLoader*) OVERRIDE;
1457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual void didInitializeResourceLoader(ResourceLoader*) OVERRIDE;
1467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual void willTerminateResourceLoader(ResourceLoader*) OVERRIDE;
1477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual void willStartLoadingResource(ResourceRequest&) OVERRIDE;
1487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual bool defersLoading() const OVERRIDE;
1497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual bool isLoadedBy(ResourceLoaderHost*) const OVERRIDE;
150fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual bool shouldRequest(Resource*, const ResourceRequest&, const ResourceLoaderOptions&) OVERRIDE;
1517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual void refResourceLoaderHost() OVERRIDE;
1527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual void derefResourceLoaderHost() OVERRIDE;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
154fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    static const ResourceLoaderOptions& defaultResourceOptions();
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1567757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1573464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    explicit ResourceFetcher(DocumentLoader*);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    FrameLoader* frameLoader();
16002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    bool shouldLoadNewResource() const;
1617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
162fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourcePtr<Resource> requestResource(Resource::Type, FetchRequest&);
163fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourcePtr<Resource> revalidateResource(const FetchRequest&, Resource*);
164fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourcePtr<Resource> loadResource(Resource::Type, FetchRequest&, const String& charset);
1653464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    void preCacheDataURIImage(const FetchRequest&);
166fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void storeResourceTimingInitiatorInformation(const ResourcePtr<Resource>&, const FetchRequest&);
167fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void requestPreload(Resource::Type, FetchRequest&, const String& charset);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum RevalidationPolicy { Use, Revalidate, Reload, Load };
170fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    RevalidationPolicy determineRevalidationPolicy(Resource::Type, ResourceRequest&, bool forPreload, Resource* existingResource, FetchRequest::DeferOption) const;
17153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
172fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void determineTargetType(ResourceRequest&, Resource::Type);
173fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourceRequestCachePolicy resourceRequestCachePolicy(const ResourceRequest&, Resource::Type);
174fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void addAdditionalRequestHeaders(ResourceRequest&, Resource::Type);
17553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
176fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void notifyLoadedFromMemoryCache(Resource*);
177fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool checkInsecureContent(Resource::Type, const KURL&) const;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1793464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    void garbageCollectDocumentResourcesTimerFired(Timer<ResourceFetcher>*);
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void performPostLoadActions();
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool clientDefersImage(const KURL&) const;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void reloadImagesIfNotDeferred();
1843464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<String> m_validatedURLs;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable DocumentResourceMap m_documentResources;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* m_document;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DocumentLoader* m_documentLoader;
1893464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_requestCount;
1913464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch
192fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    OwnPtr<ListHashSet<Resource*> > m_preloads;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct PendingPreload {
194fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        Resource::Type m_type;
1953464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        FetchRequest m_request;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String m_charset;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Deque<PendingPreload> m_pendingPreloads;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2003464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    Timer<ResourceFetcher> m_garbageCollectDocumentResourcesTimer;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    typedef HashMap<Resource*, RefPtr<ResourceTimingInfo> > ResourceTimingInfoMap;
20383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    ResourceTimingInfoMap m_resourceTimingInfoMap;
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 29 bits left
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_autoLoadImages : 1;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_imagesEnabled : 1;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_allowStaleResources : 1;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ResourceCacheValidationSuppressor {
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(ResourceCacheValidationSuppressor);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED;
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2153464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    ResourceCacheValidationSuppressor(ResourceFetcher* loader)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_loader(loader)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_previousState(false)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_loader) {
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_previousState = m_loader->m_allowStaleResources;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_loader->m_allowStaleResources = true;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~ResourceCacheValidationSuppressor()
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_loader)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_loader->m_allowStaleResources = m_previousState;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2303464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    ResourceFetcher* m_loader;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_previousState;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
237