• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  * Copyright (C) 2011 Google Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #ifndef DocumentLoader_h
31 #define DocumentLoader_h
32 
33 #include "core/fetch/RawResource.h"
34 #include "core/fetch/ResourceLoaderOptions.h"
35 #include "core/fetch/ResourcePtr.h"
36 #include "core/loader/DocumentLoadTiming.h"
37 #include "core/loader/DocumentWriter.h"
38 #include "core/loader/NavigationAction.h"
39 #include "core/loader/SubstituteData.h"
40 #include "platform/Timer.h"
41 #include "platform/network/ResourceError.h"
42 #include "platform/network/ResourceRequest.h"
43 #include "platform/network/ResourceResponse.h"
44 #include "wtf/HashSet.h"
45 #include "wtf/RefPtr.h"
46 
47 namespace WTF {
48 class SchedulePair;
49 }
50 
51 namespace WebCore {
52     class ApplicationCacheHost;
53     class ArchiveResource;
54     class ArchiveResourceCollection;
55     class ResourceFetcher;
56     class ContentFilter;
57     class FormState;
58     class Frame;
59     class FrameLoader;
60     class MHTMLArchive;
61     class Page;
62     class ResourceLoader;
63     class SharedBuffer;
64 
65     class DocumentLoader : public RefCounted<DocumentLoader>, private RawResourceClient {
66         WTF_MAKE_FAST_ALLOCATED;
67     public:
create(const ResourceRequest & request,const SubstituteData & data)68         static PassRefPtr<DocumentLoader> create(const ResourceRequest& request, const SubstituteData& data)
69         {
70             return adoptRef(new DocumentLoader(request, data));
71         }
72         virtual ~DocumentLoader();
73 
74         void setFrame(Frame*);
frame()75         Frame* frame() const { return m_frame; }
76 
77         void detachFromFrame();
78 
79         FrameLoader* frameLoader() const;
80 
81         unsigned long mainResourceIdentifier() const;
82 
83         void replaceDocument(const String& source, Document*);
84         DocumentWriter* beginWriting(const AtomicString& mimeType, const AtomicString& encoding, const KURL& = KURL());
85         void endWriting(DocumentWriter*);
86 
87         const AtomicString& mimeType() const;
88 
89         void setUserChosenEncoding(const String& charset);
90 
91         const ResourceRequest& originalRequest() const;
92         const ResourceRequest& originalRequestCopy() const;
93 
94         const ResourceRequest& request() const;
95         ResourceRequest& request();
96 
fetcher()97         ResourceFetcher* fetcher() const { return m_fetcher.get(); }
98 
substituteData()99         const SubstituteData& substituteData() const { return m_substituteData; }
100 
101         // FIXME: This is the same as requestURL(). We should remove one of them.
102         const KURL& url() const;
103         const KURL& unreachableURL() const;
104         bool isURLValidForNewHistoryEntry() const;
105 
106         const KURL& originalURL() const;
107         const KURL& requestURL() const;
108         const AtomicString& responseMIMEType() const;
109 
110         void updateForSameDocumentNavigation(const KURL&);
111         void stopLoading();
setCommitted(bool committed)112         void setCommitted(bool committed) { m_committed = committed; }
isCommitted()113         bool isCommitted() const { return m_committed; }
114         bool isLoading() const;
response()115         const ResourceResponse& response() const { return m_response; }
mainDocumentError()116         const ResourceError& mainDocumentError() const { return m_mainDocumentError; }
isClientRedirect()117         bool isClientRedirect() const { return m_isClientRedirect; }
setIsClientRedirect(bool isClientRedirect)118         void setIsClientRedirect(bool isClientRedirect) { m_isClientRedirect = isClientRedirect; }
replacesCurrentHistoryItem()119         bool replacesCurrentHistoryItem() const { return m_replacesCurrentHistoryItem; }
setReplacesCurrentHistoryItem(bool replacesCurrentHistoryItem)120         void setReplacesCurrentHistoryItem(bool replacesCurrentHistoryItem) { m_replacesCurrentHistoryItem = replacesCurrentHistoryItem; }
121         bool isLoadingInAPISense() const;
overrideEncoding()122         const AtomicString& overrideEncoding() const { return m_overrideEncoding; }
123 
124         bool scheduleArchiveLoad(Resource*, const ResourceRequest&);
125         void cancelPendingSubstituteLoad(ResourceLoader*);
126 
127         enum PolicyCheckLoadType {
128             PolicyCheckStandard,
129             PolicyCheckFragment
130         };
131         bool shouldContinueForNavigationPolicy(const ResourceRequest&, PolicyCheckLoadType);
triggeringAction()132         const NavigationAction& triggeringAction() const { return m_triggeringAction; }
setTriggeringAction(const NavigationAction & action)133         void setTriggeringAction(const NavigationAction& action) { m_triggeringAction = action; }
134 
setOverrideEncoding(const AtomicString & encoding)135         void setOverrideEncoding(const AtomicString& encoding) { m_overrideEncoding = encoding; }
136 
137         void setDefersLoading(bool);
138 
139         void startLoadingMainResource();
140         void cancelMainResourceLoad(const ResourceError&);
141 
isLoadingMainResource()142         bool isLoadingMainResource() const { return m_loadingMainResource; }
143 
144         void stopLoadingSubresources();
145 
146         void subresourceLoaderFinishedLoadingOnePart(ResourceLoader*);
147 
setDeferMainResourceDataLoad(bool defer)148         void setDeferMainResourceDataLoad(bool defer) { m_deferMainResourceDataLoad = defer; }
149 
timing()150         DocumentLoadTiming* timing() { return &m_documentLoadTiming; }
resetTiming()151         void resetTiming() { m_documentLoadTiming = DocumentLoadTiming(); }
152 
applicationCacheHost()153         ApplicationCacheHost* applicationCacheHost() const { return m_applicationCacheHost.get(); }
154 
155         void checkLoadComplete();
156 
isRedirect()157         bool isRedirect() const { return m_redirectChain.size() > 1; }
158         void clearRedirectChain();
159         void appendRedirect(const KURL&);
160 
161     protected:
162         DocumentLoader(const ResourceRequest&, const SubstituteData&);
163 
164         bool m_deferMainResourceDataLoad;
165         Vector<KURL> m_redirectChain;
166 
167     private:
168         static PassRefPtr<DocumentWriter> createWriterFor(Frame*, const Document* ownerDocument, const KURL&, const AtomicString& mimeType, const AtomicString& encoding, bool userChosen, bool dispatch);
169 
170         void ensureWriter();
171         void ensureWriter(const AtomicString& mimeType, const KURL& overridingURL = KURL());
172 
173         Document* document() const;
174 
175         void setRequest(const ResourceRequest&);
176 
177         void commitIfReady();
178         void commitData(const char* bytes, size_t length);
179         void setMainDocumentError(const ResourceError&);
180         void clearMainResourceLoader();
181         ResourceLoader* mainResourceLoader() const;
182         void clearMainResourceHandle();
183         PassRefPtr<SharedBuffer> mainResourceData() const;
184 
185         void createArchive();
186         void clearArchiveResources();
187 
188         void prepareSubframeArchiveLoadIfNeeded();
189         void addAllArchiveResources(MHTMLArchive*);
190 
191         void willSendRequest(ResourceRequest&, const ResourceResponse&);
192         void finishedLoading(double finishTime);
193         void mainReceivedError(const ResourceError&);
194         virtual void redirectReceived(Resource*, ResourceRequest&, const ResourceResponse&) OVERRIDE;
195         virtual void responseReceived(Resource*, const ResourceResponse&) OVERRIDE;
196         virtual void dataReceived(Resource*, const char* data, int length) OVERRIDE;
197         virtual void notifyFinished(Resource*) OVERRIDE;
198 
199         bool maybeLoadEmpty();
200 
201         bool isRedirectAfterPost(const ResourceRequest&, const ResourceResponse&);
202 
203         bool shouldContinueForResponse() const;
204 
205         typedef Timer<DocumentLoader> DocumentLoaderTimer;
206 
207         void handleSubstituteDataLoadSoon();
208         void handleSubstituteDataLoadNow(DocumentLoaderTimer*);
209         void startDataLoadTimer();
210 
211         Frame* m_frame;
212         RefPtr<ResourceFetcher> m_fetcher;
213 
214         ResourcePtr<RawResource> m_mainResource;
215 
216         RefPtr<DocumentWriter> m_writer;
217 
218         // A reference to actual request used to create the data source.
219         // This should only be used by the resourceLoadDelegate's
220         // identifierForInitialRequest:fromDatasource: method. It is
221         // not guaranteed to remain unchanged, as requests are mutable.
222         ResourceRequest m_originalRequest;
223 
224         SubstituteData m_substituteData;
225 
226         // A copy of the original request used to create the data source.
227         // We have to copy the request because requests are mutable.
228         ResourceRequest m_originalRequestCopy;
229 
230         // The 'working' request. It may be mutated
231         // several times from the original request to include additional
232         // headers, cookie information, canonicalization and redirects.
233         ResourceRequest m_request;
234 
235         ResourceResponse m_response;
236 
237         ResourceError m_mainDocumentError;
238 
239         bool m_committed;
240         bool m_isClientRedirect;
241         bool m_replacesCurrentHistoryItem;
242 
243         AtomicString m_overrideEncoding;
244 
245         // The action that triggered loading - we keep this around for the
246         // benefit of the various policy handlers.
247         NavigationAction m_triggeringAction;
248 
249         OwnPtr<ArchiveResourceCollection> m_archiveResourceCollection;
250         RefPtr<MHTMLArchive> m_archive;
251 
252         bool m_loadingMainResource;
253         DocumentLoadTiming m_documentLoadTiming;
254 
255         double m_timeOfLastDataReceived;
256         unsigned long m_identifierForLoadWithoutResourceLoader;
257 
258         DocumentLoaderTimer m_dataLoadTimer;
259 
260         friend class ApplicationCacheHost;  // for substitute resource delivery
261         OwnPtr<ApplicationCacheHost> m_applicationCacheHost;
262     };
263 }
264 
265 #endif // DocumentLoader_h
266