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 f77cb73636cc7317ee5928022b22ff317238107b..9da43b98404f2e4fca1359748c07fbc68d53111e 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->addData(data, length); |
+ } else { |
+ Resource::appendData(data, length); |
+ updateImage(false); |
+ } |
+} |
+ |
std::pair<blink::Image*, float> ImageResource::brokenImage(float deviceScaleFactor) |
{ |
if (deviceScaleFactor >= 2) { |
@@ -293,13 +307,6 @@ inline void ImageResource::clearImage() |
m_image.clear(); |
} |
-void ImageResource::appendDataInternal(const char* data, size_t length) |
-{ |
- Resource::appendDataInternal(data, length); |
- if (!loadingMultipartContent()) |
- updateImage(false); |
-} |
- |
void ImageResource::updateImage(bool allDataReceived) |
{ |
TRACE_EVENT0("blink", "ImageResource::updateImage"); |
@@ -333,18 +340,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(); |
@@ -353,8 +367,10 @@ void ImageResource::error(Resource::Status status) |
void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle) |
{ |
ASSERT(!handle); |
hiroshige
2016/02/26 19:03:35
Can we add |ASSERT(!m_multipartParser);|?
Also, i
yhirano
2016/02/27 02:03:20
Added an assertion for multipartParser.
Not sure
|
- if (response.isMultipartPayload() && m_data) |
- finishOnePart(); |
+ // If there's no boundary, just handle the request normally. In the gecko |
+ // code, nsMultiMixedConv::OnStartRequest throws an exception. |
+ if (response.isMultipart() && !response.multipartBoundary().isEmpty() && !m_multipartParser) |
+ 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); |
@@ -455,6 +471,34 @@ void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect |
notifyObservers(&rect); |
} |
+void ImageResource::didReceiveResponse(const ResourceResponse& response, bool isFirstPart) |
+{ |
+ ASSERT(isMultipartImage()); |
+ m_response = response; |
+ if (m_data) { |
+ clear(); |
+ updateImage(true); |
+ m_data.clear(); |
+ setLoading(false); |
+ checkNotify(); |
+ } |
+ if (!isFirstPart) { |
+ if (m_loader) { |
+ // Since a subresource loader does not load multipart sections progressively, data was delivered to the loader all at once. |
+ // After the first multipart section is complete, signal to delegates that this load is "finished" |
+ m_loader->fetcher()->subresourceLoaderFinishedLoadingOnePart(m_loader); |
+ } |
+ if (m_loader) |
+ m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncodedDataLength); |
+ } |
+} |
+ |
+void ImageResource::didReceiveData(const char* bytes, size_t size) |
+{ |
+ ASSERT(isMultipartImage()); |
+ Resource::appendData(bytes, size); |
+} |
+ |
bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) |
{ |
if (response().wasFetchedViaServiceWorker()) |
@@ -466,9 +510,4 @@ bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) |
return !securityOrigin->taintsCanvas(response().url()); |
} |
-bool ImageResource::loadingMultipartContent() const |
-{ |
- return m_loader && isMultipartImage(); |
-} |
- |
} // namespace blink |