|
|
@@ -23,6 +23,7 @@ this.docHelper = this.docHelper || (() => {
|
|
|
const REMOVED_CONTENT_ATTRIBUTE_NAME = "data-single-file-removed-content";
|
|
|
const PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME = "data-single-file-preserved-space-element";
|
|
|
const WIN_ID_ATTRIBUTE_NAME = "data-frame-tree-win-id";
|
|
|
+ const RESPONSIVE_IMAGE_ATTRIBUTE_NAME = "data-single-file-responsive-image";
|
|
|
|
|
|
return {
|
|
|
preProcessDoc,
|
|
|
@@ -30,7 +31,8 @@ this.docHelper = this.docHelper || (() => {
|
|
|
serialize,
|
|
|
windowIdAttributeName,
|
|
|
preservedSpaceAttributeName,
|
|
|
- removedContentAttributeName
|
|
|
+ removedContentAttributeName,
|
|
|
+ responsiveImagesAttributeName
|
|
|
};
|
|
|
|
|
|
function preProcessDoc(doc, win, options) {
|
|
|
@@ -61,7 +63,7 @@ this.docHelper = this.docHelper || (() => {
|
|
|
return {
|
|
|
canvasData: getCanvasData(doc),
|
|
|
stylesheetContents: getStylesheetContents(doc),
|
|
|
- currentSrcImages: getCurrentSrcImages(doc)
|
|
|
+ imageData: getImageData(doc, options)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
@@ -78,7 +80,11 @@ this.docHelper = this.docHelper || (() => {
|
|
|
if (options.compressHTML) {
|
|
|
doc.querySelectorAll("[" + preservedSpaceAttributeName(options.sessionId) + "]").forEach(element => element.removeAttribute(preservedSpaceAttributeName(options.sessionId)));
|
|
|
}
|
|
|
- doc.querySelectorAll("[" + windowIdAttributeName(options.sessionId) + "]").forEach(element => element.removeAttribute(windowIdAttributeName(options.sessionId)));
|
|
|
+ doc.querySelectorAll("[" + responsiveImagesAttributeName(options.sessionId) + "]").forEach(element => element.removeAttribute(responsiveImagesAttributeName(options.sessionId)));
|
|
|
+ }
|
|
|
+
|
|
|
+ function responsiveImagesAttributeName(sessionId) {
|
|
|
+ return RESPONSIVE_IMAGE_ATTRIBUTE_NAME + (sessionId ? "-" + sessionId : "");
|
|
|
}
|
|
|
|
|
|
function preservedSpaceAttributeName(sessionId) {
|
|
|
@@ -121,26 +127,35 @@ this.docHelper = this.docHelper || (() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- function getCurrentSrcImages(doc) {
|
|
|
+ function getImageData(doc, options) {
|
|
|
if (doc) {
|
|
|
- const urls = [];
|
|
|
- doc.querySelectorAll("[srcset], [data-srcset]").forEach((element, elementIndex) => {
|
|
|
+ const data = [];
|
|
|
+ doc.querySelectorAll("picture, img[srcset]").forEach((element, elementIndex) => {
|
|
|
const tagName = element.tagName.toLowerCase();
|
|
|
- let imageElement;
|
|
|
- if (tagName == "source") {
|
|
|
- const parentElement = element.parentElement;
|
|
|
- if (parentElement.tagName.toLowerCase() == "picture") {
|
|
|
- imageElement = parentElement.querySelector("img");
|
|
|
- }
|
|
|
+ let imageData = {}, imageElement;
|
|
|
+ element.setAttribute(responsiveImagesAttributeName(options.sessionId), elementIndex);
|
|
|
+ if (tagName == "picture") {
|
|
|
+ const sources = Array.from(element.querySelectorAll("source")).map(sourceElement => (
|
|
|
+ { src: sourceElement.src, srcset: sourceElement.srcset }
|
|
|
+ ));
|
|
|
+ imageElement = element.querySelector("img");
|
|
|
+ imageData.sources = sources;
|
|
|
}
|
|
|
if (tagName == "img") {
|
|
|
imageElement = element;
|
|
|
}
|
|
|
- if (imageElement.naturalWidth > 1 && imageElement.naturalHeight > 1 && !imageElement.currentSrc.startsWith("data:")) {
|
|
|
- urls[elementIndex] = imageElement.currentSrc;
|
|
|
- }
|
|
|
+ imageData.source = {
|
|
|
+ clientWidth: imageElement.clientWidth,
|
|
|
+ clientHeight: imageElement.clientHeight,
|
|
|
+ naturalWidth: imageElement.naturalWidth,
|
|
|
+ naturalHeight: imageElement.naturalHeight,
|
|
|
+ width: imageElement.width,
|
|
|
+ height: imageElement.height,
|
|
|
+ src: (!imageElement.currentSrc.startsWith("data:") && imageElement.currentSrc) || (!imageElement.src.startsWith("data:") && imageElement.src)
|
|
|
+ };
|
|
|
+ data.push(imageData);
|
|
|
});
|
|
|
- return urls;
|
|
|
+ return data;
|
|
|
}
|
|
|
}
|
|
|
|