Chromium Code Reviews| 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 caaac704bf2695a5c38c3c53dec4c1098c0ea789..2ce3c513e34f1eac0ca5b4aed97f58a03c0df13e 100644 |
| --- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
| +++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
| @@ -23,7 +23,7 @@ |
| #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" |
| @@ -41,6 +41,12 @@ |
| namespace blink { |
| +namespace { |
|
yhirano
2016/03/17 04:44:57
Is this unnamed namespace necessary? My (rough) un
hiroshige
2016/03/23 18:47:25
Done.
|
| + |
| +using ImageResourceObserverWalker = ResourceClientOrObserverWalker<ImageResourceObserver, ImageResourceObserver>; |
| + |
| +} // namespace |
| + |
| PassRefPtrWillBeRawPtr<ImageResource> ImageResource::fetch(FetchRequest& request, ResourceFetcher* fetcher) |
| { |
| if (request.resourceRequest().requestContext() == WebURLRequest::RequestContextUnspecified) |
| @@ -113,26 +119,44 @@ void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& |
| setLoading(false); |
| } |
| -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 |
| @@ -149,7 +173,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()) { |
| @@ -157,13 +181,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) |
| @@ -255,13 +279,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() |
| @@ -402,18 +423,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; |
| } |
| @@ -430,15 +444,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; |
| } |