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 29 matching lines...) Expand all Loading... |
40 #include "public/platform/Platform.h" | 40 #include "public/platform/Platform.h" |
41 #include "public/platform/WebData.h" | 41 #include "public/platform/WebData.h" |
42 #include "public/platform/WebURLError.h" | 42 #include "public/platform/WebURLError.h" |
43 #include "public/platform/WebURLRequest.h" | 43 #include "public/platform/WebURLRequest.h" |
44 #include "public/platform/WebURLResponse.h" | 44 #include "public/platform/WebURLResponse.h" |
45 #include "wtf/Assertions.h" | 45 #include "wtf/Assertions.h" |
46 #include "wtf/CurrentTime.h" | 46 #include "wtf/CurrentTime.h" |
47 | 47 |
48 namespace blink { | 48 namespace blink { |
49 | 49 |
50 namespace { | 50 ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher, Resource* resou
rce) |
51 | |
52 bool isManualRedirectFetchRequest(const ResourceRequest& request) | |
53 { | 51 { |
54 return request.fetchRedirectMode() == WebURLRequest::FetchRedirectModeManual
&& request.requestContext() == WebURLRequest::RequestContextFetch; | 52 return new ResourceLoader(fetcher, resource); |
55 } | 53 } |
56 | 54 |
57 } // namespace | 55 ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource) |
58 | |
59 ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher, Resource* resou
rce, const ResourceRequest& request, const ResourceLoaderOptions& options) | |
60 { | |
61 ResourceLoader* loader = new ResourceLoader(fetcher, resource, options); | |
62 loader->init(request); | |
63 return loader; | |
64 } | |
65 | |
66 ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource, con
st ResourceLoaderOptions& options) | |
67 : m_fetcher(fetcher) | 56 : m_fetcher(fetcher) |
68 , m_notifiedLoadComplete(false) | 57 , m_notifiedLoadComplete(false) |
69 , m_loadingMultipartContent(false) | 58 , m_loadingMultipartContent(false) |
70 , m_options(options) | |
71 , m_resource(resource) | 59 , m_resource(resource) |
72 , m_state(ConnectionStateNew) | 60 , m_state(ConnectionStateNew) |
73 { | 61 { |
74 ASSERT(m_resource); | 62 ASSERT(m_resource); |
75 ASSERT(m_fetcher); | 63 ASSERT(m_fetcher); |
76 } | 64 } |
77 | 65 |
78 ResourceLoader::~ResourceLoader() | 66 ResourceLoader::~ResourceLoader() |
79 { | 67 { |
80 ASSERT(m_state == ConnectionStateReleased); | 68 ASSERT(m_state == ConnectionStateReleased); |
(...skipping 17 matching lines...) Expand all Loading... |
98 | 86 |
99 ASSERT(m_state != ConnectionStateReleased); | 87 ASSERT(m_state != ConnectionStateReleased); |
100 m_state = ConnectionStateReleased; | 88 m_state = ConnectionStateReleased; |
101 if (m_loader) { | 89 if (m_loader) { |
102 m_loader->cancel(); | 90 m_loader->cancel(); |
103 m_loader.clear(); | 91 m_loader.clear(); |
104 } | 92 } |
105 m_fetcher.clear(); | 93 m_fetcher.clear(); |
106 } | 94 } |
107 | 95 |
108 void ResourceLoader::init(const ResourceRequest& passedRequest) | 96 void ResourceLoader::start(ResourceRequest& request) |
109 { | |
110 ResourceRequest request(passedRequest); | |
111 m_fetcher->willSendRequest(m_resource->identifier(), request, ResourceRespon
se(), m_options.initiatorInfo); | |
112 m_originalRequest = m_request = applyOptions(request); | |
113 m_resource->updateRequest(request); | |
114 m_fetcher->didInitializeResourceLoader(this); | |
115 } | |
116 | |
117 void ResourceLoader::start() | |
118 { | 97 { |
119 ASSERT(!m_loader); | 98 ASSERT(!m_loader); |
120 ASSERT(!m_request.isNull()); | |
121 | 99 |
122 m_fetcher->willStartLoadingResource(m_resource.get(), m_request); | 100 m_fetcher->willStartLoadingResource(m_resource.get(), this, request); |
123 RELEASE_ASSERT(m_state == ConnectionStateNew); | 101 RELEASE_ASSERT(m_state == ConnectionStateNew); |
124 m_state = ConnectionStateStarted; | 102 m_state = ConnectionStateStarted; |
125 | 103 |
126 m_loader = adoptPtr(Platform::current()->createURLLoader()); | 104 m_loader = adoptPtr(Platform::current()->createURLLoader()); |
127 m_loader->setDefersLoading(m_fetcher->defersLoading()); | 105 m_loader->setDefersLoading(m_fetcher->defersLoading()); |
128 ASSERT(m_loader); | 106 ASSERT(m_loader); |
129 m_loader->setLoadingTaskRunner(m_fetcher->loadingTaskRunner()); | 107 m_loader->setLoadingTaskRunner(m_fetcher->loadingTaskRunner()); |
130 | 108 |
131 if (m_options.synchronousPolicy == RequestSynchronously) | 109 if (m_resource->options().synchronousPolicy == RequestSynchronously) |
132 requestSynchronously(); | 110 requestSynchronously(request); |
133 else | 111 else |
134 m_loader->loadAsynchronously(WrappedResourceRequest(m_request), this); | 112 m_loader->loadAsynchronously(WrappedResourceRequest(request), this); |
135 } | |
136 | |
137 void ResourceLoader::changeToSynchronous() | |
138 { | |
139 ASSERT(m_options.synchronousPolicy == RequestAsynchronously); | |
140 ASSERT(m_loader); | |
141 m_loader->cancel(); | |
142 m_loader.clear(); | |
143 m_loader = adoptPtr(Platform::current()->createURLLoader()); | |
144 ASSERT(m_loader); | |
145 m_request.setPriority(ResourceLoadPriorityHighest); | |
146 m_state = ConnectionStateStarted; | |
147 requestSynchronously(); | |
148 } | 113 } |
149 | 114 |
150 void ResourceLoader::setDefersLoading(bool defers) | 115 void ResourceLoader::setDefersLoading(bool defers) |
151 { | 116 { |
152 ASSERT(m_loader); | 117 ASSERT(m_loader); |
153 m_loader->setDefersLoading(defers); | 118 m_loader->setDefersLoading(defers); |
154 } | 119 } |
155 | 120 |
156 void ResourceLoader::didDownloadData(WebURLLoader*, int length, int encodedDataL
ength) | 121 void ResourceLoader::didDownloadData(WebURLLoader*, int length, int encodedDataL
ength) |
157 { | 122 { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 void ResourceLoader::cancel(const ResourceError& error) | 162 void ResourceLoader::cancel(const ResourceError& error) |
198 { | 163 { |
199 // If the load has already completed - succeeded, failed, or previously canc
elled - do nothing. | 164 // If the load has already completed - succeeded, failed, or previously canc
elled - do nothing. |
200 if (m_state == ConnectionStateReleased) | 165 if (m_state == ConnectionStateReleased) |
201 return; | 166 return; |
202 if (isFinishing()) { | 167 if (isFinishing()) { |
203 releaseResources(); | 168 releaseResources(); |
204 return; | 169 return; |
205 } | 170 } |
206 | 171 |
207 ResourceError nonNullError = error.isNull() ? ResourceError::cancelledError(
m_request.url()) : error; | 172 ResourceError nonNullError = error.isNull() ? ResourceError::cancelledError(
m_resource->lastResourceRequest().url()) : error; |
208 | 173 |
209 WTF_LOG(ResourceLoading, "Cancelled load of '%s'.\n", m_resource->url().getS
tring().latin1().data()); | 174 WTF_LOG(ResourceLoading, "Cancelled load of '%s'.\n", m_resource->url().getS
tring().latin1().data()); |
210 m_state = ConnectionStateCanceled; | 175 m_state = ConnectionStateCanceled; |
211 m_resource->setResourceError(nonNullError); | 176 m_resource->setResourceError(nonNullError); |
212 | 177 |
213 if (!m_notifiedLoadComplete) { | 178 if (!m_notifiedLoadComplete) { |
214 m_notifiedLoadComplete = true; | 179 m_notifiedLoadComplete = true; |
215 m_fetcher->didFailLoading(m_resource.get(), nonNullError); | 180 m_fetcher->didFailLoading(m_resource.get(), nonNullError); |
216 } | 181 } |
217 | 182 |
218 if (m_state != ConnectionStateReleased) | 183 if (m_state != ConnectionStateReleased) |
219 m_resource->error(Resource::LoadError); | 184 m_resource->error(Resource::LoadError); |
220 if (m_state != ConnectionStateReleased) | 185 if (m_state != ConnectionStateReleased) |
221 releaseResources(); | 186 releaseResources(); |
222 } | 187 } |
223 | 188 |
224 void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewR
equest, const WebURLResponse& passedRedirectResponse) | 189 void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewR
equest, const WebURLResponse& passedRedirectResponse) |
225 { | 190 { |
226 ASSERT(m_state != ConnectionStateReleased); | 191 ASSERT(m_state != ConnectionStateReleased); |
| 192 ASSERT(!passedNewRequest.isNull()); |
| 193 ASSERT(!passedRedirectResponse.isNull()); |
227 | 194 |
228 ResourceRequest& newRequest(applyOptions(passedNewRequest.toMutableResourceR
equest())); | 195 ResourceRequest& newRequest(passedNewRequest.toMutableResourceRequest()); |
| 196 const ResourceResponse& redirectResponse(passedRedirectResponse.toResourceRe
sponse()); |
| 197 newRequest.setFollowedRedirect(true); |
229 | 198 |
230 ASSERT(!newRequest.isNull()); | 199 if (m_fetcher->willFollowRedirect(m_resource.get(), newRequest, redirectResp
onse)) |
231 const ResourceResponse& redirectResponse(passedRedirectResponse.toResourceRe
sponse()); | 200 m_resource->willFollowRedirect(newRequest, redirectResponse); |
232 ASSERT(!redirectResponse.isNull()); | 201 else |
233 newRequest.setFollowedRedirect(true); | |
234 if (!isManualRedirectFetchRequest(m_resource->resourceRequest()) && !m_fetch
er->canAccessRedirect(m_resource.get(), newRequest, redirectResponse, m_options)
) { | |
235 cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url())); | 202 cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url())); |
236 return; | |
237 } | |
238 ASSERT(m_state != ConnectionStateReleased); | |
239 | |
240 applyOptions(newRequest); // canAccessRedirect() can modify m_options so we
should re-apply it. | |
241 m_fetcher->redirectReceived(m_resource.get(), redirectResponse); | |
242 ASSERT(m_state != ConnectionStateReleased); | |
243 m_resource->willFollowRedirect(newRequest, redirectResponse); | |
244 if (newRequest.isNull() || m_state == ConnectionStateReleased) | |
245 return; | |
246 | |
247 m_fetcher->willSendRequest(m_resource->identifier(), newRequest, redirectRes
ponse, m_options.initiatorInfo); | |
248 ASSERT(m_state != ConnectionStateReleased); | |
249 ASSERT(!newRequest.isNull()); | |
250 m_resource->updateRequest(newRequest); | |
251 m_request = newRequest; | |
252 } | 203 } |
253 | 204 |
254 void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, i
nt length) | 205 void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, i
nt length) |
255 { | 206 { |
256 RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == Conn
ectionStateReceivingData); | 207 RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == Conn
ectionStateReceivingData); |
257 m_resource->setSerializedCachedMetadata(data, length); | 208 m_resource->setSerializedCachedMetadata(data, length); |
258 } | 209 } |
259 | 210 |
260 void ResourceLoader::didSendData(WebURLLoader*, unsigned long long bytesSent, un
signed long long totalBytesToBeSent) | 211 void ResourceLoader::didSendData(WebURLLoader*, unsigned long long bytesSent, un
signed long long totalBytesToBeSent) |
261 { | 212 { |
262 m_resource->didSendData(bytesSent, totalBytesToBeSent); | 213 m_resource->didSendData(bytesSent, totalBytesToBeSent); |
263 } | 214 } |
264 | 215 |
265 bool ResourceLoader::responseNeedsAccessControlCheck() const | 216 bool ResourceLoader::responseNeedsAccessControlCheck() const |
266 { | 217 { |
267 // If the fetch was (potentially) CORS enabled, an access control check of t
he response is required. | 218 // If the fetch was (potentially) CORS enabled, an access control check of t
he response is required. |
268 return m_options.corsEnabled == IsCORSEnabled; | 219 return m_resource->options().corsEnabled == IsCORSEnabled; |
269 } | 220 } |
270 | 221 |
271 void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
ponse, WebDataConsumerHandle* rawHandle) | 222 void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
ponse, WebDataConsumerHandle* rawHandle) |
272 { | 223 { |
273 ASSERT(!response.isNull()); | 224 ASSERT(!response.isNull()); |
274 // |rawHandle|'s ownership is transferred to the callee. | 225 // |rawHandle|'s ownership is transferred to the callee. |
275 OwnPtr<WebDataConsumerHandle> handle = adoptPtr(rawHandle); | 226 OwnPtr<WebDataConsumerHandle> handle = adoptPtr(rawHandle); |
276 | 227 |
277 bool isMultipartPayload = response.isMultipartPayload(); | 228 bool isMultipartPayload = response.isMultipartPayload(); |
278 bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state
== ConnectionStateReceivedResponse); | 229 bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state
== ConnectionStateReceivedResponse); |
279 // In the case of multipart loads, calls to didReceiveData & didReceiveRespo
nse can be interleaved. | 230 // In the case of multipart loads, calls to didReceiveData & didReceiveRespo
nse can be interleaved. |
280 RELEASE_ASSERT(isMultipartPayload || isValidStateTransition); | 231 RELEASE_ASSERT(isMultipartPayload || isValidStateTransition); |
281 m_state = ConnectionStateReceivedResponse; | 232 m_state = ConnectionStateReceivedResponse; |
282 | 233 |
283 const ResourceResponse& resourceResponse = response.toResourceResponse(); | 234 const ResourceResponse& resourceResponse = response.toResourceResponse(); |
284 | 235 |
285 if (responseNeedsAccessControlCheck()) { | 236 if (responseNeedsAccessControlCheck()) { |
286 if (response.wasFetchedViaServiceWorker()) { | 237 if (response.wasFetchedViaServiceWorker()) { |
287 if (response.wasFallbackRequiredByServiceWorker()) { | 238 if (response.wasFallbackRequiredByServiceWorker()) { |
288 m_loader->cancel(); | 239 m_loader->cancel(); |
289 m_loader.clear(); | 240 m_loader.clear(); |
290 m_state = ConnectionStateStarted; | 241 m_state = ConnectionStateStarted; |
291 m_loader = adoptPtr(Platform::current()->createURLLoader()); | 242 m_loader = adoptPtr(Platform::current()->createURLLoader()); |
292 ASSERT(m_loader); | 243 ASSERT(m_loader); |
293 ASSERT(!m_request.skipServiceWorker()); | 244 ResourceRequest request = m_resource->lastResourceRequest(); |
294 m_request.setSkipServiceWorker(true); | 245 ASSERT(!request.skipServiceWorker()); |
295 WrappedResourceRequest wrappedRequest(m_request); | 246 request.setSkipServiceWorker(true); |
296 m_loader->loadAsynchronously(wrappedRequest, this); | 247 m_loader->loadAsynchronously(WrappedResourceRequest(request), th
is); |
297 return; | 248 return; |
298 } | 249 } |
299 } else { | 250 } else { |
300 if (!m_resource->isCacheValidator() || resourceResponse.httpStatusCo
de() != 304) | 251 if (!m_resource->isCacheValidator() || resourceResponse.httpStatusCo
de() != 304) |
301 m_resource->setResponse(resourceResponse); | 252 m_resource->setResponse(resourceResponse); |
302 if (!m_fetcher->canAccessResource(m_resource.get(), m_options.securi
tyOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessControlErrors))
{ | 253 if (!m_fetcher->canAccessResource(m_resource.get(), m_resource->opti
ons().securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessCont
rolErrors)) { |
303 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse
); | 254 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse
); |
304 cancel(ResourceError::cancelledDueToAccessCheckError(KURL(respon
se.url()))); | 255 cancel(ResourceError::cancelledDueToAccessCheckError(KURL(respon
se.url()))); |
305 return; | 256 return; |
306 } | 257 } |
307 } | 258 } |
308 } | 259 } |
309 | 260 |
310 m_resource->responseReceived(resourceResponse, handle.release()); | 261 m_resource->responseReceived(resourceResponse, handle.release()); |
311 if (m_state == ConnectionStateReleased) | 262 if (m_state == ConnectionStateReleased) |
312 return; | 263 return; |
313 | 264 |
314 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse); | 265 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse); |
315 if (m_state == ConnectionStateReleased) | 266 if (m_state == ConnectionStateReleased) |
316 return; | 267 return; |
317 | 268 |
318 if (response.toResourceResponse().isMultipart()) { | 269 if (response.toResourceResponse().isMultipart()) { |
319 // We only support multipart for images, though the image may be loaded | 270 // We only support multipart for images, though the image may be loaded |
320 // as a main resource that we end up displaying through an ImageDocument
. | 271 // as a main resource that we end up displaying through an ImageDocument
. |
321 if (!m_resource->isImage() && m_resource->getType() != Resource::MainRes
ource) { | 272 if (!m_resource->isImage() && m_resource->getType() != Resource::MainRes
ource) { |
322 cancel(); | 273 cancel(ResourceError::cancelledError(resourceResponse.url())); |
323 return; | 274 return; |
324 } | 275 } |
325 m_loadingMultipartContent = true; | 276 m_loadingMultipartContent = true; |
326 } else if (isMultipartPayload) { | 277 } else if (isMultipartPayload) { |
327 // Since a subresource loader does not load multipart sections progressi
vely, data was delivered to the loader all at once. | 278 // Since a subresource loader does not load multipart sections progressi
vely, data was delivered to the loader all at once. |
328 // After the first multipart section is complete, signal to delegates th
at this load is "finished" | 279 // After the first multipart section is complete, signal to delegates th
at this load is "finished" |
329 m_fetcher->subresourceLoaderFinishedLoadingOnePart(this); | 280 m_fetcher->subresourceLoaderFinishedLoadingOnePart(this); |
330 didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncodedDataLength
); | 281 didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncodedDataLength
); |
331 } | 282 } |
332 if (m_state == ConnectionStateReleased) | 283 if (m_state == ConnectionStateReleased) |
333 return; | 284 return; |
334 | 285 |
335 if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnor
eHTTPStatusCodeErrors()) | 286 if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnor
eHTTPStatusCodeErrors()) |
336 return; | 287 return; |
337 | 288 |
338 if (!m_notifiedLoadComplete) { | 289 if (!m_notifiedLoadComplete) { |
339 m_notifiedLoadComplete = true; | 290 m_notifiedLoadComplete = true; |
340 m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledErro
r(m_request.url())); | 291 m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledErro
r(resourceResponse.url())); |
341 } | 292 } |
342 | 293 |
343 ASSERT(m_state != ConnectionStateReleased); | 294 ASSERT(m_state != ConnectionStateReleased); |
344 m_resource->error(Resource::LoadError); | 295 m_resource->error(Resource::LoadError); |
345 cancel(); | 296 cancel(ResourceError::cancelledError(resourceResponse.url())); |
346 } | 297 } |
347 | 298 |
348 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, const WebURLRespon
se& response) | 299 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, const WebURLRespon
se& response) |
349 { | 300 { |
350 didReceiveResponse(loader, response, nullptr); | 301 didReceiveResponse(loader, response, nullptr); |
351 } | 302 } |
352 | 303 |
353 void ResourceLoader::didReceiveData(WebURLLoader*, const char* data, int length,
int encodedDataLength) | 304 void ResourceLoader::didReceiveData(WebURLLoader*, const char* data, int length,
int encodedDataLength) |
354 { | 305 { |
355 RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == Conn
ectionStateReceivingData); | 306 RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == Conn
ectionStateReceivingData); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 return; | 360 return; |
410 | 361 |
411 m_resource->error(Resource::LoadError); | 362 m_resource->error(Resource::LoadError); |
412 | 363 |
413 if (m_state == ConnectionStateReleased) | 364 if (m_state == ConnectionStateReleased) |
414 return; | 365 return; |
415 | 366 |
416 releaseResources(); | 367 releaseResources(); |
417 } | 368 } |
418 | 369 |
419 void ResourceLoader::requestSynchronously() | 370 void ResourceLoader::requestSynchronously(ResourceRequest& request) |
420 { | 371 { |
421 // downloadToFile is not supported for synchronous requests. | 372 // downloadToFile is not supported for synchronous requests. |
422 ASSERT(!m_request.downloadToFile()); | 373 ASSERT(!request.downloadToFile()); |
423 ASSERT(m_loader); | 374 ASSERT(m_loader); |
424 | 375 |
| 376 // Synchronous requests should always be max priority, lest they hang the re
nderer. |
| 377 request.setPriority(ResourceLoadPriorityHighest); |
| 378 |
425 if (m_fetcher->defersLoading()) { | 379 if (m_fetcher->defersLoading()) { |
426 cancel(); | 380 cancel(); |
427 return; | 381 return; |
428 } | 382 } |
429 | 383 |
430 RefPtrWillBeRawPtr<Resource> protectResource(m_resource.get()); | 384 RefPtrWillBeRawPtr<Resource> protectResource(m_resource.get()); |
431 WrappedResourceRequest requestIn(m_request); | 385 WrappedResourceRequest requestIn(request); |
432 WebURLResponse responseOut; | 386 WebURLResponse responseOut; |
433 responseOut.initialize(); | 387 responseOut.initialize(); |
434 WebURLError errorOut; | 388 WebURLError errorOut; |
435 WebData dataOut; | 389 WebData dataOut; |
436 m_loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut); | 390 m_loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut); |
437 if (errorOut.reason) { | 391 if (errorOut.reason) { |
438 if (m_state == ConnectionStateReleased) { | 392 if (m_state == ConnectionStateReleased) { |
439 // A message dispatched while synchronously fetching the resource | 393 // A message dispatched while synchronously fetching the resource |
440 // can bring about the cancellation of this load. | 394 // can bring about the cancellation of this load. |
441 ASSERT(!m_resource); | 395 ASSERT(!m_resource); |
(...skipping 12 matching lines...) Expand all Loading... |
454 // appending data to m_resource if the response body is empty. Copying the | 408 // appending data to m_resource if the response body is empty. Copying the |
455 // empty buffer is a noop in most cases, but is destructive in the case of | 409 // empty buffer is a noop in most cases, but is destructive in the case of |
456 // a 304, where it will overwrite the cached data we should be reusing. | 410 // a 304, where it will overwrite the cached data we should be reusing. |
457 if (dataOut.size()) { | 411 if (dataOut.size()) { |
458 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size
(), encodedDataLength); | 412 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size
(), encodedDataLength); |
459 m_resource->setResourceBuffer(dataOut); | 413 m_resource->setResourceBuffer(dataOut); |
460 } | 414 } |
461 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); | 415 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); |
462 } | 416 } |
463 | 417 |
464 ResourceRequest& ResourceLoader::applyOptions(ResourceRequest& request) const | |
465 { | |
466 request.setAllowStoredCredentials(m_options.allowCredentials == AllowStoredC
redentials); | |
467 return request; | |
468 } | |
469 | |
470 } // namespace blink | 418 } // namespace blink |
OLD | NEW |