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

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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 { 294 {
281 if (!m_image) 295 if (!m_image)
282 return; 296 return;
283 297
284 // If our Image has an observer, it's always us so we need to clear the back pointer 298 // If our Image has an observer, it's always us so we need to clear the back pointer
285 // before dropping our reference. 299 // before dropping our reference.
286 m_image->setImageObserver(nullptr); 300 m_image->setImageObserver(nullptr);
287 m_image.clear(); 301 m_image.clear();
288 } 302 }
289 303
290 void ImageResource::appendData(const char* data, size_t length)
291 {
292 Resource::appendData(data, length);
293 if (!loadingMultipartContent())
294 updateImage(false);
295 }
296
297 void ImageResource::updateImage(bool allDataReceived) 304 void ImageResource::updateImage(bool allDataReceived)
298 { 305 {
299 TRACE_EVENT0("blink", "ImageResource::updateImage"); 306 TRACE_EVENT0("blink", "ImageResource::updateImage");
300 307
301 if (m_data) 308 if (m_data)
302 createImage(); 309 createImage();
303 310
304 bool sizeAvailable = false; 311 bool sizeAvailable = false;
305 312
306 // Have the image update its data from its internal buffer. 313 // Have the image update its data from its internal buffer.
(...skipping 13 matching lines...) Expand all
320 memoryCache()->remove(this); 327 memoryCache()->remove(this);
321 return; 328 return;
322 } 329 }
323 330
324 // It would be nice to only redraw the decoded band of the image, but wi th the current design 331 // It would be nice to only redraw the decoded band of the image, but wi th the current design
325 // (decoding delayed until painting) that seems hard. 332 // (decoding delayed until painting) that seems hard.
326 notifyObservers(); 333 notifyObservers();
327 } 334 }
328 } 335 }
329 336
330 void ImageResource::finishOnePart() 337 void ImageResource::finish()
331 { 338 {
332 if (loadingMultipartContent()) 339 if (m_multipartParser) {
333 clear(); 340 m_multipartParser->finish();
334 updateImage(true); 341 if (m_data) {
335 if (loadingMultipartContent()) 342 clearImage();
336 m_data.clear(); 343 updateImage(true);
337 Resource::finishOnePart(); 344 m_data.clear();
345 }
346 } else {
347 updateImage(true);
348 }
349 Resource::finish();
338 } 350 }
339 351
340 void ImageResource::error(Resource::Status status) 352 void ImageResource::error(Resource::Status status)
341 { 353 {
354 if (m_multipartParser)
355 m_multipartParser->cancel();
342 clear(); 356 clear();
343 Resource::error(status); 357 Resource::error(status);
344 notifyObservers(); 358 notifyObservers();
345 } 359 }
346 360
347 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle) 361 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle)
348 { 362 {
349 if (loadingMultipartContent() && m_data) 363 ASSERT(!handle);
350 finishOnePart(); 364 ASSERT(!m_multipartParser);
365 // If there's no boundary, just handle the request normally.
366 if (response.isMultipart() && !response.multipartBoundary().isEmpty())
367 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
351 Resource::responseReceived(response, handle); 368 Resource::responseReceived(response, handle);
352 if (RuntimeEnabledFeatures::clientHintsEnabled()) { 369 if (RuntimeEnabledFeatures::clientHintsEnabled()) {
353 m_devicePixelRatioHeaderValue = m_response.httpHeaderField(HTTPNames::Co ntent_DPR).toFloat(&m_hasDevicePixelRatioHeaderValue); 370 m_devicePixelRatioHeaderValue = m_response.httpHeaderField(HTTPNames::Co ntent_DPR).toFloat(&m_hasDevicePixelRatioHeaderValue);
354 if (!m_hasDevicePixelRatioHeaderValue || m_devicePixelRatioHeaderValue < = 0.0) { 371 if (!m_hasDevicePixelRatioHeaderValue || m_devicePixelRatioHeaderValue < = 0.0) {
355 m_devicePixelRatioHeaderValue = 1.0; 372 m_devicePixelRatioHeaderValue = 1.0;
356 m_hasDevicePixelRatioHeaderValue = false; 373 m_hasDevicePixelRatioHeaderValue = false;
357 } 374 }
358 375
359 } 376 }
360 } 377 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 load(fetcher, fetcher->defaultResourceOptions()); 458 load(fetcher, fetcher->defaultResourceOptions());
442 } 459 }
443 460
444 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect ) 461 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect )
445 { 462 {
446 if (!image || image != m_image) 463 if (!image || image != m_image)
447 return; 464 return;
448 notifyObservers(&rect); 465 notifyObservers(&rect);
449 } 466 }
450 467
468 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response, bool isFirstPart)
469 {
470 ASSERT(m_multipartParser);
471 m_response = response;
472 if (m_data) {
473 clear();
474 updateImage(true);
475 m_data.clear();
476 setLoading(false);
477 checkNotify();
478 }
479 if (!isFirstPart && m_loader)
480 m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncoded DataLength);
481 }
482
483 void ImageResource::multipartDataReceived(const char* bytes, size_t size)
484 {
485 ASSERT(m_multipartParser);
486 Resource::appendData(bytes, size);
487 }
488
451 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) 489 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
452 { 490 {
453 if (response().wasFetchedViaServiceWorker()) 491 if (response().wasFetchedViaServiceWorker())
454 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 492 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
455 if (!image()->currentFrameHasSingleSecurityOrigin()) 493 if (!image()->currentFrameHasSingleSecurityOrigin())
456 return false; 494 return false;
457 if (passesAccessControlCheck(securityOrigin)) 495 if (passesAccessControlCheck(securityOrigin))
458 return true; 496 return true;
459 return !securityOrigin->taintsCanvas(response().url()); 497 return !securityOrigin->taintsCanvas(response().url());
460 } 498 }
461 499
462 bool ImageResource::loadingMultipartContent() const
463 {
464 return m_loader && m_loader->loadingMultipartContent();
465 }
466
467 } // namespace blink 500 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ImageResource.h ('k') | third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698