Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2887)

Unified Diff: third_party/WebKit/Source/core/fetch/ImageResource.cpp

Issue 2054643003: Remove duplication of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: (rebase) Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 908f97b764d68bf23455e2b879925283acc1ec1b..c08e465ee78fe5722792924a619f9acb8341854e 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -115,17 +115,9 @@ void ImageResource::markClientsAndObserversFinished()
Resource::markClientsAndObserversFinished();
}
-void ImageResource::ensureImage()
-{
- if (m_data && !m_image && !errorOccurred()) {
- createImage();
- m_image->setData(m_data, true);
- }
-}
-
void ImageResource::didAddClient(ResourceClient* client)
{
- ensureImage();
+ DCHECK(!m_data || m_image);
Resource::didAddClient(client);
}
@@ -138,7 +130,7 @@ void ImageResource::addObserver(ImageResourceObserver* observer)
if (isCacheValidator())
return;
- ensureImage();
+ DCHECK(!m_data || m_image);
if (m_image && !m_image->isNull()) {
observer->imageChanged(this);
@@ -207,12 +199,10 @@ void ImageResource::destroyDecodedDataForFailedRevalidation()
void ImageResource::destroyDecodedDataIfPossible()
{
- if (!hasClientsOrObservers() && !isLoading() && (!m_image || (m_image->hasOneRef() && m_image->isBitmapImage()))) {
- clearImage();
- setDecodedSize(0);
- } else if (m_image && !errorOccurred()) {
+ if (!m_image)
+ return;
+ if ((!hasClientsOrObservers() && !isLoading() && m_image->hasOneRef() && m_image->isBitmapImage()) || !errorOccurred())
m_image->destroyDecodedData();
- }
}
void ImageResource::doResetAnimation()
@@ -237,6 +227,15 @@ void ImageResource::allClientsAndObserversRemoved()
Resource::allClientsAndObserversRemoved();
}
+PassRefPtr<SharedBuffer> ImageResource::resourceBuffer() const
+{
+ if (m_data)
+ return m_data.get();
+ if (m_image)
+ return m_image->data();
+ return nullptr;
+}
+
void ImageResource::appendData(const char* data, size_t length)
{
if (m_multipartParser) {
@@ -381,8 +380,10 @@ void ImageResource::updateImage(bool allDataReceived)
// Have the image update its data from its internal buffer.
// It will not do anything now, but will delay decoding until
// queried for info (like size or specific image frames).
- if (m_image)
+ if (m_data) {
+ DCHECK(m_image);
sizeAvailable = m_image->setData(m_data, allDataReceived);
+ }
// Go ahead and tell our observers to try to draw if we have either
// received all the data or the size is known. Each chunk from the
@@ -418,6 +419,12 @@ void ImageResource::finish(double loadFinishTime)
updateImageAndClearBuffer();
} else {
updateImage(true);
+ // As encoded image data can be created from m_image (see
+ // ImageResource::resourceBuffer(), we don't have to keep m_data. Let's
+ // clear this. As for the lifetimes of m_image and m_data, see this
+ // document:
+ // https://docs.google.com/document/d/1v0yTAZ6wkqX2U_M6BNIGUJpM1s0TIw1VsqpxoL7aciY/edit?usp=sharing
+ m_data.clear();
}
Resource::finish(loadFinishTime);
}
@@ -531,8 +538,8 @@ void ImageResource::reloadIfLoFi(ResourceFetcher* fetcher)
if (isLoading())
m_loader->cancel();
clear();
- m_data.clear();
notifyObservers();
+
setStatus(NotStarted);
fetcher->startLoad(this);
}
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ImageResource.h ('k') | third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698