Chromium Code Reviews| 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 "core/loader/resource/ImageResource.h" | 7 #include "core/loader/resource/ImageResource.h" |
| 8 #include "core/loader/resource/ImageResourceInfo.h" | 8 #include "core/loader/resource/ImageResourceInfo.h" |
| 9 #include "core/loader/resource/ImageResourceObserver.h" | 9 #include "core/loader/resource/ImageResourceObserver.h" |
| 10 #include "core/svg/graphics/SVGImage.h" | 10 #include "core/svg/graphics/SVGImage.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 public ImageResourceInfo { | 27 public ImageResourceInfo { |
| 28 USING_GARBAGE_COLLECTED_MIXIN(NullImageResourceInfo); | 28 USING_GARBAGE_COLLECTED_MIXIN(NullImageResourceInfo); |
| 29 | 29 |
| 30 public: | 30 public: |
| 31 NullImageResourceInfo() {} | 31 NullImageResourceInfo() {} |
| 32 | 32 |
| 33 DEFINE_INLINE_VIRTUAL_TRACE() { ImageResourceInfo::trace(visitor); } | 33 DEFINE_INLINE_VIRTUAL_TRACE() { ImageResourceInfo::trace(visitor); } |
| 34 | 34 |
| 35 private: | 35 private: |
| 36 const KURL& url() const override { return m_url; } | 36 const KURL& url() const override { return m_url; } |
| 37 bool isSchedulingReload() const override { return false; } | |
| 38 bool hasDevicePixelRatioHeaderValue() const override { return false; } | 37 bool hasDevicePixelRatioHeaderValue() const override { return false; } |
| 39 float devicePixelRatioHeaderValue() const override { return 1.0; } | 38 float devicePixelRatioHeaderValue() const override { return 1.0; } |
| 40 const ResourceResponse& response() const override { return m_response; } | 39 const ResourceResponse& response() const override { return m_response; } |
| 41 ResourceStatus getStatus() const override { return ResourceStatus::Cached; } | 40 ResourceStatus getStatus() const override { return ResourceStatus::Cached; } |
| 42 bool isPlaceholder() const override { return false; } | 41 bool isPlaceholder() const override { return false; } |
| 43 bool isCacheValidator() const override { return false; } | 42 bool isCacheValidator() const override { return false; } |
| 44 bool schedulingReloadOrShouldReloadBrokenPlaceholder() const override { | |
| 45 return false; | |
| 46 } | |
| 47 bool isAccessAllowed( | 43 bool isAccessAllowed( |
| 48 SecurityOrigin*, | 44 SecurityOrigin*, |
| 49 DoesCurrentFrameHaveSingleSecurityOrigin) const override { | 45 DoesCurrentFrameHaveSingleSecurityOrigin) const override { |
| 50 return true; | 46 return true; |
| 51 } | 47 } |
| 52 bool hasCacheControlNoStoreHeader() const override { return false; } | 48 bool hasCacheControlNoStoreHeader() const override { return false; } |
| 53 const ResourceError& resourceError() const override { return m_error; } | 49 const ResourceError& resourceError() const override { return m_error; } |
| 50 const ImageResource* resourceForTest() const override { return nullptr; } | |
| 54 | 51 |
| 55 void decodeError(bool allDataReceived) override {} | 52 void decodeError(bool allDataReceived) override {} |
| 53 bool reloadIfLoFiOrPlaceholderIfNeeded( | |
| 54 ResourceFetcher* fetcherForReload) override { | |
| 55 return false; | |
| 56 } | |
| 56 void setDecodedSize(size_t) override {} | 57 void setDecodedSize(size_t) override {} |
| 57 void willAddClientOrObserver() override {} | 58 void willAddClientOrObserver() override {} |
| 58 void didRemoveClientOrObserver() override {} | 59 void didRemoveClientOrObserver() override {} |
| 59 void emulateLoadStartedForInspector( | 60 void emulateLoadStartedForInspector( |
| 60 ResourceFetcher*, | 61 ResourceFetcher*, |
| 61 const KURL&, | 62 const KURL&, |
| 62 const AtomicString& initiatorName) override {} | 63 const AtomicString& initiatorName) override {} |
| 63 | 64 |
| 64 const KURL m_url; | 65 const KURL m_url; |
| 65 const ResourceResponse m_response; | 66 const ResourceResponse m_response; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 108 | 109 |
| 109 m_observers.add(observer); | 110 m_observers.add(observer); |
| 110 | 111 |
| 111 if (m_info->isCacheValidator()) | 112 if (m_info->isCacheValidator()) |
| 112 return; | 113 return; |
| 113 | 114 |
| 114 if (m_image && !m_image->isNull()) { | 115 if (m_image && !m_image->isNull()) { |
| 115 observer->imageChanged(this); | 116 observer->imageChanged(this); |
| 116 } | 117 } |
| 117 | 118 |
| 118 if (isLoaded() && m_observers.contains(observer) && | 119 if (isLoaded() && m_observers.contains(observer)) { |
| 119 !m_info->schedulingReloadOrShouldReloadBrokenPlaceholder()) { | |
| 120 markObserverFinished(observer); | 120 markObserverFinished(observer); |
| 121 observer->imageNotifyFinished(this); | 121 observer->imageNotifyFinished(this); |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 | 124 |
| 125 void ImageResourceContent::removeObserver(ImageResourceObserver* observer) { | 125 void ImageResourceContent::removeObserver(ImageResourceObserver* observer) { |
| 126 DCHECK(observer); | 126 DCHECK(observer); |
| 127 | 127 |
| 128 auto it = m_observers.find(observer); | 128 auto it = m_observers.find(observer); |
| 129 if (it != m_observers.end()) { | 129 if (it != m_observers.end()) { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 NotifyFinishOption notifyingFinishOption, | 262 NotifyFinishOption notifyingFinishOption, |
| 263 const IntRect* changeRect) { | 263 const IntRect* changeRect) { |
| 264 for (auto* observer : m_finishedObservers.asVector()) { | 264 for (auto* observer : m_finishedObservers.asVector()) { |
| 265 if (m_finishedObservers.contains(observer)) | 265 if (m_finishedObservers.contains(observer)) |
| 266 observer->imageChanged(this, changeRect); | 266 observer->imageChanged(this, changeRect); |
| 267 } | 267 } |
| 268 for (auto* observer : m_observers.asVector()) { | 268 for (auto* observer : m_observers.asVector()) { |
| 269 if (m_observers.contains(observer)) { | 269 if (m_observers.contains(observer)) { |
| 270 observer->imageChanged(this, changeRect); | 270 observer->imageChanged(this, changeRect); |
| 271 if (notifyingFinishOption == ShouldNotifyFinish && | 271 if (notifyingFinishOption == ShouldNotifyFinish && |
| 272 m_observers.contains(observer) && | 272 m_observers.contains(observer)) { |
| 273 !m_info->schedulingReloadOrShouldReloadBrokenPlaceholder()) { | |
| 274 markObserverFinished(observer); | 273 markObserverFinished(observer); |
| 275 observer->imageNotifyFinished(this); | 274 observer->imageNotifyFinished(this); |
| 276 } | 275 } |
| 277 } | 276 } |
| 278 } | 277 } |
| 279 } | 278 } |
| 280 | 279 |
| 281 PassRefPtr<Image> ImageResourceContent::createImage() { | 280 PassRefPtr<Image> ImageResourceContent::createImage() { |
| 282 if (m_info->response().mimeType() == "image/svg+xml") | 281 if (m_info->response().mimeType() == "image/svg+xml") |
| 283 return SVGImage::create(this); | 282 return SVGImage::create(this); |
| 284 return BitmapImage::create(this); | 283 return BitmapImage::create(this); |
| 285 } | 284 } |
| 286 | 285 |
| 287 void ImageResourceContent::clearImage() { | 286 void ImageResourceContent::clearImage() { |
| 288 if (!m_image) | 287 if (!m_image) |
| 289 return; | 288 return; |
| 290 int64_t length = m_image->data() ? m_image->data()->size() : 0; | 289 int64_t length = m_image->data() ? m_image->data()->size() : 0; |
| 291 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-length); | 290 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-length); |
| 292 | 291 |
| 293 // If our Image has an observer, it's always us so we need to clear the back | 292 // If our Image has an observer, it's always us so we need to clear the back |
| 294 // pointer before dropping our reference. | 293 // pointer before dropping our reference. |
| 295 m_image->clearImageObserver(); | 294 m_image->clearImageObserver(); |
| 296 m_image.clear(); | 295 m_image.clear(); |
| 297 m_sizeAvailable = Image::SizeUnavailable; | 296 m_sizeAvailable = Image::SizeUnavailable; |
| 298 } | 297 } |
| 299 | 298 |
| 300 void ImageResourceContent::updateImage(PassRefPtr<SharedBuffer> data, | 299 void ImageResourceContent::updateImage(PassRefPtr<SharedBuffer> data, |
| 301 UpdateImageOption updateImageOption, | 300 UpdateImageOption updateImageOption, |
| 302 bool allDataReceived) { | 301 bool allDataReceived, |
| 302 ResourceFetcher* fetcherForReload) { | |
| 303 TRACE_EVENT0("blink", "ImageResourceContent::updateImage"); | 303 TRACE_EVENT0("blink", "ImageResourceContent::updateImage"); |
| 304 | 304 |
| 305 // Clears the existing image, if instructed by |updateImageOption|. | 305 // Clears the existing image, if instructed by |updateImageOption|. |
| 306 switch (updateImageOption) { | 306 switch (updateImageOption) { |
| 307 case ClearAndUpdateImage: | 307 case ClearAndUpdateImage: |
| 308 case ClearImageOnly: | 308 case ClearImageOnly: |
| 309 clearImage(); | 309 clearImage(); |
| 310 break; | 310 break; |
| 311 case UpdateImage: | 311 case UpdateImage: |
| 312 break; | 312 break; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 352 clearImage(); | 352 clearImage(); |
| 353 } | 353 } |
| 354 } | 354 } |
| 355 if (!m_image || m_image->isNull()) { | 355 if (!m_image || m_image->isNull()) { |
| 356 clearImage(); | 356 clearImage(); |
| 357 m_info->decodeError(allDataReceived); | 357 m_info->decodeError(allDataReceived); |
| 358 } | 358 } |
| 359 break; | 359 break; |
| 360 } | 360 } |
| 361 | 361 |
| 362 if (m_info->reloadIfLoFiOrPlaceholderIfNeeded(fetcherForReload)) | |
|
Nate Chapin
2016/12/28 00:14:57
Is it critical that this happen before notifyObser
hiroshige
2017/01/25 02:01:49
This is to keep the current behavior of "ImageReso
| |
| 363 return; | |
| 364 | |
| 362 // Notifies the observers. | 365 // Notifies the observers. |
| 363 // It would be nice to only redraw the decoded band of the image, but with the | 366 // It would be nice to only redraw the decoded band of the image, but with the |
| 364 // current design (decoding delayed until painting) that seems hard. | 367 // current design (decoding delayed until painting) that seems hard. |
| 365 notifyObservers(allDataReceived ? ShouldNotifyFinish : DoNotNotifyFinish); | 368 notifyObservers(allDataReceived ? ShouldNotifyFinish : DoNotNotifyFinish); |
| 366 } | 369 } |
| 367 | 370 |
| 368 void ImageResourceContent::decodedSizeChangedTo(const blink::Image* image, | 371 void ImageResourceContent::decodedSizeChangedTo(const blink::Image* image, |
| 369 size_t newSize) { | 372 size_t newSize) { |
| 370 if (!image || image != m_image) | 373 if (!image || image != m_image) |
| 371 return; | 374 return; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 476 return m_info->hasDevicePixelRatioHeaderValue(); | 479 return m_info->hasDevicePixelRatioHeaderValue(); |
| 477 } | 480 } |
| 478 | 481 |
| 479 const ResourceResponse& ImageResourceContent::response() const { | 482 const ResourceResponse& ImageResourceContent::response() const { |
| 480 return m_info->response(); | 483 return m_info->response(); |
| 481 } | 484 } |
| 482 | 485 |
| 483 const ResourceError& ImageResourceContent::resourceError() const { | 486 const ResourceError& ImageResourceContent::resourceError() const { |
| 484 return m_info->resourceError(); | 487 return m_info->resourceError(); |
| 485 } | 488 } |
| 489 const ImageResource* ImageResourceContent::resourceForTest() const { | |
| 490 return m_info->resourceForTest(); | |
| 491 } | |
| 486 | 492 |
| 487 } // namespace blink | 493 } // namespace blink |
| OLD | NEW |