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 4235737767e45d6d5544d8b4ea38e7a97992ad76..60f63146d2e5e09238e7c6a5bf7a52410ed2dade 100644 |
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
@@ -99,8 +99,10 @@ ImageResource::~ImageResource() |
DEFINE_TRACE(ImageResource) |
{ |
+ visitor->trace(m_multipartParser); |
Resource::trace(visitor); |
ImageObserver::trace(visitor); |
+ MultipartImageResourceParser::Client::trace(visitor); |
} |
void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options) |
@@ -159,9 +161,21 @@ void ImageResource::allClientsRemoved() |
{ |
if (m_image && !errorOccurred()) |
m_image->resetAnimation(); |
+ if (m_multipartParser) |
+ m_multipartParser->cancel(); |
Resource::allClientsRemoved(); |
} |
+void ImageResource::appendData(const char* data, size_t length) |
+{ |
+ if (m_multipartParser) { |
+ m_multipartParser->appendData(data, length); |
+ } else { |
+ Resource::appendData(data, length); |
+ updateImage(false); |
+ } |
+} |
+ |
std::pair<blink::Image*, float> ImageResource::brokenImage(float deviceScaleFactor) |
{ |
if (deviceScaleFactor >= 2) { |
@@ -287,13 +301,6 @@ inline void ImageResource::clearImage() |
m_image.clear(); |
} |
-void ImageResource::appendData(const char* data, size_t length) |
-{ |
- Resource::appendData(data, length); |
- if (!loadingMultipartContent()) |
- updateImage(false); |
-} |
- |
void ImageResource::updateImage(bool allDataReceived) |
{ |
TRACE_EVENT0("blink", "ImageResource::updateImage"); |
@@ -327,18 +334,25 @@ void ImageResource::updateImage(bool allDataReceived) |
} |
} |
-void ImageResource::finishOnePart() |
+void ImageResource::finish() |
{ |
- if (loadingMultipartContent()) |
- clear(); |
- updateImage(true); |
- if (loadingMultipartContent()) |
- m_data.clear(); |
- Resource::finishOnePart(); |
+ if (m_multipartParser) { |
+ m_multipartParser->finish(); |
+ if (m_data) { |
+ clearImage(); |
+ updateImage(true); |
+ m_data.clear(); |
+ } |
+ } else { |
+ updateImage(true); |
+ } |
+ Resource::finish(); |
} |
void ImageResource::error(Resource::Status status) |
{ |
+ if (m_multipartParser) |
+ m_multipartParser->cancel(); |
clear(); |
Resource::error(status); |
notifyObservers(); |
@@ -346,8 +360,11 @@ void ImageResource::error(Resource::Status status) |
void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle) |
{ |
- if (loadingMultipartContent() && m_data) |
- finishOnePart(); |
+ ASSERT(!handle); |
+ ASSERT(!m_multipartParser); |
+ // If there's no boundary, just handle the request normally. |
+ if (response.isMultipart() && !response.multipartBoundary().isEmpty()) |
+ m_multipartParser = new MultipartImageResourceParser(response, response.multipartBoundary(), this); |
Resource::responseReceived(response, handle); |
if (RuntimeEnabledFeatures::clientHintsEnabled()) { |
m_devicePixelRatioHeaderValue = m_response.httpHeaderField(HTTPNames::Content_DPR).toFloat(&m_hasDevicePixelRatioHeaderValue); |
@@ -448,6 +465,27 @@ void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect |
notifyObservers(&rect); |
} |
+void ImageResource::onePartInMultipartReceived(const ResourceResponse& response, bool isFirstPart) |
+{ |
+ ASSERT(m_multipartParser); |
+ m_response = response; |
+ if (m_data) { |
+ clear(); |
+ updateImage(true); |
+ m_data.clear(); |
+ setLoading(false); |
+ checkNotify(); |
+ } |
+ if (!isFirstPart && m_loader) |
+ m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncodedDataLength); |
+} |
+ |
+void ImageResource::multipartDataReceived(const char* bytes, size_t size) |
+{ |
+ ASSERT(m_multipartParser); |
+ Resource::appendData(bytes, size); |
+} |
+ |
bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) |
{ |
if (response().wasFetchedViaServiceWorker()) |
@@ -459,9 +497,4 @@ bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) |
return !securityOrigin->taintsCanvas(response().url()); |
} |
-bool ImageResource::loadingMultipartContent() const |
-{ |
- return m_loader && m_loader->loadingMultipartContent(); |
-} |
- |
} // namespace blink |