• 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/network/ResourceError.h"
41 #include "platform/network/ResourceRequest.h"
42 #include "platform/network/ResourceResponse.h"
43 #include "wtf/HashSet.h"
44 #include "wtf/RefPtr.h"
45 
46 namespace blink {
47 class WebThreadedDataReceiver;
48 }
49 
50 namespace WTF {
51 class SchedulePair;
52 }
53 
54 namespace WebCore {
55     class ApplicationCacheHost;
56     class ArchiveResource;
57     class ArchiveResourceCollection;
58     class ResourceFetcher;
59     class ContentFilter;
60     class FormState;
61     class LocalFrame;
62     class FrameLoader;
63     class MHTMLArchive;
64     class Page;
65     class ResourceLoader;
66     class SharedBuffer;
67 
68     class DocumentLoader : public RefCounted<DocumentLoader>, private RawResourceClient {
69         WTF_MAKE_FAST_ALLOCATED;
70     public:
create(LocalFrame * frame,const ResourceRequest & request,const SubstituteData & data)71         static PassRefPtr<DocumentLoader> create(LocalFrame* frame, const ResourceRequest& request, const SubstituteData& data)
72         {
73             return adoptRef(new DocumentLoader(frame, request, data));
74         }
75         virtual ~DocumentLoader();
76 
frame()77         LocalFrame* frame() const { return m_frame; }
78 
79         void detachFromFrame();
80 
81         unsigned long mainResourceIdentifier() const;
82 
83         void replaceDocument(const String& source, Document*);
84 
85         const AtomicString& mimeType() const;
86 
87         void setUserChosenEncoding(const String& charset);
88 
89         const ResourceRequest& originalRequest() const;
90 
91         const ResourceRequest& request() const;
92 
fetcher()93         ResourceFetcher* fetcher() const { return m_fetcher.get(); }
94 
substituteData()95         const SubstituteData& substituteData() const { return m_substituteData; }
96 
97         const KURL& url() const;
98         const KURL& unreachableURL() const;
99         const KURL& urlForHistory() const;
100 
101         const AtomicString& responseMIMEType() const;
102 
103         void updateForSameDocumentNavigation(const KURL&, SameDocumentNavigationSource);
104         void stopLoading();
isCommitted()105         bool isCommitted() const { return m_committed; }
106         bool isLoading() const;
isLoadingMainResource()107         bool isLoadingMainResource() const { return m_loadingMainResource; }
response()108         const ResourceResponse& response() const { return m_response; }
mainDocumentError()109         const ResourceError& mainDocumentError() const { return m_mainDocumentError; }
isClientRedirect()110         bool isClientRedirect() const { return m_isClientRedirect; }
setIsClientRedirect(bool isClientRedirect)111         void setIsClientRedirect(bool isClientRedirect) { m_isClientRedirect = isClientRedirect; }
replacesCurrentHistoryItem()112         bool replacesCurrentHistoryItem() const { return m_replacesCurrentHistoryItem; }
setReplacesCurrentHistoryItem(bool replacesCurrentHistoryItem)113         void setReplacesCurrentHistoryItem(bool replacesCurrentHistoryItem) { m_replacesCurrentHistoryItem = replacesCurrentHistoryItem; }
overrideEncoding()114         const AtomicString& overrideEncoding() const { return m_overrideEncoding; }
115 
116         bool scheduleArchiveLoad(Resource*, const ResourceRequest&);
117 
118         bool shouldContinueForNavigationPolicy(const ResourceRequest&);
triggeringAction()119         const NavigationAction& triggeringAction() const { return m_triggeringAction; }
setTriggeringAction(const NavigationAction & action)120         void setTriggeringAction(const NavigationAction& action) { m_triggeringAction = action; }
121 
setOverrideEncoding(const AtomicString & encoding)122         void setOverrideEncoding(const AtomicString& encoding) { m_overrideEncoding = encoding; }
123 
124         void setDefersLoading(bool);
125 
126         void startLoadingMainResource();
127         void cancelMainResourceLoad(const ResourceError&);
128 
129         void attachThreadedDataReceiver(PassOwnPtr<blink::WebThreadedDataReceiver>);
timing()130         DocumentLoadTiming* timing() { return &m_documentLoadTiming; }
131 
applicationCacheHost()132         ApplicationCacheHost* applicationCacheHost() const { return m_applicationCacheHost.get(); }
133 
isRedirect()134         bool isRedirect() const { return m_redirectChain.size() > 1; }
135         void clearRedirectChain();
136         void appendRedirect(const KURL&);
137 
138     protected:
139         DocumentLoader(LocalFrame*, const ResourceRequest&, const SubstituteData&);
140 
141         Vector<KURL> m_redirectChain;
142 
143     private:
144         static PassRefPtrWillBeRawPtr<DocumentWriter> createWriterFor(LocalFrame*, const Document* ownerDocument, const KURL&, const AtomicString& mimeType, const AtomicString& encoding, bool userChosen, bool dispatch);
145 
146         void ensureWriter(const AtomicString& mimeType, const KURL& overridingURL = KURL());
147         void endWriting(DocumentWriter*);
148 
149         Document* document() const;
150         FrameLoader* frameLoader() const;
151 
152         void commitIfReady();
153         void commitData(const char* bytes, size_t length);
154         void setMainDocumentError(const ResourceError&);
155         void clearMainResourceLoader();
156         ResourceLoader* mainResourceLoader() const;
157         void clearMainResourceHandle();
158 
159         bool maybeCreateArchive();
160 
161         void prepareSubframeArchiveLoadIfNeeded();
162         void addAllArchiveResources(MHTMLArchive*);
163 
164         void willSendRequest(ResourceRequest&, const ResourceResponse&);
165         void finishedLoading(double finishTime);
166         void mainReceivedError(const ResourceError&);
167         virtual void redirectReceived(Resource*, ResourceRequest&, const ResourceResponse&) OVERRIDE FINAL;
168         virtual void updateRequest(Resource*, const ResourceRequest&) OVERRIDE FINAL;
169         virtual void responseReceived(Resource*, const ResourceResponse&) OVERRIDE FINAL;
170         virtual void dataReceived(Resource*, const char* data, int length) OVERRIDE FINAL;
171         virtual void notifyFinished(Resource*) OVERRIDE FINAL;
172 
173         bool maybeLoadEmpty();
174 
175         bool isRedirectAfterPost(const ResourceRequest&, const ResourceResponse&);
176 
177         bool shouldContinueForResponse() const;
178 
179         LocalFrame* m_frame;
180         RefPtrWillBePersistent<ResourceFetcher> m_fetcher;
181 
182         ResourcePtr<RawResource> m_mainResource;
183 
184         RefPtrWillBePersistent<DocumentWriter> m_writer;
185 
186         // A reference to actual request used to create the data source.
187         // The only part of this request that should change is the url, and
188         // that only in the case of a same-document navigation.
189         ResourceRequest m_originalRequest;
190 
191         SubstituteData m_substituteData;
192 
193         // The 'working' request. It may be mutated
194         // several times from the original request to include additional
195         // headers, cookie information, canonicalization and redirects.
196         ResourceRequest m_request;
197 
198         ResourceResponse m_response;
199 
200         ResourceError m_mainDocumentError;
201 
202         bool m_committed;
203         bool m_isClientRedirect;
204         bool m_replacesCurrentHistoryItem;
205 
206         AtomicString m_overrideEncoding;
207 
208         // The action that triggered loading - we keep this around for the
209         // benefit of the various policy handlers.
210         NavigationAction m_triggeringAction;
211 
212         OwnPtr<ArchiveResourceCollection> m_archiveResourceCollection;
213         RefPtr<MHTMLArchive> m_archive;
214 
215         bool m_loadingMainResource;
216         DocumentLoadTiming m_documentLoadTiming;
217 
218         double m_timeOfLastDataReceived;
219 
220         friend class ApplicationCacheHost;  // for substitute resource delivery
221         OwnPtr<ApplicationCacheHost> m_applicationCacheHost;
222     };
223 }
224 
225 #endif // DocumentLoader_h
226