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 |