Chromium Code Reviews| 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 |