OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/loader/resource/ImageResourceContent.h" | 5 #include "core/loader/resource/ImageResourceContent.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "core/loader/resource/ImageResource.h" | 9 #include "core/loader/resource/ImageResource.h" |
10 #include "core/loader/resource/ImageResourceInfo.h" | 10 #include "core/loader/resource/ImageResourceInfo.h" |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 case ResourceStatus::kCached: | 399 case ResourceStatus::kCached: |
400 case ResourceStatus::kLoadError: | 400 case ResourceStatus::kLoadError: |
401 case ResourceStatus::kDecodeError: | 401 case ResourceStatus::kDecodeError: |
402 // Load start due to revalidation/reload. | 402 // Load start due to revalidation/reload. |
403 break; | 403 break; |
404 } | 404 } |
405 | 405 |
406 content_status_ = ResourceStatus::kPending; | 406 content_status_ = ResourceStatus::kPending; |
407 } | 407 } |
408 | 408 |
| 409 void ImageResourceContent::AsyncLoadCompleted(const blink::Image* image) { |
| 410 if (image_ != image) |
| 411 return; |
| 412 CHECK_EQ(size_available_, Image::kSizeAvailableAndLoadingAsynchronously); |
| 413 size_available_ = Image::kSizeAvailable; |
| 414 UpdateToLoadedContentStatus(ResourceStatus::kCached); |
| 415 NotifyObservers(kShouldNotifyFinish); |
| 416 } |
| 417 |
409 ImageResourceContent::UpdateImageResult ImageResourceContent::UpdateImage( | 418 ImageResourceContent::UpdateImageResult ImageResourceContent::UpdateImage( |
410 PassRefPtr<SharedBuffer> data, | 419 PassRefPtr<SharedBuffer> data, |
411 ResourceStatus status, | 420 ResourceStatus status, |
412 UpdateImageOption update_image_option, | 421 UpdateImageOption update_image_option, |
413 bool all_data_received) { | 422 bool all_data_received) { |
414 TRACE_EVENT0("blink", "ImageResourceContent::updateImage"); | 423 TRACE_EVENT0("blink", "ImageResourceContent::updateImage"); |
415 | 424 |
416 #if DCHECK_IS_ON() | 425 #if DCHECK_IS_ON() |
417 DCHECK(!is_update_image_being_called_); | 426 DCHECK(!is_update_image_being_called_); |
418 AutoReset<bool> scope(&is_update_image_being_called_, true); | 427 AutoReset<bool> scope(&is_update_image_being_called_, true); |
(...skipping 20 matching lines...) Expand all Loading... |
439 case kUpdateImage: | 448 case kUpdateImage: |
440 case kClearAndUpdateImage: | 449 case kClearAndUpdateImage: |
441 // Have the image update its data from its internal buffer. It will not do | 450 // Have the image update its data from its internal buffer. It will not do |
442 // anything now, but will delay decoding until queried for info (like size | 451 // anything now, but will delay decoding until queried for info (like size |
443 // or specific image frames). | 452 // or specific image frames). |
444 if (data) { | 453 if (data) { |
445 if (!image_) | 454 if (!image_) |
446 image_ = CreateImage(); | 455 image_ = CreateImage(); |
447 DCHECK(image_); | 456 DCHECK(image_); |
448 size_available_ = image_->SetData(std::move(data), all_data_received); | 457 size_available_ = image_->SetData(std::move(data), all_data_received); |
| 458 DCHECK(all_data_received || |
| 459 size_available_ != |
| 460 Image::kSizeAvailableAndLoadingAsynchronously); |
449 } | 461 } |
450 | 462 |
451 // Go ahead and tell our observers to try to draw if we have either | 463 // Go ahead and tell our observers to try to draw if we have either |
452 // received all the data or the size is known. Each chunk from the network | 464 // received all the data or the size is known. Each chunk from the network |
453 // causes observers to repaint, which will force that chunk to decode. | 465 // causes observers to repaint, which will force that chunk to decode. |
454 if (size_available_ == Image::kSizeUnavailable && !all_data_received) | 466 if (size_available_ == Image::kSizeUnavailable && !all_data_received) |
455 return UpdateImageResult::kNoDecodeError; | 467 return UpdateImageResult::kNoDecodeError; |
456 | 468 |
457 if (info_->ShouldShowPlaceholder() && all_data_received) { | 469 if (info_->ShouldShowPlaceholder() && all_data_received) { |
458 if (image_ && !image_->IsNull()) { | 470 if (image_ && !image_->IsNull()) { |
459 IntSize dimensions = image_->Size(); | 471 IntSize dimensions = image_->Size(); |
460 ClearImage(); | 472 ClearImage(); |
461 image_ = PlaceholderImage::Create(this, dimensions); | 473 image_ = PlaceholderImage::Create(this, dimensions); |
462 } | 474 } |
463 } | 475 } |
464 | 476 |
465 if (!image_ || image_->IsNull()) { | 477 if (!image_ || image_->IsNull()) { |
466 ClearImage(); | 478 ClearImage(); |
467 return UpdateImageResult::kShouldDecodeError; | 479 return UpdateImageResult::kShouldDecodeError; |
468 } | 480 } |
469 break; | 481 break; |
470 } | 482 } |
471 | 483 |
| 484 DCHECK(all_data_received || |
| 485 size_available_ != Image::kSizeAvailableAndLoadingAsynchronously); |
| 486 |
472 // Notifies the observers. | 487 // Notifies the observers. |
473 // It would be nice to only redraw the decoded band of the image, but with the | 488 // It would be nice to only redraw the decoded band of the image, but with the |
474 // current design (decoding delayed until painting) that seems hard. | 489 // current design (decoding delayed until painting) that seems hard. |
475 | 490 // |
476 if (all_data_received) { | 491 // In the case of kSizeAvailableAndLoadingAsynchronously, we are waiting for |
| 492 // SVG image completion, and thus we notify observers of kDoNotNotifyFinish |
| 493 // here, and will notify observers of finish later in AsyncLoadCompleted(). |
| 494 if (all_data_received && |
| 495 size_available_ != Image::kSizeAvailableAndLoadingAsynchronously) { |
477 UpdateToLoadedContentStatus(status); | 496 UpdateToLoadedContentStatus(status); |
478 NotifyObservers(kShouldNotifyFinish); | 497 NotifyObservers(kShouldNotifyFinish); |
479 } else { | 498 } else { |
480 NotifyObservers(kDoNotNotifyFinish); | 499 NotifyObservers(kDoNotNotifyFinish); |
481 } | 500 } |
482 | 501 |
483 return UpdateImageResult::kNoDecodeError; | 502 return UpdateImageResult::kNoDecodeError; |
484 } | 503 } |
485 | 504 |
486 void ImageResourceContent::DecodedSizeChangedTo(const blink::Image* image, | 505 void ImageResourceContent::DecodedSizeChangedTo(const blink::Image* image, |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 | 621 |
603 const ResourceResponse& ImageResourceContent::GetResponse() const { | 622 const ResourceResponse& ImageResourceContent::GetResponse() const { |
604 return info_->GetResponse(); | 623 return info_->GetResponse(); |
605 } | 624 } |
606 | 625 |
607 const ResourceError& ImageResourceContent::GetResourceError() const { | 626 const ResourceError& ImageResourceContent::GetResourceError() const { |
608 return info_->GetResourceError(); | 627 return info_->GetResourceError(); |
609 } | 628 } |
610 | 629 |
611 } // namespace blink | 630 } // namespace blink |
OLD | NEW |