OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2010, 2011 Apple Inc. All rights reserved. |
3 * (C) 2007 Graham Dennis (graham.dennis@gmail.com) | 3 * (C) 2007 Graham Dennis (graham.dennis@gmail.com) |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 } | 212 } |
213 | 213 |
214 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, | 214 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, |
215 const WebURLResponse& response) { | 215 const WebURLResponse& response) { |
216 didReceiveResponse(loader, response, nullptr); | 216 didReceiveResponse(loader, response, nullptr); |
217 } | 217 } |
218 | 218 |
219 void ResourceLoader::didReceiveData(WebURLLoader*, | 219 void ResourceLoader::didReceiveData(WebURLLoader*, |
220 const char* data, | 220 const char* data, |
221 int length, | 221 int length, |
222 int encodedDataLength, | 222 int encodedDataLength) { |
223 int encodedBodyLength) { | |
224 CHECK_GE(length, 0); | 223 CHECK_GE(length, 0); |
225 m_fetcher->didReceiveData(m_resource.get(), data, length, encodedDataLength); | 224 m_fetcher->didReceiveData(m_resource.get(), data, length, encodedDataLength); |
226 m_resource->addToEncodedBodyLength(encodedBodyLength); | |
227 m_resource->addToDecodedBodyLength(length); | 225 m_resource->addToDecodedBodyLength(length); |
228 m_resource->appendData(data, length); | 226 m_resource->appendData(data, length); |
229 } | 227 } |
230 | 228 |
231 void ResourceLoader::didFinishLoadingFirstPartInMultipart() { | 229 void ResourceLoader::didFinishLoadingFirstPartInMultipart() { |
232 m_fetcher->didFinishLoading(m_resource.get(), 0, | 230 m_fetcher->didFinishLoading(m_resource.get(), 0, |
233 ResourceFetcher::DidFinishFirstPartInMultipart); | 231 ResourceFetcher::DidFinishFirstPartInMultipart); |
234 } | 232 } |
235 | 233 |
236 void ResourceLoader::didFinishLoading(WebURLLoader*, | 234 void ResourceLoader::didFinishLoading(WebURLLoader*, |
237 double finishTime, | 235 double finishTime, |
238 int64_t encodedDataLength) { | 236 int64_t encodedDataLength, |
| 237 int64_t encodedBodyLength) { |
239 m_resource->setEncodedDataLength(encodedDataLength); | 238 m_resource->setEncodedDataLength(encodedDataLength); |
| 239 m_resource->addToEncodedBodyLength(encodedBodyLength); |
240 m_loader.reset(); | 240 m_loader.reset(); |
241 m_fetcher->didFinishLoading(m_resource.get(), finishTime, | 241 m_fetcher->didFinishLoading(m_resource.get(), finishTime, |
242 ResourceFetcher::DidFinishLoading); | 242 ResourceFetcher::DidFinishLoading); |
243 } | 243 } |
244 | 244 |
245 void ResourceLoader::didFail(WebURLLoader*, | 245 void ResourceLoader::didFail(WebURLLoader*, |
246 const WebURLError& error, | 246 const WebURLError& error, |
247 int64_t encodedDataLength) { | 247 int64_t encodedDataLength, |
| 248 int64_t encodedBodyLength) { |
248 m_resource->setEncodedDataLength(encodedDataLength); | 249 m_resource->setEncodedDataLength(encodedDataLength); |
| 250 m_resource->addToEncodedBodyLength(encodedBodyLength); |
249 didFail(error); | 251 didFail(error); |
250 } | 252 } |
251 | 253 |
252 void ResourceLoader::didFail(const ResourceError& error) { | 254 void ResourceLoader::didFail(const ResourceError& error) { |
253 if (m_isCacheAwareLoadingActivated && error.isCacheMiss() && | 255 if (m_isCacheAwareLoadingActivated && error.isCacheMiss() && |
254 m_fetcher->context().shouldLoadNewResource(m_resource->getType())) { | 256 m_fetcher->context().shouldLoadNewResource(m_resource->getType())) { |
255 m_resource->willReloadAfterDiskCacheMiss(); | 257 m_resource->willReloadAfterDiskCacheMiss(); |
256 m_isCacheAwareLoadingActivated = false; | 258 m_isCacheAwareLoadingActivated = false; |
257 restart(m_resource->resourceRequest(), | 259 restart(m_resource->resourceRequest(), |
258 m_fetcher->context().loadingTaskRunner(), | 260 m_fetcher->context().loadingTaskRunner(), |
259 m_fetcher->context().defersLoading()); | 261 m_fetcher->context().defersLoading()); |
260 return; | 262 return; |
261 } | 263 } |
262 | 264 |
263 m_loader.reset(); | 265 m_loader.reset(); |
264 m_fetcher->didFailLoading(m_resource.get(), error); | 266 m_fetcher->didFailLoading(m_resource.get(), error); |
265 } | 267 } |
266 | 268 |
267 void ResourceLoader::requestSynchronously(const ResourceRequest& request) { | 269 void ResourceLoader::requestSynchronously(const ResourceRequest& request) { |
268 // downloadToFile is not supported for synchronous requests. | 270 // downloadToFile is not supported for synchronous requests. |
269 DCHECK(!request.downloadToFile()); | 271 DCHECK(!request.downloadToFile()); |
270 DCHECK(m_loader); | 272 DCHECK(m_loader); |
271 DCHECK_EQ(request.priority(), ResourceLoadPriorityHighest); | 273 DCHECK_EQ(request.priority(), ResourceLoadPriorityHighest); |
272 | 274 |
273 WrappedResourceRequest requestIn(request); | 275 WrappedResourceRequest requestIn(request); |
274 WebURLResponse responseOut; | 276 WebURLResponse responseOut; |
275 WebURLError errorOut; | 277 WebURLError errorOut; |
276 WebData dataOut; | 278 WebData dataOut; |
277 int64_t encodedDataLength = WebURLLoaderClient::kUnknownEncodedDataLength; | 279 int64_t encodedDataLength = WebURLLoaderClient::kUnknownEncodedDataLength; |
| 280 int64_t encodedBodyLength = 0; |
278 m_loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut, | 281 m_loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut, |
279 encodedDataLength); | 282 encodedDataLength, encodedBodyLength); |
280 | 283 |
281 // A message dispatched while synchronously fetching the resource | 284 // A message dispatched while synchronously fetching the resource |
282 // can bring about the cancellation of this load. | 285 // can bring about the cancellation of this load. |
283 if (!m_loader) | 286 if (!m_loader) |
284 return; | 287 return; |
285 if (errorOut.reason) { | 288 if (errorOut.reason) { |
286 didFail(0, errorOut, encodedDataLength); | 289 didFail(0, errorOut, encodedDataLength, encodedBodyLength); |
287 return; | 290 return; |
288 } | 291 } |
289 didReceiveResponse(0, responseOut); | 292 didReceiveResponse(0, responseOut); |
290 if (!m_loader) | 293 if (!m_loader) |
291 return; | 294 return; |
292 DCHECK_GE(responseOut.toResourceResponse().encodedBodyLength(), 0); | 295 DCHECK_GE(responseOut.toResourceResponse().encodedBodyLength(), 0); |
293 | 296 |
294 // Follow the async case convention of not calling didReceiveData or | 297 // Follow the async case convention of not calling didReceiveData or |
295 // appending data to m_resource if the response body is empty. Copying the | 298 // appending data to m_resource if the response body is empty. Copying the |
296 // empty buffer is a noop in most cases, but is destructive in the case of | 299 // empty buffer is a noop in most cases, but is destructive in the case of |
297 // a 304, where it will overwrite the cached data we should be reusing. | 300 // a 304, where it will overwrite the cached data we should be reusing. |
298 if (dataOut.size()) { | 301 if (dataOut.size()) { |
299 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size(), | 302 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size(), |
300 encodedDataLength); | 303 encodedDataLength); |
301 m_resource->setResourceBuffer(dataOut); | 304 m_resource->setResourceBuffer(dataOut); |
302 } | 305 } |
303 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); | 306 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength, |
| 307 encodedBodyLength); |
304 } | 308 } |
305 | 309 |
306 void ResourceLoader::activateCacheAwareLoadingIfNeeded( | 310 void ResourceLoader::activateCacheAwareLoadingIfNeeded( |
307 const ResourceRequest& request) { | 311 const ResourceRequest& request) { |
308 DCHECK(!m_isCacheAwareLoadingActivated); | 312 DCHECK(!m_isCacheAwareLoadingActivated); |
309 | 313 |
310 if (m_resource->options().cacheAwareLoadingEnabled != | 314 if (m_resource->options().cacheAwareLoadingEnabled != |
311 IsCacheAwareLoadingEnabled) | 315 IsCacheAwareLoadingEnabled) |
312 return; | 316 return; |
313 | 317 |
314 // Synchronous requests are not supported. | 318 // Synchronous requests are not supported. |
315 if (m_resource->options().synchronousPolicy == RequestSynchronously) | 319 if (m_resource->options().synchronousPolicy == RequestSynchronously) |
316 return; | 320 return; |
317 | 321 |
318 // Don't activate on Resource revalidation. | 322 // Don't activate on Resource revalidation. |
319 if (m_resource->isCacheValidator()) | 323 if (m_resource->isCacheValidator()) |
320 return; | 324 return; |
321 | 325 |
322 // Don't activate if cache policy is explicitly set. | 326 // Don't activate if cache policy is explicitly set. |
323 if (request.getCachePolicy() != WebCachePolicy::UseProtocolCachePolicy) | 327 if (request.getCachePolicy() != WebCachePolicy::UseProtocolCachePolicy) |
324 return; | 328 return; |
325 | 329 |
326 m_isCacheAwareLoadingActivated = true; | 330 m_isCacheAwareLoadingActivated = true; |
327 } | 331 } |
328 | 332 |
329 } // namespace blink | 333 } // namespace blink |
OLD | NEW |