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

Side by Side Diff: third_party/WebKit/Source/core/loader/resource/ImageResourceContent.cpp

Issue 2527353002: Phase II Step 3: Reload LoFi/placeholder images via new ImageResource
Patch Set: reloadLoFiImages test Created 4 years 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 // 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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698