Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: third_party/WebKit/Source/core/fetch/Resource.cpp

Issue 1738553002: [ABANDONED] Move multipart/x-mixed-replace related code to ImageResource (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@multipart-cleanup-2
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 { 197 {
198 InspectorInstrumentation::removedResourceFromMemoryCache(this); 198 InspectorInstrumentation::removedResourceFromMemoryCache(this);
199 } 199 }
200 200
201 DEFINE_TRACE(Resource) 201 DEFINE_TRACE(Resource)
202 { 202 {
203 visitor->trace(m_loader); 203 visitor->trace(m_loader);
204 #if ENABLE(OILPAN) 204 #if ENABLE(OILPAN)
205 visitor->trace(m_cacheHandler); 205 visitor->trace(m_cacheHandler);
206 #endif 206 #endif
207 visitor->trace(m_multipartParser);
208 MultipartImageResourceParser::Client::trace(visitor);
209 } 207 }
210 208
211 void Resource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& optio ns) 209 void Resource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& optio ns)
212 { 210 {
213 m_options = options; 211 m_options = options;
214 m_loading = true; 212 m_loading = true;
215 213
216 ResourceRequest request(m_revalidatingRequest.isNull() ? m_resourceRequest : m_revalidatingRequest); 214 ResourceRequest request(m_revalidatingRequest.isNull() ? m_resourceRequest : m_revalidatingRequest);
217 if (!accept().isEmpty()) 215 if (!accept().isEmpty())
218 request.setHTTPAccept(accept()); 216 request.setHTTPAccept(accept());
(...skipping 23 matching lines...) Expand all
242 return; 240 return;
243 241
244 ResourceClientWalker<ResourceClient> w(m_clients); 242 ResourceClientWalker<ResourceClient> w(m_clients);
245 while (ResourceClient* c = w.next()) 243 while (ResourceClient* c = w.next())
246 c->notifyFinished(this); 244 c->notifyFinished(this);
247 } 245 }
248 246
249 void Resource::appendData(const char* data, size_t length) 247 void Resource::appendData(const char* data, size_t length)
250 { 248 {
251 TRACE_EVENT0("blink", "Resource::appendData"); 249 TRACE_EVENT0("blink", "Resource::appendData");
252 if (isMultipartImage()) {
253 m_multipartParser->addData(data, length);
254 return;
255 }
256 appendDataInternal(data, length);
257 }
258
259 void Resource::appendDataInternal(const char* data, size_t length)
260 {
261 ASSERT(m_revalidatingRequest.isNull()); 250 ASSERT(m_revalidatingRequest.isNull());
262 ASSERT(!errorOccurred()); 251 ASSERT(!errorOccurred());
263 if (m_options.dataBufferingPolicy == DoNotBufferData) 252 if (m_options.dataBufferingPolicy == DoNotBufferData)
264 return; 253 return;
265 if (m_data) 254 if (m_data)
266 m_data->append(data, length); 255 m_data->append(data, length);
267 else 256 else
268 m_data = SharedBuffer::createPurgeable(data, length); 257 m_data = SharedBuffer::createPurgeable(data, length);
269 setEncodedSize(m_data->size()); 258 setEncodedSize(m_data->size());
270 } 259 }
(...skipping 20 matching lines...) Expand all
291 HashCountedSet<ResourceClient*>::iterator it = m_clients.begin(); 280 HashCountedSet<ResourceClient*>::iterator it = m_clients.begin();
292 for (int i = it->value; i; i--) { 281 for (int i = it->value; i; i--) {
293 m_finishedClients.add(it->key); 282 m_finishedClients.add(it->key);
294 m_clients.remove(it); 283 m_clients.remove(it);
295 } 284 }
296 } 285 }
297 } 286 }
298 287
299 void Resource::error(Resource::Status status) 288 void Resource::error(Resource::Status status)
300 { 289 {
301 if (m_multipartParser)
302 m_multipartParser->cancel();
303
304 if (!m_revalidatingRequest.isNull()) 290 if (!m_revalidatingRequest.isNull())
305 m_revalidatingRequest = ResourceRequest(); 291 m_revalidatingRequest = ResourceRequest();
306 292
307 if (!m_error.isNull() && (m_error.isCancellation() || !isPreloaded())) 293 if (!m_error.isNull() && (m_error.isCancellation() || !isPreloaded()))
308 memoryCache()->remove(this); 294 memoryCache()->remove(this);
309 295
310 setStatus(status); 296 setStatus(status);
311 ASSERT(errorOccurred()); 297 ASSERT(errorOccurred());
312 m_data.clear(); 298 m_data.clear();
313 299
314 setLoading(false); 300 setLoading(false);
315 checkNotify(); 301 checkNotify();
316 markClientsFinished(); 302 markClientsFinished();
317 } 303 }
318 304
319 void Resource::finishOnePart()
320 {
321 setLoading(false);
322 checkNotify();
323 }
324
325 void Resource::finish() 305 void Resource::finish()
326 { 306 {
327 ASSERT(m_revalidatingRequest.isNull()); 307 ASSERT(m_revalidatingRequest.isNull());
328 ASSERT(!errorOccurred()); 308 setLoading(false);
hiroshige 2016/02/26 19:03:35 What is the reason for removing ASSERT(!errorOccur
yhirano 2016/02/27 02:03:20 It's possible that m_status is modified in ImageRe
329 if (m_multipartParser) 309 checkNotify();
330 m_multipartParser->finish();
331
332 finishOnePart();
333 markClientsFinished(); 310 markClientsFinished();
334 if (!errorOccurred()) 311 if (!errorOccurred())
335 m_status = Cached; 312 m_status = Cached;
336 } 313 }
337 314
338 bool Resource::passesAccessControlCheck(SecurityOrigin* securityOrigin) const 315 bool Resource::passesAccessControlCheck(SecurityOrigin* securityOrigin) const
339 { 316 {
340 String ignoredErrorDescription; 317 String ignoredErrorDescription;
341 return passesAccessControlCheck(securityOrigin, ignoredErrorDescription); 318 return passesAccessControlCheck(securityOrigin, ignoredErrorDescription);
342 } 319 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 { 443 {
467 m_responseTimestamp = currentTime(); 444 m_responseTimestamp = currentTime();
468 445
469 if (!m_revalidatingRequest.isNull()) { 446 if (!m_revalidatingRequest.isNull()) {
470 if (response.httpStatusCode() == 304) { 447 if (response.httpStatusCode() == 304) {
471 revalidationSucceeded(response); 448 revalidationSucceeded(response);
472 return; 449 return;
473 } 450 }
474 revalidationFailed(); 451 revalidationFailed();
475 } 452 }
476 // If there's no boundary, just handle the request normally. In the gecko
477 // code, nsMultiMixedConv::OnStartRequest throws an exception.
478 if (response.isMultipart() && !response.multipartBoundary().isEmpty() && (m_ type == Resource::Image || m_type == Resource::MainResource) && !m_multipartPars er)
479 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
480 setResponse(response); 453 setResponse(response);
481 String encoding = response.textEncodingName(); 454 String encoding = response.textEncodingName();
482 if (!encoding.isNull()) 455 if (!encoding.isNull())
483 setEncoding(encoding); 456 setEncoding(encoding);
484 } 457 }
485 458
486 void Resource::setSerializedCachedMetadata(const char* data, size_t size) 459 void Resource::setSerializedCachedMetadata(const char* data, size_t size)
487 { 460 {
488 // We only expect to receive cached metadata from the platform once. 461 // We only expect to receive cached metadata from the platform once.
489 // If this triggers, it indicates an efficiency problem which is most 462 // If this triggers, it indicates an efficiency problem which is most
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 502
530 WeakPtrWillBeRawPtr<Resource> Resource::asWeakPtr() 503 WeakPtrWillBeRawPtr<Resource> Resource::asWeakPtr()
531 { 504 {
532 #if ENABLE(OILPAN) 505 #if ENABLE(OILPAN)
533 return this; 506 return this;
534 #else 507 #else
535 return m_weakPtrFactory.createWeakPtr(); 508 return m_weakPtrFactory.createWeakPtr();
536 #endif 509 #endif
537 } 510 }
538 511
539 bool Resource::isMultipartImage() const
540 {
541 return m_multipartParser;
542 }
543
544 void Resource::didReceiveResponse(const ResourceResponse& response)
545 {
546 ASSERT(isMultipartImage());
547 responseReceived(response, nullptr);
548 if (response.isMultipartPayload()) {
549 // Since a subresource loader does not load multipart sections progressi vely, data was delivered to the loader all at once.
550 // After the first multipart section is complete, signal to delegates th at this load is "finished"
551 m_loader->fetcher()->subresourceLoaderFinishedLoadingOnePart(m_loader);
552 if (m_loader)
553 m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEnc odedDataLength);
554 }
555 }
556
557 void Resource::didReceiveData(const char* bytes, size_t size)
558 {
559 ASSERT(isMultipartImage());
560 appendDataInternal(bytes, size);
561 }
562
563 String Resource::reasonNotDeletable() const 512 String Resource::reasonNotDeletable() const
564 { 513 {
565 StringBuilder builder; 514 StringBuilder builder;
566 if (hasClients()) { 515 if (hasClients()) {
567 builder.append("hasClients("); 516 builder.append("hasClients(");
568 builder.appendNumber(m_clients.size()); 517 builder.appendNumber(m_clients.size());
569 if (!m_clientsAwaitingCallback.isEmpty()) { 518 if (!m_clientsAwaitingCallback.isEmpty()) {
570 builder.append(", AwaitingCallback="); 519 builder.append(", AwaitingCallback=");
571 builder.appendNumber(m_clientsAwaitingCallback.size()); 520 builder.appendNumber(m_clientsAwaitingCallback.size());
572 } 521 }
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 655
707 void Resource::allClientsRemoved() 656 void Resource::allClientsRemoved()
708 { 657 {
709 if (!m_loader) 658 if (!m_loader)
710 return; 659 return;
711 if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this )) 660 if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this ))
712 cancelTimerFired(&m_cancelTimer); 661 cancelTimerFired(&m_cancelTimer);
713 else if (!m_cancelTimer.isActive()) 662 else if (!m_cancelTimer.isActive())
714 m_cancelTimer.startOneShot(0, BLINK_FROM_HERE); 663 m_cancelTimer.startOneShot(0, BLINK_FROM_HERE);
715 664
716 if (m_multipartParser)
717 m_multipartParser->cancel();
718 unlock(); 665 unlock();
719 } 666 }
720 667
721 void Resource::cancelTimerFired(Timer<Resource>* timer) 668 void Resource::cancelTimerFired(Timer<Resource>* timer)
722 { 669 {
723 ASSERT_UNUSED(timer, timer == &m_cancelTimer); 670 ASSERT_UNUSED(timer, timer == &m_cancelTimer);
724 if (hasClients() || !m_loader) 671 if (hasClients() || !m_loader)
725 return; 672 return;
726 RefPtrWillBeRawPtr<Resource> protect(this); 673 RefPtrWillBeRawPtr<Resource> protect(this);
727 m_loader->cancelIfNotFinishing(); 674 m_loader->cancelIfNotFinishing();
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1157 case Resource::Media: 1104 case Resource::Media:
1158 return "Media"; 1105 return "Media";
1159 case Resource::Manifest: 1106 case Resource::Manifest:
1160 return "Manifest"; 1107 return "Manifest";
1161 } 1108 }
1162 ASSERT_NOT_REACHED(); 1109 ASSERT_NOT_REACHED();
1163 return "Unknown"; 1110 return "Unknown";
1164 } 1111 }
1165 1112
1166 } // namespace blink 1113 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698