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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 namespace blink { | 48 namespace blink { |
49 | 49 |
50 ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher, Resource* resou
rce) | 50 ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher, Resource* resou
rce) |
51 { | 51 { |
52 return new ResourceLoader(fetcher, resource); | 52 return new ResourceLoader(fetcher, resource); |
53 } | 53 } |
54 | 54 |
55 ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource) | 55 ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource) |
56 : m_fetcher(fetcher) | 56 : m_fetcher(fetcher) |
57 , m_notifiedLoadComplete(false) | 57 , m_notifiedLoadComplete(false) |
58 , m_loadingMultipartContent(false) | |
59 , m_resource(resource) | 58 , m_resource(resource) |
60 , m_state(ConnectionStateNew) | 59 , m_state(ConnectionStateNew) |
61 { | 60 { |
62 ASSERT(m_resource); | 61 ASSERT(m_resource); |
63 ASSERT(m_fetcher); | 62 ASSERT(m_fetcher); |
64 } | 63 } |
65 | 64 |
66 ResourceLoader::~ResourceLoader() | 65 ResourceLoader::~ResourceLoader() |
67 { | 66 { |
68 ASSERT(m_state == ConnectionStateReleased); | 67 ASSERT(m_state == ConnectionStateReleased); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 { | 121 { |
123 RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse); | 122 RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse); |
124 m_fetcher->didDownloadData(m_resource.get(), length, encodedDataLength); | 123 m_fetcher->didDownloadData(m_resource.get(), length, encodedDataLength); |
125 if (m_state == ConnectionStateReleased) | 124 if (m_state == ConnectionStateReleased) |
126 return; | 125 return; |
127 m_resource->didDownloadData(length); | 126 m_resource->didDownloadData(length); |
128 } | 127 } |
129 | 128 |
130 void ResourceLoader::didFinishLoadingOnePart(double finishTime, int64_t encodedD
ataLength) | 129 void ResourceLoader::didFinishLoadingOnePart(double finishTime, int64_t encodedD
ataLength) |
131 { | 130 { |
132 // If load has been cancelled after finishing (which could happen with a | 131 ASSERT(m_state != ConnectionStateReleased); |
133 // JavaScript that changes the window location), do nothing. | 132 if (!isFinishing()) { |
| 133 // When loading a multipart resource, make the loader non-block when |
| 134 // finishing loading the first part. |
| 135 m_fetcher->subresourceLoaderFinishedLoadingOnePart(this); |
| 136 } |
| 137 |
134 if (m_state == ConnectionStateReleased) | 138 if (m_state == ConnectionStateReleased) |
135 return; | 139 return; |
136 | 140 |
137 if (m_notifiedLoadComplete) | 141 if (m_notifiedLoadComplete) |
138 return; | 142 return; |
139 m_notifiedLoadComplete = true; | 143 m_notifiedLoadComplete = true; |
140 m_fetcher->didFinishLoading(m_resource.get(), finishTime, encodedDataLength)
; | 144 m_fetcher->didFinishLoading(m_resource.get(), finishTime, encodedDataLength)
; |
141 } | 145 } |
142 | 146 |
143 void ResourceLoader::didChangePriority(ResourceLoadPriority loadPriority, int in
traPriorityValue) | 147 void ResourceLoader::didChangePriority(ResourceLoadPriority loadPriority, int in
traPriorityValue) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 // If the fetch was (potentially) CORS enabled, an access control check of t
he response is required. | 222 // If the fetch was (potentially) CORS enabled, an access control check of t
he response is required. |
219 return m_resource->options().corsEnabled == IsCORSEnabled; | 223 return m_resource->options().corsEnabled == IsCORSEnabled; |
220 } | 224 } |
221 | 225 |
222 void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
ponse, WebDataConsumerHandle* rawHandle) | 226 void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
ponse, WebDataConsumerHandle* rawHandle) |
223 { | 227 { |
224 ASSERT(!response.isNull()); | 228 ASSERT(!response.isNull()); |
225 // |rawHandle|'s ownership is transferred to the callee. | 229 // |rawHandle|'s ownership is transferred to the callee. |
226 OwnPtr<WebDataConsumerHandle> handle = adoptPtr(rawHandle); | 230 OwnPtr<WebDataConsumerHandle> handle = adoptPtr(rawHandle); |
227 | 231 |
228 bool isMultipartPayload = response.isMultipartPayload(); | |
229 bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state
== ConnectionStateReceivedResponse); | 232 bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state
== ConnectionStateReceivedResponse); |
230 // In the case of multipart loads, calls to didReceiveData & didReceiveRespo
nse can be interleaved. | 233 RELEASE_ASSERT(isValidStateTransition); |
231 RELEASE_ASSERT(isMultipartPayload || isValidStateTransition); | |
232 m_state = ConnectionStateReceivedResponse; | 234 m_state = ConnectionStateReceivedResponse; |
233 | 235 |
234 const ResourceResponse& resourceResponse = response.toResourceResponse(); | 236 const ResourceResponse& resourceResponse = response.toResourceResponse(); |
235 | 237 |
236 if (responseNeedsAccessControlCheck()) { | 238 if (responseNeedsAccessControlCheck()) { |
237 if (response.wasFetchedViaServiceWorker()) { | 239 if (response.wasFetchedViaServiceWorker()) { |
238 if (response.wasFallbackRequiredByServiceWorker()) { | 240 if (response.wasFallbackRequiredByServiceWorker()) { |
239 m_loader->cancel(); | 241 m_loader->cancel(); |
240 m_loader.clear(); | 242 m_loader.clear(); |
241 m_state = ConnectionStateStarted; | 243 m_state = ConnectionStateStarted; |
(...skipping 17 matching lines...) Expand all Loading... |
259 } | 261 } |
260 | 262 |
261 m_resource->responseReceived(resourceResponse, handle.release()); | 263 m_resource->responseReceived(resourceResponse, handle.release()); |
262 if (m_state == ConnectionStateReleased) | 264 if (m_state == ConnectionStateReleased) |
263 return; | 265 return; |
264 | 266 |
265 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse); | 267 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse); |
266 if (m_state == ConnectionStateReleased) | 268 if (m_state == ConnectionStateReleased) |
267 return; | 269 return; |
268 | 270 |
269 if (response.toResourceResponse().isMultipart()) { | |
270 // We only support multipart for images, though the image may be loaded | |
271 // as a main resource that we end up displaying through an ImageDocument
. | |
272 if (!m_resource->isImage() && m_resource->getType() != Resource::MainRes
ource) { | |
273 cancel(ResourceError::cancelledError(resourceResponse.url())); | |
274 return; | |
275 } | |
276 m_loadingMultipartContent = true; | |
277 } else if (isMultipartPayload) { | |
278 // Since a subresource loader does not load multipart sections progressi
vely, data was delivered to the loader all at once. | |
279 // After the first multipart section is complete, signal to delegates th
at this load is "finished" | |
280 m_fetcher->subresourceLoaderFinishedLoadingOnePart(this); | |
281 didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncodedDataLength
); | |
282 } | |
283 if (m_state == ConnectionStateReleased) | |
284 return; | |
285 | |
286 if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnor
eHTTPStatusCodeErrors()) | 271 if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnor
eHTTPStatusCodeErrors()) |
287 return; | 272 return; |
288 | 273 |
289 if (!m_notifiedLoadComplete) { | 274 if (!m_notifiedLoadComplete) { |
290 m_notifiedLoadComplete = true; | 275 m_notifiedLoadComplete = true; |
291 m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledErro
r(resourceResponse.url())); | 276 m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledErro
r(resourceResponse.url())); |
292 } | 277 } |
293 | 278 |
294 ASSERT(m_state != ConnectionStateReleased); | 279 ASSERT(m_state != ConnectionStateReleased); |
295 m_resource->error(Resource::LoadError); | 280 m_resource->error(Resource::LoadError); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 // empty buffer is a noop in most cases, but is destructive in the case of | 394 // empty buffer is a noop in most cases, but is destructive in the case of |
410 // a 304, where it will overwrite the cached data we should be reusing. | 395 // a 304, where it will overwrite the cached data we should be reusing. |
411 if (dataOut.size()) { | 396 if (dataOut.size()) { |
412 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size
(), encodedDataLength); | 397 m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size
(), encodedDataLength); |
413 m_resource->setResourceBuffer(dataOut); | 398 m_resource->setResourceBuffer(dataOut); |
414 } | 399 } |
415 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); | 400 didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); |
416 } | 401 } |
417 | 402 |
418 } // namespace blink | 403 } // namespace blink |
OLD | NEW |