diff --git a/dist/html2canvas.js b/dist/html2canvas.js index 22b077e..7262c32 100644 --- a/dist/html2canvas.js +++ b/dist/html2canvas.js @@ -1542,85 +1542,63 @@ process.umask = function() { return 0; }; var log = require('./log'); var Promise = require('./promise'); -var html2canvasCanvasCloneAttribute = "data-html2canvas-canvas-clone"; -var html2canvasCanvasCloneIndex = 0; - -function cloneNodeValues(document, clone, nodeName) { - var originalNodes = document.getElementsByTagName(nodeName); - var clonedNodes = clone.getElementsByTagName(nodeName); - var count = originalNodes.length; - for (var i = 0; i < count; i++) { - clonedNodes[i].value = originalNodes[i].value; - } -} - function restoreOwnerScroll(ownerDocument, x, y) { if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) { ownerDocument.defaultView.scrollTo(x, y); } } -function labelCanvasElements(ownerDocument) { - [].slice.call(ownerDocument.querySelectorAll("canvas"), 0).forEach(function(canvas) { - canvas.setAttribute(html2canvasCanvasCloneAttribute, "canvas-" + html2canvasCanvasCloneIndex++); - }); -} - -function cloneCanvasContents(ownerDocument, documentClone) { - [].slice.call(ownerDocument.querySelectorAll("[" + html2canvasCanvasCloneAttribute + "]"), 0).forEach(function(canvas) { - try { - var clonedCanvas = documentClone.querySelector('[' + html2canvasCanvasCloneAttribute + '="' + canvas.getAttribute(html2canvasCanvasCloneAttribute) + '"]'); - if (clonedCanvas) { - clonedCanvas.width = canvas.width; - clonedCanvas.height = canvas.height; - clonedCanvas.getContext("2d").putImageData(canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height), 0, 0); - } - } catch(e) { - log("Unable to copy canvas content from", canvas, e); +function cloneCanvasContents(canvas, clonedCanvas) { + try { + if (clonedCanvas) { + clonedCanvas.width = canvas.width; + clonedCanvas.height = canvas.height; + clonedCanvas.getContext("2d").putImageData(canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height), 0, 0); } - canvas.removeAttribute(html2canvasCanvasCloneAttribute); - }); + } catch(e) { + log("Unable to copy canvas content from", canvas, e); + } } -function removeScriptNodes(parent) { - [].slice.call(parent.childNodes, 0).filter(isElementNode).forEach(function(node) { - if (node.tagName === "SCRIPT") { - parent.removeChild(node); - } else { - removeScriptNodes(node); - } - }); - return parent; -} - -function isIE9() { - return document.documentMode && document.documentMode <= 9; -} - -// https://github.com/niklasvh/html2canvas/issues/503 -function cloneNodeIE9(node, javascriptEnabled) { +function cloneNode(node, javascriptEnabled) { var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false); var child = node.firstChild; while(child) { if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') { - clone.appendChild(cloneNodeIE9(child, javascriptEnabled)); + clone.appendChild(cloneNode(child, javascriptEnabled)); } child = child.nextSibling; } + if (node.nodeType === 1) { + clone._scrollTop = node.scrollTop; + clone._scrollLeft = node.scrollLeft; + if (node.nodeName === "CANVAS") { + cloneCanvasContents(node, clone); + } else if (node.nodeName === "TEXTAREA" || node.nodeName === "SELECT") { + clone.value = node.value; + } + } + return clone; } +function initNode(node) { + if (node.nodeType === 1) { + node.scrollTop = node._scrollTop; + node.scrollLeft = node._scrollLeft; - -function isElementNode(node) { - return node.nodeType === Node.ELEMENT_NODE; + var child = node.firstChild; + while(child) { + initNode(child); + child = child.nextSibling; + } + } } module.exports = function(ownerDocument, containerDocument, width, height, options, x ,y) { - labelCanvasElements(ownerDocument); - var documentElement = isIE9() ? cloneNodeIE9(ownerDocument.documentElement, options.javascriptEnabled) : ownerDocument.documentElement.cloneNode(true); + var documentElement = cloneNode(ownerDocument.documentElement, options.javascriptEnabled); var container = containerDocument.createElement("iframe"); container.className = "html2canvas-container"; @@ -1637,16 +1615,13 @@ module.exports = function(ownerDocument, containerDocument, width, height, optio return new Promise(function(resolve) { var documentClone = container.contentWindow.document; - cloneNodeValues(ownerDocument.documentElement, documentElement, "textarea"); - cloneNodeValues(ownerDocument.documentElement, documentElement, "select"); - /* Chrome doesn't detect relative background-images assigned in inline