diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp index 598e616f1fa..feb42065501 100644 --- a/chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp +++ b/chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp @@ -24,7 +24,6 @@ #include "config.h" #include "core/fetch/ImageResource.h" -#include "RuntimeEnabledFeatures.h" #include "core/fetch/ImageResourceClient.h" #include "core/fetch/MemoryCache.h" #include "core/fetch/ResourceClient.h" @@ -33,20 +32,20 @@ #include "core/frame/FrameView.h" #include "core/rendering/RenderObject.h" #include "core/svg/graphics/SVGImage.h" +#include "platform/RuntimeEnabledFeatures.h" #include "platform/SharedBuffer.h" +#include "platform/TraceEvent.h" #include "platform/graphics/BitmapImage.h" #include "wtf/CurrentTime.h" #include "wtf/StdLibExtras.h" #include "wtf/Vector.h" -using namespace std; - namespace WebCore { ImageResource::ImageResource(const ResourceRequest& resourceRequest) : Resource(resourceRequest, Image) , m_devicePixelRatioHeaderValue(1.0) - , m_image(0) + , m_image(nullptr) , m_loadingMultipartContent(false) , m_hasDevicePixelRatioHeaderValue(false) { @@ -63,6 +62,15 @@ ImageResource::ImageResource(WebCore::Image* image) setCustomAcceptHeader(); } +ImageResource::ImageResource(const ResourceRequest& resourceRequest, WebCore::Image* image) + : Resource(resourceRequest, Image) + , m_image(image) +{ + setStatus(Cached); + setLoading(false); + setCustomAcceptHeader(); +} + ImageResource::~ImageResource() { clearImage(); @@ -122,6 +130,22 @@ void ImageResource::switchClientsToRevalidatedResource() Resource::switchClientsToRevalidatedResource(); } +bool ImageResource::isSafeToUnlock() const +{ + // Note that |m_image| holds a reference to |m_data| in addition to the one held by the Resource parent class. + return !m_image || (m_image->hasOneRef() && m_data->refCount() == 2); +} + +void ImageResource::destroyDecodedDataIfPossible() +{ + if (!hasClients() && !isLoading() && (!m_image || (m_image->hasOneRef() && m_image->isBitmapImage()))) { + m_image = nullptr; + setDecodedSize(0); + } else if (m_image && !errorOccurred()) { + m_image->destroyDecodedData(true); + } +} + void ImageResource::allClientsRemoved() { m_pendingContainerSizeRequests.clear(); @@ -272,7 +296,7 @@ void ImageResource::notifyObservers(const IntRect* changeRect) void ImageResource::clear() { - destroyDecodedData(); + prune(); clearImage(); m_pendingContainerSizeRequests.clear(); setEncodedSize(0); @@ -346,7 +370,7 @@ void ImageResource::updateImage(bool allDataReceived) if (sizeAvailable || allDataReceived) { if (!m_image || m_image->isNull()) { error(errorOccurred() ? status() : DecodeError); - if (inCache()) + if (memoryCache()->contains(this)) memoryCache()->remove(this); return; } @@ -390,20 +414,6 @@ void ImageResource::responseReceived(const ResourceResponse& response) Resource::responseReceived(response); } -void ImageResource::destroyDecodedData() -{ - bool canDeleteImage = !m_image || (m_image->hasOneRef() && m_image->isBitmapImage()); - if (isSafeToMakePurgeable() && canDeleteImage && !isLoading()) { - // Image refs the data buffer so we should not make it purgeable while the image is alive. - // Invoking addClient() will reconstruct the image object. - m_image = 0; - setDecodedSize(0); - makePurgeable(true); - } else if (m_image && !errorOccurred()) { - m_image->destroyDecodedData(true); - } -} - void ImageResource::decodedSizeChanged(const WebCore::Image* image, int delta) { if (!image || image != m_image) @@ -416,12 +426,7 @@ void ImageResource::didDraw(const WebCore::Image* image) { if (!image || image != m_image) return; - - double timeStamp = FrameView::currentFrameTimeStamp(); - if (!timeStamp) // If didDraw is called outside of a Frame paint. - timeStamp = currentTime(); - - Resource::didAccessDecodedData(timeStamp); + Resource::didAccessDecodedData(); } bool ImageResource::shouldPauseAnimation(const WebCore::Image* image) |