| 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 |