OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2009 Google 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 are | |
6 * met: | |
7 * | |
8 * * Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * * Redistributions in binary form must reproduce the above | |
11 * copyright notice, this list of conditions and the following disclaimer | |
12 * in the documentation and/or other materials provided with the | |
13 * distribution. | |
14 * * Neither the name of Google Inc. nor the names of its | |
15 * contributors may be used to endorse or promote products derived from | |
16 * this software without specific prior written permission. | |
17 * | |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 */ | |
30 | |
31 #include "config.h" | |
32 #include "ResourceHandle.h" | |
33 | |
34 #include "ResourceHandleClient.h" | |
35 #include "ResourceRequest.h" | |
36 | |
37 #include "WebKit.h" | |
38 #include "WebKitClient.h" | |
39 #include "WebURLError.h" | |
40 #include "WebURLLoader.h" | |
41 #include "WebURLLoaderClient.h" | |
42 #include "WebURLRequest.h" | |
43 #include "WebURLResponse.h" | |
44 #include "WrappedResourceRequest.h" | |
45 #include "WrappedResourceResponse.h" | |
46 | |
47 using namespace WebKit; | |
48 | |
49 namespace WebCore { | |
50 | |
51 // ResourceHandleInternal ----------------------------------------------------- | |
52 | |
53 class ResourceHandleInternal : public WebURLLoaderClient { | |
54 public: | |
55 ResourceHandleInternal(const ResourceRequest& request, ResourceHandleClient* client) | |
56 : m_request(request) | |
57 , m_owner(0) | |
58 , m_client(client) | |
59 { | |
60 } | |
61 | |
62 void start(); | |
63 void cancel(); | |
64 void setDefersLoading(bool); | |
65 bool allowStoredCredentials() const; | |
66 | |
67 // WebURLLoaderClient methods: | |
68 virtual void willSendRequest(WebURLLoader*, WebURLRequest&, const WebURLResponse&); | |
69 virtual void didSendData( | |
70 WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); | |
71 virtual void didReceiveResponse(WebURLLoader*, const WebURLResponse&); | |
72 virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength); | |
73 virtual void didFinishLoading(WebURLLoader*); | |
74 virtual void didFail(WebURLLoader*, const WebURLError&); | |
75 | |
76 ResourceRequest m_request; | |
77 ResourceHandle* m_owner; | |
78 ResourceHandleClient* m_client; | |
79 OwnPtr<WebURLLoader> m_loader; | |
80 }; | |
81 | |
82 void ResourceHandleInternal::start() | |
83 { | |
84 m_loader.set(webKitClient()->createURLLoader()); | |
85 ASSERT(m_loader.get()); | |
86 | |
87 WrappedResourceRequest wrappedRequest(m_request); | |
88 wrappedRequest.setAllowStoredCredentials(allowStoredCredentials()); | |
89 m_loader->loadAsynchronously(wrappedRequest, this); | |
90 } | |
91 | |
92 void ResourceHandleInternal::cancel() | |
93 { | |
94 m_loader->cancel(); | |
95 | |
96 // Do not make any further calls to the client. | |
97 m_client = 0; | |
98 } | |
99 | |
100 void ResourceHandleInternal::setDefersLoading(bool value) | |
101 { | |
102 m_loader->setDefersLoading(value); | |
103 } | |
104 | |
105 bool ResourceHandleInternal::allowStoredCredentials() const | |
106 { | |
107 return m_client && m_client->shouldUseCredentialStorage(m_owner); | |
108 } | |
109 | |
110 void ResourceHandleInternal::willSendRequest( | |
111 WebURLLoader*, WebURLRequest& request, const WebURLResponse& response) | |
112 { | |
113 ASSERT(m_client); | |
114 ASSERT(!request.isNull()); | |
115 ASSERT(!response.isNull()); | |
116 m_client->willSendRequest(m_owner, request.toMutableResourceRequest(), response.toResourceResponse()); | |
117 } | |
118 | |
119 void ResourceHandleInternal::didSendData( | |
120 WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) | |
121 { | |
122 ASSERT(m_client); | |
123 m_client->didSendData(m_owner, bytesSent, totalBytesToBeSent); | |
124 } | |
125 | |
126 void ResourceHandleInternal::didReceiveResponse(WebURLLoader*, const WebURLResponse& response) | |
127 { | |
128 ASSERT(m_client); | |
129 ASSERT(!response.isNull()); | |
130 m_client->didReceiveResponse(m_owner, response.toResourceResponse()); | |
131 } | |
132 | |
133 void ResourceHandleInternal::didReceiveData( | |
134 WebURLLoader*, const char* data, int dataLength) | |
135 { | |
136 ASSERT(m_client); | |
137 | |
138 // FIXME(yurys): it looks like lengthReceived is always the same as | |
139 // dataLength and that the latter parameter can be eliminated. | |
140 // See WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=31019 | |
141 m_client->didReceiveData(m_owner, data, dataLength, dataLength); | |
142 } | |
143 | |
144 void ResourceHandleInternal::didFinishLoading(WebURLLoader*) | |
145 { | |
146 ASSERT(m_client); | |
147 m_client->didFinishLoading(m_owner); | |
148 } | |
149 | |
150 void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error) | |
151 { | |
152 ASSERT(m_client); | |
153 m_client->didFail(m_owner, error); | |
154 } | |
155 | |
156 // ResourceHandle ------------------------------------------------------------- | |
157 | |
158 ResourceHandle::ResourceHandle(const ResourceRequest& request, | |
159 ResourceHandleClient* client, | |
160 bool defersLoading, | |
161 bool shouldContentSniff, | |
162 bool mightDownloadFromHandle) | |
163 : d(new ResourceHandleInternal(request, client)) | |
164 { | |
165 d->m_owner = this; | |
166 | |
167 // FIXME: Figure out what to do with the bool params. | |
168 } | |
169 | |
170 PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, | |
171 ResourceHandleClient* client, | |
172 Frame* deprecated, | |
173 bool defersLoading, | |
174 bool shouldContentSniff, | |
175 bool mightDownloadFromHandle) | |
176 { | |
177 RefPtr<ResourceHandle> newHandle = adoptRef(new ResourceHandle( | |
178 request, client, defersLoading, shouldContentSniff, mightDownloadFromHandle)); | |
179 | |
180 if (newHandle->start(deprecated)) | |
181 return newHandle.release(); | |
182 | |
183 return 0; | |
184 } | |
185 | |
186 const ResourceRequest& ResourceHandle::request() const | |
187 { | |
188 return d->m_request; | |
189 } | |
190 | |
191 ResourceHandleClient* ResourceHandle::client() const | |
192 { | |
193 return d->m_client; | |
194 } | |
195 | |
196 void ResourceHandle::setClient(ResourceHandleClient* client) | |
197 { | |
198 d->m_client = client; | |
199 } | |
200 | |
201 void ResourceHandle::setDefersLoading(bool value) | |
202 { | |
203 d->setDefersLoading(value); | |
204 } | |
205 | |
206 bool ResourceHandle::start(Frame* deprecated) | |
207 { | |
208 d->start(); | |
209 return true; | |
210 } | |
211 | |
212 void ResourceHandle::clearAuthentication() | |
213 { | |
214 } | |
215 | |
216 void ResourceHandle::cancel() | |
217 { | |
218 d->cancel(); | |
219 } | |
220 | |
221 ResourceHandle::~ResourceHandle() | |
222 { | |
223 d->m_owner = 0; | |
224 } | |
225 | |
226 PassRefPtr<SharedBuffer> ResourceHandle::bufferedData() | |
227 { | |
228 return 0; | |
229 } | |
230 | |
231 bool ResourceHandle::loadsBlocked() | |
232 { | |
233 return false; // This seems to be related to sync XMLHttpRequest... | |
234 } | |
235 | |
236 // static | |
237 bool ResourceHandle::supportsBufferedData() | |
238 { | |
239 return false; // The loader will buffer manually if it needs to. | |
240 } | |
241 | |
242 // static | |
243 void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request, | |
244 StoredCredentials storedCredentials, | |
245 ResourceError& error, | |
246 ResourceResponse& response, | |
247 Vector<char>& data, | |
248 Frame* deprecated) | |
249 { | |
250 OwnPtr<WebURLLoader> loader(webKitClient()->createURLLoader()); | |
251 ASSERT(loader.get()); | |
252 | |
253 WrappedResourceRequest requestIn(request); | |
254 requestIn.setAllowStoredCredentials(storedCredentials == AllowStoredCredentials); | |
255 WrappedResourceResponse responseOut(response); | |
256 WebURLError errorOut; | |
257 WebData dataOut; | |
258 | |
259 loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut); | |
260 | |
261 error = errorOut; | |
262 data.clear(); | |
263 data.append(dataOut.data(), dataOut.size()); | |
264 } | |
265 | |
266 // static | |
267 bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame*) | |
268 { | |
269 // This method is used to determine if a POST request can be repeated from | |
270 // cache, but you cannot really know until you actually try to read from the | |
271 // cache. Even if we checked now, something else could come along and wipe | |
272 // out the cache entry by the time we fetch it. | |
273 // | |
274 // So, we always say yes here, which allows us to generate an ERR_CACHE_MISS | |
275 // if the request cannot be serviced from cache. We force the 'DontLoad' | |
276 // cache policy at this point to ensure that we never hit the network for | |
277 // this request. | |
278 // | |
279 ASSERT(request.httpMethod() == "POST"); | |
280 request.setCachePolicy(ReturnCacheDataDontLoad); | |
281 return true; | |
282 } | |
283 | |
284 } // namespace WebCore | |
OLD | NEW |