• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3     Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
4     Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
5     Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
6 
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11 
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16 
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20     Boston, MA 02110-1301, USA.
21 
22     This class provides all functionality needed for loading images, style sheets and html
23     pages from the web. It has a memory cache for these objects.
24 */
25 
26 #ifndef CachedResourceLoader_h
27 #define CachedResourceLoader_h
28 
29 #include "CachedResource.h"
30 #include "CachedResourceHandle.h"
31 #include "CachePolicy.h"
32 #include "ResourceLoadPriority.h"
33 #include "Timer.h"
34 #include <wtf/Deque.h>
35 #include <wtf/HashMap.h>
36 #include <wtf/HashSet.h>
37 #include <wtf/ListHashSet.h>
38 #include <wtf/text/StringHash.h>
39 
40 namespace WebCore {
41 
42 class CachedCSSStyleSheet;
43 class CachedFont;
44 class CachedImage;
45 class CachedResourceRequest;
46 class CachedScript;
47 class CachedXSLStyleSheet;
48 class Document;
49 class Frame;
50 class ImageLoader;
51 class KURL;
52 
53 // The CachedResourceLoader manages the loading of scripts/images/stylesheets for a single document.
54 class CachedResourceLoader {
55     WTF_MAKE_NONCOPYABLE(CachedResourceLoader); WTF_MAKE_FAST_ALLOCATED;
56 friend class ImageLoader;
57 
58 public:
59     CachedResourceLoader(Document*);
60     ~CachedResourceLoader();
61 
62     CachedImage* requestImage(const String& url);
63     CachedCSSStyleSheet* requestCSSStyleSheet(const String& url, const String& charset, ResourceLoadPriority priority = ResourceLoadPriorityUnresolved);
64     CachedCSSStyleSheet* requestUserCSSStyleSheet(const String& url, const String& charset);
65     CachedScript* requestScript(const String& url, const String& charset);
66     CachedFont* requestFont(const String& url);
67 
68 #if ENABLE(XSLT)
69     CachedXSLStyleSheet* requestXSLStyleSheet(const String& url);
70 #endif
71 #if ENABLE(LINK_PREFETCH)
72     CachedResource* requestLinkResource(const String &url, ResourceLoadPriority priority = ResourceLoadPriorityUnresolved);
73 #endif
74 
75     // Logs an access denied message to the console for the specified URL.
76     void printAccessDeniedMessage(const KURL& url) const;
77 
78     CachedResource* cachedResource(const String& url) const;
79     CachedResource* cachedResource(const KURL& url) const;
80 
81     typedef HashMap<String, CachedResourceHandle<CachedResource> > DocumentResourceMap;
allCachedResources()82     const DocumentResourceMap& allCachedResources() const { return m_documentResources; }
83 
autoLoadImages()84     bool autoLoadImages() const { return m_autoLoadImages; }
85     void setAutoLoadImages(bool);
86 
87 #ifdef ANDROID_BLOCK_NETWORK_IMAGE
blockNetworkImage()88     bool blockNetworkImage() const { return m_blockNetworkImage; }
89     void setBlockNetworkImage(bool);
90     bool shouldBlockNetworkImage(const String& url) const;
91 #endif
92 
93     CachePolicy cachePolicy() const;
94 
95     Frame* frame() const; // Can be NULL
document()96     Document* document() const { return m_document; }
97 
98     void removeCachedResource(CachedResource*) const;
99 
100     void load(CachedResource*, bool incremental = false, SecurityCheckPolicy = DoSecurityCheck, bool sendResourceLoadCallbacks = true);
loadFinishing()101     void loadFinishing() { m_loadFinishing = true; }
102     void loadDone(CachedResourceRequest*);
103     void cancelRequests();
104 
setAllowStaleResources(bool allowStaleResources)105     void setAllowStaleResources(bool allowStaleResources) { m_allowStaleResources = allowStaleResources; }
106 
107     void incrementRequestCount(const CachedResource*);
108     void decrementRequestCount(const CachedResource*);
109     int requestCount();
110 
111     void clearPreloads();
112     void clearPendingPreloads();
113     void preload(CachedResource::Type, const String& url, const String& charset, bool referencedFromBody);
114     void checkForPendingPreloads();
115     void printPreloadStats();
116 
117 private:
118     CachedResource* requestResource(CachedResource::Type, const String& url, const String& charset, ResourceLoadPriority priority = ResourceLoadPriorityUnresolved, bool isPreload = false);
119     CachedResource* revalidateResource(CachedResource*, ResourceLoadPriority priority);
120     CachedResource* loadResource(CachedResource::Type, const KURL&, const String& charset, ResourceLoadPriority priority);
121     void requestPreload(CachedResource::Type, const String& url, const String& charset);
122 
123     enum RevalidationPolicy { Use, Revalidate, Reload, Load };
124     RevalidationPolicy determineRevalidationPolicy(CachedResource::Type, bool forPreload, CachedResource* existingResource) const;
125 
126     void notifyLoadedFromMemoryCache(CachedResource*);
127     bool canRequest(CachedResource::Type, const KURL&);
128 
129     void loadDoneActionTimerFired(Timer<CachedResourceLoader>*);
130 
131     void performPostLoadActions();
132 
133     HashSet<String> m_validatedURLs;
134     mutable DocumentResourceMap m_documentResources;
135     Document* m_document;
136 
137     typedef HashSet<RefPtr<CachedResourceRequest> > RequestSet;
138     RequestSet m_requests;
139 
140     int m_requestCount;
141 
142     OwnPtr<ListHashSet<CachedResource*> > m_preloads;
143     struct PendingPreload {
144         CachedResource::Type m_type;
145         String m_url;
146         String m_charset;
147     };
148     Deque<PendingPreload> m_pendingPreloads;
149 
150     Timer<CachedResourceLoader> m_loadDoneActionTimer;
151 
152     //29 bits left
153     bool m_autoLoadImages : 1;
154     bool m_loadFinishing : 1;
155     bool m_allowStaleResources : 1;
156 #ifdef ANDROID_BLOCK_NETWORK_IMAGE
157     bool m_blockNetworkImage : 1;
158 #endif
159 };
160 
161 }
162 
163 #endif
164