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

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

Issue 1710733002: Move multipart resource handling to core/fetch (2/2) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@multipart-cleanup
Patch Set: Created 4 years, 9 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 Apple Inc. All rights reserved. 6 Copyright (C) 2004, 2005, 2006, 2007 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 } 92 }
93 93
94 ImageResource::~ImageResource() 94 ImageResource::~ImageResource()
95 { 95 {
96 WTF_LOG(Timers, "~ImageResource %p", this); 96 WTF_LOG(Timers, "~ImageResource %p", this);
97 clearImage(); 97 clearImage();
98 } 98 }
99 99
100 DEFINE_TRACE(ImageResource) 100 DEFINE_TRACE(ImageResource)
101 { 101 {
102 visitor->trace(m_multipartParser);
102 Resource::trace(visitor); 103 Resource::trace(visitor);
103 ImageObserver::trace(visitor); 104 ImageObserver::trace(visitor);
105 MultipartImageResourceParser::Client::trace(visitor);
104 } 106 }
105 107
106 void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options) 108 void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options)
107 { 109 {
108 if (!fetcher || fetcher->autoLoadImages()) 110 if (!fetcher || fetcher->autoLoadImages())
109 Resource::load(fetcher, options); 111 Resource::load(fetcher, options);
110 else 112 else
111 setLoading(false); 113 setLoading(false);
112 } 114 }
113 115
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 setDecodedSize(0); 154 setDecodedSize(0);
153 } else if (m_image && !errorOccurred()) { 155 } else if (m_image && !errorOccurred()) {
154 m_image->destroyDecodedData(true); 156 m_image->destroyDecodedData(true);
155 } 157 }
156 } 158 }
157 159
158 void ImageResource::allClientsRemoved() 160 void ImageResource::allClientsRemoved()
159 { 161 {
160 if (m_image && !errorOccurred()) 162 if (m_image && !errorOccurred())
161 m_image->resetAnimation(); 163 m_image->resetAnimation();
164 if (m_multipartParser)
165 m_multipartParser->cancel();
162 Resource::allClientsRemoved(); 166 Resource::allClientsRemoved();
163 } 167 }
164 168
169 void ImageResource::appendData(const char* data, size_t length)
170 {
171 if (m_multipartParser) {
172 m_multipartParser->appendData(data, length);
173 } else {
174 Resource::appendData(data, length);
175 updateImage(false);
176 }
177 }
178
165 std::pair<blink::Image*, float> ImageResource::brokenImage(float deviceScaleFact or) 179 std::pair<blink::Image*, float> ImageResource::brokenImage(float deviceScaleFact or)
166 { 180 {
167 if (deviceScaleFactor >= 2) { 181 if (deviceScaleFactor >= 2) {
168 DEFINE_STATIC_REF(blink::Image, brokenImageHiRes, (blink::Image::loadPla tformResource("missingImage@2x"))); 182 DEFINE_STATIC_REF(blink::Image, brokenImageHiRes, (blink::Image::loadPla tformResource("missingImage@2x")));
169 return std::make_pair(brokenImageHiRes, 2); 183 return std::make_pair(brokenImageHiRes, 2);
170 } 184 }
171 185
172 DEFINE_STATIC_REF(blink::Image, brokenImageLoRes, (blink::Image::loadPlatfor mResource("missingImage"))); 186 DEFINE_STATIC_REF(blink::Image, brokenImageLoRes, (blink::Image::loadPlatfor mResource("missingImage")));
173 return std::make_pair(brokenImageLoRes, 1); 187 return std::make_pair(brokenImageLoRes, 1);
174 } 188 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 { 300 {
287 if (!m_image) 301 if (!m_image)
288 return; 302 return;
289 303
290 // If our Image has an observer, it's always us so we need to clear the back pointer 304 // If our Image has an observer, it's always us so we need to clear the back pointer
291 // before dropping our reference. 305 // before dropping our reference.
292 m_image->setImageObserver(nullptr); 306 m_image->setImageObserver(nullptr);
293 m_image.clear(); 307 m_image.clear();
294 } 308 }
295 309
296 void ImageResource::appendData(const char* data, size_t length)
297 {
298 Resource::appendData(data, length);
299 if (!loadingMultipartContent())
300 updateImage(false);
301 }
302
303 void ImageResource::updateImage(bool allDataReceived) 310 void ImageResource::updateImage(bool allDataReceived)
304 { 311 {
305 TRACE_EVENT0("blink", "ImageResource::updateImage"); 312 TRACE_EVENT0("blink", "ImageResource::updateImage");
306 313
307 if (m_data) 314 if (m_data)
308 createImage(); 315 createImage();
309 316
310 bool sizeAvailable = false; 317 bool sizeAvailable = false;
311 318
312 // Have the image update its data from its internal buffer. 319 // Have the image update its data from its internal buffer.
(...skipping 13 matching lines...) Expand all
326 memoryCache()->remove(this); 333 memoryCache()->remove(this);
327 return; 334 return;
328 } 335 }
329 336
330 // It would be nice to only redraw the decoded band of the image, but wi th the current design 337 // It would be nice to only redraw the decoded band of the image, but wi th the current design
331 // (decoding delayed until painting) that seems hard. 338 // (decoding delayed until painting) that seems hard.
332 notifyObservers(); 339 notifyObservers();
333 } 340 }
334 } 341 }
335 342
336 void ImageResource::finishOnePart() 343 void ImageResource::finish()
337 { 344 {
338 if (loadingMultipartContent()) 345 if (m_multipartParser) {
339 clear(); 346 m_multipartParser->finish();
340 updateImage(true); 347 if (m_data) {
341 if (loadingMultipartContent()) 348 clearImage();
342 m_data.clear(); 349 updateImage(true);
343 Resource::finishOnePart(); 350 m_data.clear();
351 }
352 } else {
353 updateImage(true);
354 }
355 Resource::finish();
344 } 356 }
345 357
346 void ImageResource::error(Resource::Status status) 358 void ImageResource::error(Resource::Status status)
347 { 359 {
360 if (m_multipartParser)
361 m_multipartParser->cancel();
348 clear(); 362 clear();
349 Resource::error(status); 363 Resource::error(status);
350 notifyObservers(); 364 notifyObservers();
351 } 365 }
352 366
353 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle) 367 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle)
354 { 368 {
355 if (loadingMultipartContent() && m_data) 369 ASSERT(!handle);
356 finishOnePart(); 370 ASSERT(!m_multipartParser);
371 // If there's no boundary, just handle the request normally.
372 if (response.isMultipart() && !response.multipartBoundary().isEmpty())
373 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
357 Resource::responseReceived(response, handle); 374 Resource::responseReceived(response, handle);
358 if (RuntimeEnabledFeatures::clientHintsEnabled()) { 375 if (RuntimeEnabledFeatures::clientHintsEnabled()) {
359 m_devicePixelRatioHeaderValue = m_response.httpHeaderField(HTTPNames::Co ntent_DPR).toFloat(&m_hasDevicePixelRatioHeaderValue); 376 m_devicePixelRatioHeaderValue = m_response.httpHeaderField(HTTPNames::Co ntent_DPR).toFloat(&m_hasDevicePixelRatioHeaderValue);
360 if (!m_hasDevicePixelRatioHeaderValue || m_devicePixelRatioHeaderValue < = 0.0) { 377 if (!m_hasDevicePixelRatioHeaderValue || m_devicePixelRatioHeaderValue < = 0.0) {
361 m_devicePixelRatioHeaderValue = 1.0; 378 m_devicePixelRatioHeaderValue = 1.0;
362 m_hasDevicePixelRatioHeaderValue = false; 379 m_hasDevicePixelRatioHeaderValue = false;
363 } 380 }
364 381
365 } 382 }
366 } 383 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 load(fetcher, fetcher->defaultResourceOptions()); 464 load(fetcher, fetcher->defaultResourceOptions());
448 } 465 }
449 466
450 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect ) 467 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect )
451 { 468 {
452 if (!image || image != m_image) 469 if (!image || image != m_image)
453 return; 470 return;
454 notifyObservers(&rect); 471 notifyObservers(&rect);
455 } 472 }
456 473
474 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response, bool isFirstPart)
475 {
476 ASSERT(isMultipartImage());
477 m_response = response;
478 if (m_data) {
479 clear();
480 updateImage(true);
481 m_data.clear();
482 setLoading(false);
483 checkNotify();
Nate Chapin 2016/03/01 19:02:15 I think this triggers multiple calls of ResourceCl
yhirano 2016/03/01 19:43:23 Yes, and it's what the existing code is doing. Are
Nate Chapin 2016/03/01 19:56:45 Oops. Didn't know the existing code did that :( T
484 }
485 if (!isFirstPart && m_loader)
486 m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncoded DataLength);
487 }
488
489 void ImageResource::multipartDataReceived(const char* bytes, size_t size)
490 {
491 ASSERT(isMultipartImage());
492 Resource::appendData(bytes, size);
493 }
494
457 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) 495 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
458 { 496 {
459 if (response().wasFetchedViaServiceWorker()) 497 if (response().wasFetchedViaServiceWorker())
460 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 498 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
461 if (!image()->currentFrameHasSingleSecurityOrigin()) 499 if (!image()->currentFrameHasSingleSecurityOrigin())
462 return false; 500 return false;
463 if (passesAccessControlCheck(securityOrigin)) 501 if (passesAccessControlCheck(securityOrigin))
464 return true; 502 return true;
465 return !securityOrigin->taintsCanvas(response().url()); 503 return !securityOrigin->taintsCanvas(response().url());
466 } 504 }
467 505
468 bool ImageResource::loadingMultipartContent() const
469 {
470 return m_loader && m_loader->loadingMultipartContent();
471 }
472
473 } // namespace blink 506 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698