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

Unified Diff: Source/core/html/ImageDocument.cpp

Issue 1154413002: Make multipart image documents work again. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix excessive clumsiness Created 5 years, 7 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
« no previous file with comments | « Source/core/html/ImageDocument.h ('k') | Source/core/loader/DocumentLoader.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/ImageDocument.cpp
diff --git a/Source/core/html/ImageDocument.cpp b/Source/core/html/ImageDocument.cpp
index 8fe7336858781632fcda90fb1a3d172791207de5..2413c2da116165f056c5e870d7bf49e334865067 100644
--- a/Source/core/html/ImageDocument.cpp
+++ b/Source/core/html/ImageDocument.cpp
@@ -136,6 +136,10 @@ void ImageDocumentParser::appendBytes(const char* data, size_t length)
RELEASE_ASSERT(length <= std::numeric_limits<unsigned>::max());
document()->cachedImage()->appendData(data, length);
}
+
+ if (!document())
+ return;
+
// Make sure the image layoutObject gets created because we need the layoutObject
// to read the aspect ratio. See crbug.com/320244
document()->updateLayoutTreeIfNeeded();
@@ -164,7 +168,8 @@ void ImageDocumentParser::finish()
document()->imageUpdated();
}
- document()->finishedParsing();
+ if (document())
+ document()->finishedParsing();
}
// --------
@@ -186,7 +191,7 @@ PassRefPtrWillBeRawPtr<DocumentParser> ImageDocument::createParser()
return ImageDocumentParser::create(this);
}
-void ImageDocument::createDocumentStructure()
+void ImageDocument::createDocumentStructure(bool loadingMultipartContent)
{
RefPtrWillBeRawPtr<HTMLHtmlElement> rootElement = HTMLHtmlElement::create(*this);
appendChild(rootElement);
@@ -194,6 +199,13 @@ void ImageDocument::createDocumentStructure()
if (frame())
frame()->loader().dispatchDocumentElementAvailable();
+ // Normally, ImageDocument creates an HTMLImageElement that doesn't actually load
+ // anything, and the ImageDocument routes the main resource data into the HTMLImageElement's
+ // ImageResource. However, the main resource pipeline doesn't know how to handle multipart content.
+ // For multipart content, we instead stop streaming data through the main resource and re-request
+ // the data directly.
+ if (loadingMultipartContent)
+ loader()->stopLoading();
RefPtrWillBeRawPtr<HTMLHeadElement> head = HTMLHeadElement::create(*this);
RefPtrWillBeRawPtr<HTMLMetaElement> meta = HTMLMetaElement::create(*this);
@@ -206,7 +218,10 @@ void ImageDocument::createDocumentStructure()
m_imageElement = HTMLImageElement::create(*this);
m_imageElement->setAttribute(styleAttr, "-webkit-user-select: none");
- m_imageElement->setLoadingImageDocument();
+ // If the image is multipart, we neglect to mention to the HTMLImageElement that it's in an
+ // ImageDocument, so that it requests the image normally.
+ if (!loadingMultipartContent)
+ m_imageElement->setLoadingImageDocument();
m_imageElement->setSrc(url().string());
body->appendChild(m_imageElement.get());
@@ -221,6 +236,8 @@ void ImageDocument::createDocumentStructure()
rootElement->appendChild(head);
rootElement->appendChild(body);
+ if (loadingMultipartContent)
+ finishedParsing();
}
float ImageDocument::scale() const
@@ -387,10 +404,11 @@ void ImageDocument::windowSizeChanged(ScaleType type)
ImageResource* ImageDocument::cachedImage()
{
+ bool loadingMultipartContent = loader() && loader()->loadingMultipartContent();
if (!m_imageElement)
- createDocumentStructure();
+ createDocumentStructure(loadingMultipartContent);
- return m_imageElement->cachedImage();
+ return loadingMultipartContent ? nullptr : m_imageElement->cachedImage();
}
bool ImageDocument::shouldShrinkToFit() const
« no previous file with comments | « Source/core/html/ImageDocument.h ('k') | Source/core/loader/DocumentLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698