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 a252a4e72b0c94a5dae54dee86182b0b529d753e..f9e180809eacaf8f92c6a265d1738e6ff1b1c21c 100644 |
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
@@ -23,10 +23,9 @@ |
#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/ResourceFetcher.h" |
#include "core/fetch/ResourceLoader.h" |
#include "core/svg/graphics/SVGImage.h" |
@@ -111,26 +110,36 @@ void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& |
setLoading(false); |
} |
-void ImageResource::didAddClient(ResourceClient* c) |
+void ImageResource::addObserver(ImageResourceObserver* observer) |
{ |
if (m_data && !m_image && !errorOccurred()) { |
createImage(); |
m_image->setData(m_data, true); |
} |
- ASSERT(c->resourceClientType() == ImageResourceClient::expectedType()); |
if (m_image && !m_image->isNull()) |
- static_cast<ImageResourceClient*>(c)->imageChanged(this); |
- |
- Resource::didAddClient(c); |
+ observer->imageChanged(this); |
+ m_observers.add(observer); |
} |
-void ImageResource::didRemoveClient(ResourceClient* c) |
+void ImageResource::removeObserver(ImageResourceObserver* observer) |
{ |
- ASSERT(c); |
- ASSERT(c->resourceClientType() == ImageResourceClient::expectedType()); |
+ ASSERT(observer); |
+ ASSERT(m_observers.contains(observer)); |
+ m_observers.remove(observer); |
+} |
- Resource::didRemoveClient(c); |
+ResourcePriority ImageResource::priorityFromClients() |
+{ |
+ ResourcePriority priority; |
+ for (const auto& observer : m_observers) { |
+ ResourcePriority nextPriority = observer.key->computeResourcePriority(); |
+ if (nextPriority.visibility == ResourcePriority::NotVisible) |
+ continue; |
+ priority.visibility = ResourcePriority::Visible; |
+ priority.intraPriorityValue += nextPriority.intraPriorityValue; |
+ } |
+ return priority; |
} |
bool ImageResource::isSafeToUnlock() const |
@@ -247,13 +256,12 @@ void ImageResource::computeIntrinsicDimensions(Length& intrinsicWidth, Length& i |
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); |
+ WillBeHeapVector<ImageResourceObserver*> observers(m_observers.size()); |
+ size_t index = 0; |
+ for (const auto& observer : m_observers) |
+ observers[index++] = observer.key; |
+ for (auto observer : observers) |
+ observer->imageChanged(this, changeRect); |
} |
void ImageResource::clear() |
@@ -391,18 +399,10 @@ 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)) |
+ for (const auto& observer : m_observers) { |
+ if (observer.key->willRenderImage()) |
return false; |
} |
- |
return true; |
} |
@@ -419,15 +419,8 @@ 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)) |
+ for (const auto& observer : m_observers) { |
+ if (observer.key->getImageAnimationPolicy(newPolicy)) |
break; |
} |