| 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 9bc402fa8ad405f4dfeb873b951a35bee2799962..507ad97f8c3993810f8e48d6a9ced2d25b4545b2 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) {
|
| @@ -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);
|
| - if (response.isMultipartPayload() && m_data)
|
| - finishOnePart();
|
| + 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);
|
| @@ -455,6 +471,27 @@ void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect
|
| notifyObservers(&rect);
|
| }
|
|
|
| +void ImageResource::onePartInMultipartReceived(const ResourceResponse& response, bool isFirstPart)
|
| +{
|
| + ASSERT(isMultipartImage());
|
| + 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(isMultipartImage());
|
| + Resource::appendData(bytes, size);
|
| +}
|
| +
|
| bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
|
| {
|
| if (response().wasFetchedViaServiceWorker())
|
| @@ -466,9 +503,4 @@ bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
|
| return !securityOrigin->taintsCanvas(response().url());
|
| }
|
|
|
| -bool ImageResource::loadingMultipartContent() const
|
| -{
|
| - return m_loader && isMultipartImage();
|
| -}
|
| -
|
| } // namespace blink
|
|
|