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

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

Issue 1738553002: [ABANDONED] Move multipart/x-mixed-replace related code to ImageResource (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@multipart-cleanup-2
Patch Set: Created 4 years, 10 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 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

Powered by Google App Engine
This is Rietveld 408576698