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

Side by Side Diff: third_party/WebKit/Source/core/fetch/ImageResource.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, 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->addData(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::appendDataInternal(const char* data, size_t length)
297 {
298 Resource::appendDataInternal(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 ASSERT(!handle); 369 ASSERT(!handle);
hiroshige 2016/02/26 19:03:35 Can we add |ASSERT(!m_multipartParser);|? Also, i
yhirano 2016/02/27 02:03:20 Added an assertion for multipartParser. Not sure
356 if (response.isMultipartPayload() && m_data) 370 // If there's no boundary, just handle the request normally. In the gecko
357 finishOnePart(); 371 // code, nsMultiMixedConv::OnStartRequest throws an exception.
372 if (response.isMultipart() && !response.multipartBoundary().isEmpty() && !m_ multipartParser)
373 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
358 Resource::responseReceived(response, handle); 374 Resource::responseReceived(response, handle);
359 if (RuntimeEnabledFeatures::clientHintsEnabled()) { 375 if (RuntimeEnabledFeatures::clientHintsEnabled()) {
360 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);
361 if (!m_hasDevicePixelRatioHeaderValue || m_devicePixelRatioHeaderValue < = 0.0) { 377 if (!m_hasDevicePixelRatioHeaderValue || m_devicePixelRatioHeaderValue < = 0.0) {
362 m_devicePixelRatioHeaderValue = 1.0; 378 m_devicePixelRatioHeaderValue = 1.0;
363 m_hasDevicePixelRatioHeaderValue = false; 379 m_hasDevicePixelRatioHeaderValue = false;
364 } 380 }
365 381
366 } 382 }
367 } 383 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 load(fetcher, fetcher->defaultResourceOptions()); 464 load(fetcher, fetcher->defaultResourceOptions());
449 } 465 }
450 466
451 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect ) 467 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect )
452 { 468 {
453 if (!image || image != m_image) 469 if (!image || image != m_image)
454 return; 470 return;
455 notifyObservers(&rect); 471 notifyObservers(&rect);
456 } 472 }
457 473
474 void ImageResource::didReceiveResponse(const ResourceResponse& response, bool is FirstPart)
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();
484 }
485 if (!isFirstPart) {
486 if (m_loader) {
487 // Since a subresource loader does not load multipart sections progr essively, data was delivered to the loader all at once.
488 // After the first multipart section is complete, signal to delegate s that this load is "finished"
489 m_loader->fetcher()->subresourceLoaderFinishedLoadingOnePart(m_loade r);
490 }
491 if (m_loader)
492 m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEnc odedDataLength);
493 }
494 }
495
496 void ImageResource::didReceiveData(const char* bytes, size_t size)
497 {
498 ASSERT(isMultipartImage());
499 Resource::appendData(bytes, size);
500 }
501
458 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) 502 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
459 { 503 {
460 if (response().wasFetchedViaServiceWorker()) 504 if (response().wasFetchedViaServiceWorker())
461 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 505 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
462 if (!image()->currentFrameHasSingleSecurityOrigin()) 506 if (!image()->currentFrameHasSingleSecurityOrigin())
463 return false; 507 return false;
464 if (passesAccessControlCheck(securityOrigin)) 508 if (passesAccessControlCheck(securityOrigin))
465 return true; 509 return true;
466 return !securityOrigin->taintsCanvas(response().url()); 510 return !securityOrigin->taintsCanvas(response().url());
467 } 511 }
468 512
469 bool ImageResource::loadingMultipartContent() const
470 {
471 return m_loader && isMultipartImage();
472 }
473
474 } // namespace blink 513 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698