2 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2011 Google Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
30 #ifndef DocumentLoader_h
31 #define DocumentLoader_h
33 #include "core/fetch/RawResource.h"
34 #include "core/fetch/ResourceLoaderOptions.h"
35 #include "core/fetch/ResourcePtr.h"
36 #include "core/frame/csp/ContentSecurityPolicy.h"
37 #include "core/loader/DocumentLoadTiming.h"
38 #include "core/loader/DocumentWriter.h"
39 #include "core/loader/NavigationAction.h"
40 #include "core/loader/SubstituteData.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"
48 class WebThreadedDataReceiver;
52 class ApplicationCacheHost;
53 class ArchiveResourceCollection;
54 class ResourceFetcher;
61 class DocumentLoader : public RefCounted<DocumentLoader>, private RawResourceClient {
62 WTF_MAKE_FAST_ALLOCATED;
64 static PassRefPtr<DocumentLoader> create(LocalFrame* frame, const ResourceRequest& request, const SubstituteData& data)
66 return adoptRef(new DocumentLoader(frame, request, data));
68 virtual ~DocumentLoader();
70 LocalFrame* frame() const { return m_frame; }
72 void detachFromFrame();
74 unsigned long mainResourceIdentifier() const;
76 void replaceDocumentWhileExecutingJavaScriptURL(const DocumentInit&, const String& source, Document*);
78 const AtomicString& mimeType() const;
80 void setUserChosenEncoding(const String& charset);
82 const ResourceRequest& originalRequest() const;
84 const ResourceRequest& request() const;
86 ResourceFetcher* fetcher() const { return m_fetcher.get(); }
88 const SubstituteData& substituteData() const { return m_substituteData; }
90 const KURL& url() const;
91 const KURL& unreachableURL() const;
92 const KURL& urlForHistory() const;
94 const AtomicString& responseMIMEType() const;
96 void updateForSameDocumentNavigation(const KURL&, SameDocumentNavigationSource);
98 bool isCommitted() const { return m_committed; }
99 bool isLoading() const;
100 bool isLoadingMainResource() const { return m_loadingMainResource; }
101 const ResourceResponse& response() const { return m_response; }
102 const ResourceError& mainDocumentError() const { return m_mainDocumentError; }
103 bool isClientRedirect() const { return m_isClientRedirect; }
104 void setIsClientRedirect(bool isClientRedirect) { m_isClientRedirect = isClientRedirect; }
105 bool replacesCurrentHistoryItem() const { return m_replacesCurrentHistoryItem; }
106 void setReplacesCurrentHistoryItem(bool replacesCurrentHistoryItem) { m_replacesCurrentHistoryItem = replacesCurrentHistoryItem; }
107 const AtomicString& overrideEncoding() const { return m_overrideEncoding; }
109 bool scheduleArchiveLoad(Resource*, const ResourceRequest&);
111 bool shouldContinueForNavigationPolicy(const ResourceRequest&, ContentSecurityPolicyCheck shouldCheckMainWorldContentSecurityPolicy, bool isTransitionNavigation = false);
112 const NavigationAction& triggeringAction() const { return m_triggeringAction; }
113 void setTriggeringAction(const NavigationAction& action) { m_triggeringAction = action; }
115 void setOverrideEncoding(const AtomicString& encoding) { m_overrideEncoding = encoding; }
117 void setDefersLoading(bool);
119 void startLoadingMainResource();
120 void cancelMainResourceLoad(const ResourceError&);
122 void attachThreadedDataReceiver(PassOwnPtr<blink::WebThreadedDataReceiver>);
123 DocumentLoadTiming* timing() { return &m_documentLoadTiming; }
125 ApplicationCacheHost* applicationCacheHost() const { return m_applicationCacheHost.get(); }
127 bool isRedirect() const { return m_redirectChain.size() > 1; }
128 void clearRedirectChain();
129 void appendRedirect(const KURL&);
131 PassRefPtr<ContentSecurityPolicy> releaseContentSecurityPolicy() { return m_contentSecurityPolicy.release(); }
134 DocumentLoader(LocalFrame*, const ResourceRequest&, const SubstituteData&);
136 Vector<KURL> m_redirectChain;
139 static PassRefPtrWillBeRawPtr<DocumentWriter> createWriterFor(const Document* ownerDocument, const DocumentInit&, const AtomicString& mimeType, const AtomicString& encoding, bool dispatch);
141 void ensureWriter(const AtomicString& mimeType, const KURL& overridingURL = KURL());
142 void endWriting(DocumentWriter*);
144 Document* document() const;
145 FrameLoader* frameLoader() const;
147 void commitIfReady();
148 void commitData(const char* bytes, size_t length);
149 void setMainDocumentError(const ResourceError&);
150 void clearMainResourceLoader();
151 ResourceLoader* mainResourceLoader() const;
152 void clearMainResourceHandle();
154 bool maybeCreateArchive();
156 void prepareSubframeArchiveLoadIfNeeded();
157 void addAllArchiveResources(MHTMLArchive*);
159 void willSendRequest(ResourceRequest&, const ResourceResponse&);
160 void finishedLoading(double finishTime);
161 void mainReceivedError(const ResourceError&);
162 void cancelLoadAfterXFrameOptionsOrCSPDenied(const ResourceResponse&);
163 virtual void redirectReceived(Resource*, ResourceRequest&, const ResourceResponse&) OVERRIDE FINAL;
164 virtual void updateRequest(Resource*, const ResourceRequest&) OVERRIDE FINAL;
165 virtual void responseReceived(Resource*, const ResourceResponse&) OVERRIDE FINAL;
166 virtual void dataReceived(Resource*, const char* data, int length) OVERRIDE FINAL;
167 virtual void notifyFinished(Resource*) OVERRIDE FINAL;
169 bool maybeLoadEmpty();
171 bool isRedirectAfterPost(const ResourceRequest&, const ResourceResponse&);
173 bool shouldContinueForResponse() const;
176 RefPtrWillBePersistent<ResourceFetcher> m_fetcher;
178 ResourcePtr<RawResource> m_mainResource;
180 RefPtrWillBePersistent<DocumentWriter> m_writer;
182 // A reference to actual request used to create the data source.
183 // The only part of this request that should change is the url, and
184 // that only in the case of a same-document navigation.
185 ResourceRequest m_originalRequest;
187 SubstituteData m_substituteData;
189 // The 'working' request. It may be mutated
190 // several times from the original request to include additional
191 // headers, cookie information, canonicalization and redirects.
192 ResourceRequest m_request;
194 ResourceResponse m_response;
196 ResourceError m_mainDocumentError;
199 bool m_isClientRedirect;
200 bool m_replacesCurrentHistoryItem;
202 AtomicString m_overrideEncoding;
204 // The action that triggered loading - we keep this around for the
205 // benefit of the various policy handlers.
206 NavigationAction m_triggeringAction;
208 OwnPtrWillBePersistent<ArchiveResourceCollection> m_archiveResourceCollection;
209 RefPtrWillBePersistent<MHTMLArchive> m_archive;
211 bool m_loadingMainResource;
212 DocumentLoadTiming m_documentLoadTiming;
214 double m_timeOfLastDataReceived;
216 friend class ApplicationCacheHost; // for substitute resource delivery
217 OwnPtrWillBePersistent<ApplicationCacheHost> m_applicationCacheHost;
219 RefPtr<ContentSecurityPolicy> m_contentSecurityPolicy;
223 #endif // DocumentLoader_h