diff options
author | hiroshige <hiroshige@chromium.org> | 2016-03-25 17:50:09 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-26 00:52:02 +0000 |
commit | a4581858f57e20724f9b8a3166ef9c864f79a758 (patch) | |
tree | e4cd0359bc77080c16949c5f287f939906bb0aff /third_party/WebKit/Source/core/fetch/ImageResource.cpp | |
parent | a36877470caa77972faf9a1313eba92d8cd67fde (diff) | |
download | chromium_src-a4581858f57e20724f9b8a3166ef9c864f79a758.zip chromium_src-a4581858f57e20724f9b8a3166ef9c864f79a758.tar.gz chromium_src-a4581858f57e20724f9b8a3166ef9c864f79a758.tar.bz2 |
Split ImageResourceClient into ResourceClient and ImageResourceObserver [1/2]
We are planning to move ResourceClient to on-heap, but LayoutObject (an
ImageResourceClient subclass) is hard to move to on-heap.
This series of CLs splits ImageResourceClient into
- ResourceClient (notified via Resource, to be moved to Oilpan heap) and
- ImageResourceObserver (notified via ImageObserver, to remain non-heap)
and makes LayoutObject to be ImageResourceObserver but not ResourceClient.
This is the [1/2] CL that
- Splits ImageResourceClient into ResourceClient and ImageResourceObserver,
- Makes LayoutObject and all of its subclasses (except for LayoutImage and its
subclasses) to be ImageResourceObserver but not ResourceClient.
LayoutImage will be made non-ResourceClient by the [2/2] CL:
https://codereview.chromium.org/1728313003/.
Original CL: https://codereview.chromium.org/1697713002/ by Nate Chapin.
In addition to Nate's original CL (Patch Set 1), this CL:
- Fixes layout test (Patch Set 2).
- Reuses ResourceClientWalker to iterate ImageResourceObserver (Patch Set 3).
- Handles ResourceClient and ImageResourceObserver more similarly (Patch Set 4).
- Renames methods to reflect whether they are for both ResourceClient and
ImageResourceObserver (Patch Set 6).
BUG=587663
Review URL: https://codereview.chromium.org/1706083002
Cr-Commit-Position: refs/heads/master@{#383425}
Diffstat (limited to 'third_party/WebKit/Source/core/fetch/ImageResource.cpp')
-rw-r--r-- | third_party/WebKit/Source/core/fetch/ImageResource.cpp | 84 |
1 files changed, 44 insertions, 40 deletions
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp index bb21c47..60911b1 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; } |