| 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;
|
| }
|
|
|
|
|