Index: third_party/WebKit/Source/web/WebFrameSerializer.cpp |
diff --git a/third_party/WebKit/Source/web/WebFrameSerializer.cpp b/third_party/WebKit/Source/web/WebFrameSerializer.cpp |
index 401d4ea9df369e713cc8914fd9669e57c6e2bd28..9a266f1dce7545ba1fe7dfa7d3a26905d186d893 100644 |
--- a/third_party/WebKit/Source/web/WebFrameSerializer.cpp |
+++ b/third_party/WebKit/Source/web/WebFrameSerializer.cpp |
@@ -40,6 +40,7 @@ |
#include "core/html/HTMLAllCollection.h" |
#include "core/html/HTMLFrameElementBase.h" |
#include "core/html/HTMLFrameOwnerElement.h" |
+#include "core/html/HTMLImageElement.h" |
#include "core/html/HTMLInputElement.h" |
#include "core/html/HTMLTableElement.h" |
#include "core/loader/DocumentLoader.h" |
@@ -91,6 +92,11 @@ class MHTMLFrameSerializerDelegate final : public FrameSerializer::Delegate { |
Vector<Attribute> getCustomAttributes(const Element&) override; |
private: |
+ void getCustomAttributesForImageElement(const HTMLImageElement&, |
+ Vector<Attribute>*); |
+ void getCustomAttributesForFormControlElement(const Element&, |
+ Vector<Attribute>*); |
+ |
WebFrameSerializer::MHTMLPartsGenerationDelegate& m_webDelegate; |
}; |
@@ -193,18 +199,65 @@ Vector<Attribute> MHTMLFrameSerializerDelegate::getCustomAttributes( |
const Element& element) { |
Vector<Attribute> attributes; |
- // Disable all form elements in MTHML to tell the user that the form cannot be |
- // worked on. MHTML is loaded in full sandboxing mode which disable the form |
- // submission and script execution. |
- if (element.isFormControlElement() && |
- !element.fastHasAttribute(HTMLNames::disabledAttr)) { |
- Attribute disabledAttribute(HTMLNames::disabledAttr, ""); |
- attributes.push_back(disabledAttribute); |
+ if (isHTMLImageElement(element)) { |
+ getCustomAttributesForImageElement(toHTMLImageElement(element), |
+ &attributes); |
+ } else if (element.isFormControlElement()) { |
+ getCustomAttributesForFormControlElement(element, &attributes); |
} |
return attributes; |
} |
+void MHTMLFrameSerializerDelegate::getCustomAttributesForImageElement( |
+ const HTMLImageElement& element, |
+ Vector<Attribute>* attributes) { |
+ // Currently only the value of src is pulled into the archive and the srcset |
+ // attribute is ignored (see shouldIgnoreAttribute() above). If the device |
+ // has a higher DPR, a different image from srcset could be loaded instead. |
+ // When this occurs, we should provide the rendering width and height for |
+ // <img> element if not set. |
+ |
+ // The image should be loaded and participate the layout. |
+ ImageResourceContent* image = element.cachedImage(); |
+ if (!image || !image->hasImage() || image->errorOccurred() || |
+ !element.layoutObject()) { |
+ return; |
+ } |
+ |
+ // The width and height attributes should not be set. |
+ if (element.fastHasAttribute(HTMLNames::widthAttr) || |
+ element.fastHasAttribute(HTMLNames::heightAttr)) { |
+ return; |
+ } |
+ |
+ // Check if different image is loaded. naturalWidth/naturalHeight will return |
+ // the image size adjusted with current DPR. |
+ if (((int)element.naturalWidth()) == image->getImage()->width() && |
+ ((int)element.naturalHeight()) == image->getImage()->height()) { |
+ return; |
+ } |
+ |
+ Attribute widthAttribute(HTMLNames::widthAttr, |
+ AtomicString::number(element.layoutBoxWidth())); |
+ attributes->push_back(widthAttribute); |
+ Attribute heightAttribute(HTMLNames::heightAttr, |
+ AtomicString::number(element.layoutBoxHeight())); |
+ attributes->push_back(heightAttribute); |
+} |
+ |
+void MHTMLFrameSerializerDelegate::getCustomAttributesForFormControlElement( |
+ const Element& element, |
+ Vector<Attribute>* attributes) { |
+ // Disable all form elements in MTHML to tell the user that the form cannot be |
+ // worked on. MHTML is loaded in full sandboxing mode which disable the form |
+ // submission and script execution. |
+ if (element.fastHasAttribute(HTMLNames::disabledAttr)) |
+ return; |
+ Attribute disabledAttribute(HTMLNames::disabledAttr, ""); |
+ attributes->push_back(disabledAttribute); |
+} |
+ |
bool cacheControlNoStoreHeaderPresent( |
const WebLocalFrameImpl& webLocalFrameImpl) { |
const ResourceResponse& response = |