Index: third_party/WebKit/Source/core/fetch/ImageResource.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
index bb21c47a46b25142d2a76d85003438915d7c7199..60911b1f3754250c5f909d0eecefc17967088aad 100644 |
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
@@ -23,10 +23,10 @@ |
#include "core/fetch/ImageResource.h" |
-#include "core/fetch/ImageResourceClient.h" |
+#include "core/fetch/ImageResourceObserver.h" |
#include "core/fetch/MemoryCache.h" |
#include "core/fetch/ResourceClient.h" |
-#include "core/fetch/ResourceClientWalker.h" |
+#include "core/fetch/ResourceClientOrObserverWalker.h" |
#include "core/fetch/ResourceFetcher.h" |
#include "core/fetch/ResourceLoader.h" |
#include "core/svg/graphics/SVGImage.h" |
@@ -41,6 +41,8 @@ |
namespace blink { |
+using ImageResourceObserverWalker = ResourceClientOrObserverWalker<ImageResourceObserver, ImageResourceObserver>; |
+ |
PassRefPtrWillBeRawPtr<ImageResource> ImageResource::fetch(FetchRequest& request, ResourceFetcher* fetcher) |
{ |
if (request.resourceRequest().requestContext() == WebURLRequest::RequestContextUnspecified) |
@@ -99,26 +101,44 @@ DEFINE_TRACE(ImageResource) |
MultipartImageResourceParser::Client::trace(visitor); |
} |
-void ImageResource::didAddClient(ResourceClient* c) |
+void ImageResource::addObserver(ImageResourceObserver* observer) |
{ |
+ willAddClientOrObserver(); |
+ |
+ m_observers.add(observer); |
+ |
+ if (!m_revalidatingRequest.isNull()) |
+ return; |
+ |
if (m_data && !m_image && !errorOccurred()) { |
createImage(); |
m_image->setData(m_data, true); |
} |
- ASSERT(ImageResourceClient::isExpectedType(c)); |
if (m_image && !m_image->isNull()) |
- static_cast<ImageResourceClient*>(c)->imageChanged(this); |
- |
- Resource::didAddClient(c); |
+ observer->imageChanged(this); |
} |
-void ImageResource::didRemoveClient(ResourceClient* c) |
+void ImageResource::removeObserver(ImageResourceObserver* observer) |
{ |
- ASSERT(c); |
- ASSERT(ImageResourceClient::isExpectedType(c)); |
+ ASSERT(observer); |
+ ASSERT(m_observers.contains(observer)); |
+ m_observers.remove(observer); |
+ didRemoveClientOrObserver(); |
+} |
- Resource::didRemoveClient(c); |
+ResourcePriority ImageResource::priorityFromObservers() |
+{ |
+ ResourcePriority priority; |
+ ImageResourceObserverWalker w(m_observers); |
+ while (const auto* observer = w.next()) { |
+ ResourcePriority nextPriority = observer->computeResourcePriority(); |
+ if (nextPriority.visibility == ResourcePriority::NotVisible) |
+ continue; |
+ priority.visibility = ResourcePriority::Visible; |
+ priority.intraPriorityValue += nextPriority.intraPriorityValue; |
+ } |
+ return priority; |
} |
bool ImageResource::isSafeToUnlock() const |
@@ -135,7 +155,7 @@ void ImageResource::destroyDecodedDataForFailedRevalidation() |
void ImageResource::destroyDecodedDataIfPossible() |
{ |
- if (!hasClients() && !isLoading() && (!m_image || (m_image->hasOneRef() && m_image->isBitmapImage()))) { |
+ if (!hasClientsOrObservers() && !isLoading() && (!m_image || (m_image->hasOneRef() && m_image->isBitmapImage()))) { |
m_image = nullptr; |
setDecodedSize(0); |
} else if (m_image && !errorOccurred()) { |
@@ -143,13 +163,13 @@ void ImageResource::destroyDecodedDataIfPossible() |
} |
} |
-void ImageResource::allClientsRemoved() |
+void ImageResource::allClientsAndObserversRemoved() |
{ |
if (m_image && !errorOccurred()) |
m_image->resetAnimation(); |
if (m_multipartParser) |
m_multipartParser->cancel(); |
- Resource::allClientsRemoved(); |
+ Resource::allClientsAndObserversRemoved(); |
} |
void ImageResource::appendData(const char* data, size_t length) |
@@ -241,13 +261,10 @@ LayoutSize ImageResource::imageSize(RespectImageOrientationEnum shouldRespectIma |
void ImageResource::notifyObservers(const IntRect* changeRect) |
{ |
- ResourceClientWalker<ImageResourceClient> w(m_clients); |
- while (ImageResourceClient* c = w.next()) |
- c->imageChanged(this, changeRect); |
- |
- ResourceClientWalker<ImageResourceClient> w2(m_finishedClients); |
- while (ImageResourceClient* c = w2.next()) |
- c->imageChanged(this, changeRect); |
+ ImageResourceObserverWalker w(m_observers); |
+ while (auto* observer = w.next()) { |
+ observer->imageChanged(this, changeRect); |
+ } |
} |
void ImageResource::clear() |
@@ -388,18 +405,11 @@ bool ImageResource::shouldPauseAnimation(const blink::Image* image) |
if (!image || image != m_image) |
return false; |
- ResourceClientWalker<ImageResourceClient> w(m_clients); |
- while (ImageResourceClient* c = w.next()) { |
- if (c->willRenderImage(this)) |
- return false; |
- } |
- |
- ResourceClientWalker<ImageResourceClient> w2(m_finishedClients); |
- while (ImageResourceClient* c = w2.next()) { |
- if (c->willRenderImage(this)) |
+ ImageResourceObserverWalker w(m_observers); |
+ while (auto* observer = w.next()) { |
+ if (observer->willRenderImage()) |
return false; |
} |
- |
return true; |
} |
@@ -416,15 +426,9 @@ void ImageResource::updateImageAnimationPolicy() |
return; |
ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed; |
- ResourceClientWalker<ImageResourceClient> w(m_clients); |
- while (ImageResourceClient* c = w.next()) { |
- if (c->getImageAnimationPolicy(this, newPolicy)) |
- break; |
- } |
- |
- ResourceClientWalker<ImageResourceClient> w2(m_finishedClients); |
- while (ImageResourceClient* c = w2.next()) { |
- if (c->getImageAnimationPolicy(this, newPolicy)) |
+ ImageResourceObserverWalker w(m_observers); |
+ while (auto* observer = w.next()) { |
+ if (observer->getImageAnimationPolicy(newPolicy)) |
break; |
} |