1 /*
2  * Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef ResourceLoader_h
30 #define ResourceLoader_h
31 
32 #include "ResourceHandleClient.h"
33 #include "ResourceRequest.h"
34 #include "ResourceResponse.h"
35 #include <wtf/RefCounted.h>
36 #include "AuthenticationChallenge.h"
37 #include "KURL.h"
38 
39 #include <wtf/Forward.h>
40 
41 namespace WebCore {
42 
43     class ApplicationCacheHost;
44     class DocumentLoader;
45     class Frame;
46     class FrameLoader;
47     class ProtectionSpace;
48     class ResourceHandle;
49     class SharedBuffer;
50 
51     class ResourceLoader : public RefCounted<ResourceLoader>, protected ResourceHandleClient {
52     public:
53         virtual ~ResourceLoader();
54 
55         void cancel();
56 
57         virtual bool init(const ResourceRequest&);
58 
59         FrameLoader* frameLoader() const;
documentLoader()60         DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
61 
62         virtual void cancel(const ResourceError&);
63         ResourceError cancelledError();
64         ResourceError blockedError();
65         ResourceError cannotShowURLError();
66 
67         virtual void setDefersLoading(bool);
68 
setIdentifier(unsigned long identifier)69         void setIdentifier(unsigned long identifier) { m_identifier = identifier; }
identifier()70         unsigned long identifier() const { return m_identifier; }
71 
72         virtual void releaseResources();
73         const ResourceResponse& response() const;
74 
75         virtual void addData(const char*, int, bool allAtOnce);
76         virtual PassRefPtr<SharedBuffer> resourceData();
77         void clearResourceData();
78 
79         virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse);
80         virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
81         virtual void didReceiveResponse(const ResourceResponse&);
82         virtual void didReceiveData(const char*, int, long long encodedDataLength, bool allAtOnce);
didReceiveCachedMetadata(const char *,int)83         virtual void didReceiveCachedMetadata(const char*, int) { }
84         void willStopBufferingData(const char*, int);
85         virtual void didFinishLoading(double finishTime);
86         virtual void didFail(const ResourceError&);
87 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK)
88         virtual void didReceiveDataArray(CFArrayRef dataArray);
89 #endif
90 
91         virtual bool shouldUseCredentialStorage();
92         virtual void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
93         void didCancelAuthenticationChallenge(const AuthenticationChallenge&);
94 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
95         virtual bool canAuthenticateAgainstProtectionSpace(const ProtectionSpace&);
96 #endif
97         virtual void receivedCancellation(const AuthenticationChallenge&);
98 
99         // ResourceHandleClient
100         virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse& redirectResponse);
101         virtual void didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
102         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
103         virtual void didReceiveData(ResourceHandle*, const char*, int, int encodedDataLength);
didReceiveCachedMetadata(ResourceHandle *,const char * data,int length)104         virtual void didReceiveCachedMetadata(ResourceHandle*, const char* data, int length) { didReceiveCachedMetadata(data, length); }
105         virtual void didFinishLoading(ResourceHandle*, double finishTime);
106         virtual void didFail(ResourceHandle*, const ResourceError&);
107         virtual void wasBlocked(ResourceHandle*);
108         virtual void cannotShowURL(ResourceHandle*);
willStopBufferingData(ResourceHandle *,const char * data,int length)109         virtual void willStopBufferingData(ResourceHandle*, const char* data, int length) { willStopBufferingData(data, length); }
shouldUseCredentialStorage(ResourceHandle *)110         virtual bool shouldUseCredentialStorage(ResourceHandle*) { return shouldUseCredentialStorage(); }
didReceiveAuthenticationChallenge(ResourceHandle *,const AuthenticationChallenge & challenge)111         virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didReceiveAuthenticationChallenge(challenge); }
didCancelAuthenticationChallenge(ResourceHandle *,const AuthenticationChallenge & challenge)112         virtual void didCancelAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge& challenge) { didCancelAuthenticationChallenge(challenge); }
113 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK)
114         virtual void didReceiveDataArray(ResourceHandle*, CFArrayRef dataArray);
115 #endif
116 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
canAuthenticateAgainstProtectionSpace(ResourceHandle *,const ProtectionSpace & protectionSpace)117         virtual bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace& protectionSpace) { return canAuthenticateAgainstProtectionSpace(protectionSpace); }
118 #endif
receivedCancellation(ResourceHandle *,const AuthenticationChallenge & challenge)119         virtual void receivedCancellation(ResourceHandle*, const AuthenticationChallenge& challenge) { receivedCancellation(challenge); }
120         virtual void willCacheResponse(ResourceHandle*, CacheStoragePolicy&);
121 #if PLATFORM(MAC)
122 #if USE(CFNETWORK)
123         virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef);
124 #else
125         virtual NSCachedURLResponse* willCacheResponse(ResourceHandle*, NSCachedURLResponse*);
126 #endif
127 #endif // PLATFORM(MAC)
128 #if PLATFORM(WIN) && USE(CFNETWORK)
129         // FIXME: Windows should use willCacheResponse - <https://bugs.webkit.org/show_bug.cgi?id=57257>.
130         virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef);
131 #endif
132 #if ENABLE(BLOB)
133         virtual AsyncFileStream* createAsyncFileStream(FileStreamClient*);
134 #endif
135 
url()136         const KURL& url() const { return m_request.url(); }
handle()137         ResourceHandle* handle() const { return m_handle.get(); }
sendResourceLoadCallbacks()138         bool sendResourceLoadCallbacks() const { return m_sendResourceLoadCallbacks; }
139 
reachedTerminalState()140         bool reachedTerminalState() const { return m_reachedTerminalState; }
141 
142         void setShouldBufferData(bool shouldBufferData);
143 
144     protected:
145         ResourceLoader(Frame*, bool sendResourceLoadCallbacks, bool shouldContentSniff);
146 
147 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
148         friend class ApplicationCacheHost;  // for access to request()
149 #endif
150         friend class ResourceLoadScheduler; // for access to start()
151         // start() actually sends the load to the network (unless the load is being
152         // deferred) and should only be called by ResourceLoadScheduler or setDefersLoading().
153         void start();
154 
155         virtual void didCancel(const ResourceError&);
156         void didFinishLoadingOnePart(double finishTime);
157 
request()158         const ResourceRequest& request() const { return m_request; }
cancelled()159         bool cancelled() const { return m_cancelled; }
defersLoading()160         bool defersLoading() const { return m_defersLoading; }
161 
162         RefPtr<ResourceHandle> m_handle;
163         RefPtr<Frame> m_frame;
164         RefPtr<DocumentLoader> m_documentLoader;
165         ResourceResponse m_response;
166 
167     private:
168         ResourceRequest m_request;
169         RefPtr<SharedBuffer> m_resourceData;
170 
171         unsigned long m_identifier;
172 
173         bool m_reachedTerminalState;
174         bool m_cancelled;
175         bool m_calledDidFinishLoad;
176 
177         bool m_sendResourceLoadCallbacks;
178         bool m_shouldContentSniff;
179         bool m_shouldBufferData;
180         bool m_defersLoading;
181         ResourceRequest m_deferredRequest;
182     };
183 
184 }
185 
186 #endif
187