iframe fixes

This commit is contained in:
Niklas von Hertzen 2011-07-17 02:20:01 +03:00
parent fc70e1d69b
commit 3193e1a20b

View File

@ -6,7 +6,7 @@
* Released under MIT License
*/
function html2canvas(a,b){this.opts=this.extendObj(b||{},{logging:!1,ready:function(a){document.body.appendChild(a)},flashCanvasPath:"http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js",renderViewport:!1});this.element=a;this.imagesLoaded=0;this.images=[];this.fontData=[];this.ignoreElements="IFRAME|OBJECT|PARAM";this.useRangeBounds=!1;this.init()}
function html2canvas(a,b){this.opts=this.extendObj(b||{},{logging:!1,ready:function(a){document.body.appendChild(a)},iframeDefault:"default",flashCanvasPath:"http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js",renderViewport:!1});this.element=a;this.imagesLoaded=0;this.images=[];this.fontData=[];this.ignoreElements="IFRAME|OBJECT|PARAM";this.ignoreRe=RegExp("("+this.ignoreElements+")");this.useRangeBounds=!1;this.init()}
html2canvas.prototype.init=function(){var a=this;this.canvas=document.createElement("canvas");this.canvas.width=$(document).width();this.canvas.height=$(document).height();if(this.canvas.getContext)this.ctx=this.canvas.getContext("2d");this.ctx?(this.ctx.textBaseline="bottom",this.log("Finding background images"),this.getImages(this.element),this.log("Finding images"),this.each(document.images,function(b,c){a.preloadImage(a.getAttr(c,"src"))}),this.images.length==0&&this.start()):this.log("Canvas not available")};
html2canvas.prototype.start=function(){if(this.images.length==0||this.imagesLoaded==this.images.length/2)this.log("Started parsing"),this.bodyOverflow=document.getElementsByTagName("body")[0].style.overflow,document.getElementsByTagName("body")[0].style.overflow="hidden",this.newElement(this.element),this.parseElement(this.element)};
html2canvas.prototype.finish=function(){this.log("Finished rendering");document.getElementsByTagName("body")[0].style.overflow=this.bodyOverflow;if(this.opts.renderViewport){var a=document.createElement("canvas");a.getContext("2d");a.width=window.innerWidth;a.height=window.innerHeight}this.opts.ready(this.canvas)};
@ -14,20 +14,20 @@ html2canvas.prototype.drawBackground=function(a,b){var c=this.getCSS(a,"backgrou
b.left,i.top+b.top,Math.min(b.width,d.width),Math.min(b.height,d.height),b.left,b.top);break;default:var f;i.top-=Math.ceil(i.top/d.height)*d.height;for(c=b.top+i.top;c<b.height+b.top;)e=Math.min(d.height,b.height+b.top-c),e=Math.floor(c+d.height)>e+c?e+c-c:d.height,c<b.top?(f=b.top-c,c=b.top):f=0,this.drawbackgroundRepeatX(d,i,b.left,c,b.width,e),f>0&&(i.top+=f),c=Math.floor(c+d.height)-f}else this.log("Error loading background:"+c)}};
html2canvas.prototype.backgroundImageUrl=function(a){a.substr(0,5)=='url("'?(a=a.substr(5),a=a.substr(0,a.length-2)):(a=a.substr(4),a=a.substr(0,a.length-1));return a};
html2canvas.prototype.getBackgroundPosition=function(a,b,c){var a=this.getCSS(a,"background-position").split(" "),e,d;a.length==1&&(e=a,a=[],a[0]=e,a[1]=e);a[0].toString().indexOf("%")!=-1?(d=parseFloat(a[0])/100,e=b.width*d-c.width*d):e=parseInt(a[0],10);a[1].toString().indexOf("%")!=-1?(d=parseFloat(a[1])/100,b=b.height*d-c.height*d):b=parseInt(a[1],10);return{top:b,left:e}};
html2canvas.prototype.drawbackgroundRepeatY=function(a,b,c,e,d,i){var f=Math.min(a.width,d),h;b.top-=Math.ceil(b.top/a.height)*a.height;for(h=e+b.top;h<i+e;)d=Math.floor(h+a.height)>i+e?i+e-h:a.height,this.drawBackgroundRepeat(a,c+b.left,h,f,d,c,e),h=Math.floor(h+a.height)};
html2canvas.prototype.drawbackgroundRepeatX=function(a,b,c,e,d,i){var i=Math.min(a.height,i),f,h;b.left-=Math.ceil(b.left/a.width)*a.width;for(h=c+b.left;h<d+c;)f=Math.floor(h+a.width)>d+c?d+c-h:a.width,this.drawBackgroundRepeat(a,h,e+b.top,f,i,c,e),h=Math.floor(h+a.width)};html2canvas.prototype.drawBackgroundRepeat=function(a,b,c,e,d,i,f){var h=0,g=0;i-b>0&&(h=i-b);f-c>0&&(g=f-c);this.ctx.drawImage(a,h,g,e-h,d-g,b+h,c+g,e-h,d-g)};
html2canvas.prototype.drawbackgroundRepeatY=function(a,b,c,e,d,i){var f=Math.min(a.width,d),g;b.top-=Math.ceil(b.top/a.height)*a.height;for(g=e+b.top;g<i+e;)d=Math.floor(g+a.height)>i+e?i+e-g:a.height,this.drawBackgroundRepeat(a,c+b.left,g,f,d,c,e),g=Math.floor(g+a.height)};
html2canvas.prototype.drawbackgroundRepeatX=function(a,b,c,e,d,i){var i=Math.min(a.height,i),f,g;b.left-=Math.ceil(b.left/a.width)*a.width;for(g=c+b.left;g<d+c;)f=Math.floor(g+a.width)>d+c?d+c-g:a.width,this.drawBackgroundRepeat(a,g,e+b.top,f,i,c,e),g=Math.floor(g+a.width)};html2canvas.prototype.drawBackgroundRepeat=function(a,b,c,e,d,i,f){var g=0,h=0;i-b>0&&(g=i-b);f-c>0&&(h=f-c);this.ctx.drawImage(a,g,h,e-g,d-h,b+g,c+h,e-g,d-h)};
html2canvas.prototype.getBorderData=function(a){var b=[],c=this;this.each(["top","right","bottom","left"],function(e,d){b.push({width:parseInt(c.getCSS(a,"border-"+d+"-width"),10),color:c.getCSS(a,"border-"+d+"-color")})});return b};
html2canvas.prototype.newElement=function(a){var b=this.getBounds(a),c=b.left,e=b.top,d=b.width,i=b.height,f=this,h;h=this.getCSS(a,"background-color");var g=this.getBorderData(a);this.each(g,function(a,b){if(b.width>0){var h=c,j=e,m=d,n=i-g[2].width;switch(a){case 0:n=g[0].width;break;case 1:h=c+d-g[1].width;m=g[1].width;break;case 2:j=j+i-g[2].width;n=g[2].width;break;case 3:m=g[3].width}f.newRect(h,j,m,n,b.color)}});this.newRect(c+g[3].width,e+g[0].width,d-(g[1].width+g[3].width),i-(g[0].width+
g[2].width),h);this.drawBackground(a,{left:c+g[3].width,top:e+g[0].width,width:d-(g[1].width+g[3].width),height:i-(g[0].width+g[2].width)});a.nodeName=="IMG"&&((h=f.loadImage(f.getAttr(a,"src")))?this.ctx.drawImage(h,0,0,h.width,h.height,c+parseInt(f.getCSS(a,"padding-left"),10)+g[3].width,e+parseInt(f.getCSS(a,"padding-top"),10)+g[0].width,b.width-(g[1].width+g[3].width+parseInt(f.getCSS(a,"padding-left"),10)+parseInt(f.getCSS(a,"padding-right"),10)),b.height-(g[0].width+g[2].width+parseInt(f.getCSS(a,
"padding-top"),10)+parseInt(f.getCSS(a,"padding-bottom"),10))):this.log("Error loading <img>:"+f.getAttr(a,"src")))};html2canvas.prototype.printText=function(a,b,c){this.trim(a).length>0&&this.ctx.fillText(a,b,c)};html2canvas.prototype.newRect=function(a,b,c,e,d){if(d!="transparent")this.ctx.fillStyle=d,this.ctx.fillRect(a,b,c,e)};
html2canvas.prototype.getImages=function(a){var b=this;this.each($(a).contents(),function(a,e){RegExp("("+this.ignoreElements+")").test(e.nodeName)||b.getImages(e)});if(a.nodeType==1||typeof a.nodeType=="undefined")(a=this.getCSS(a,"background-image"))&&a!="1"&&a!="none"&&a.substring(0,7)!="-webkit"&&a.substring(0,4)!="-moz"&&this.preloadImage(this.backgroundImageUrl(a))};html2canvas.prototype.loadImage=function(a){a=this.images.indexOf(a);return a!=-1?this.images[a+1]:!1};
html2canvas.prototype.preloadImage=function(a){if(this.images.indexOf(a)==-1){this.images.push(a);var b=new Image,c=this;$(b).load(function(){c.imagesLoaded++;c.start()});b.onerror=function(){c.images.splice(c.images.indexOf(b.src),2);c.imagesLoaded++;c.start()};b.src=a;this.images.push(b)}};
html2canvas.prototype.newText=function(a,b){var c=this.getCSS(a,"font-family"),e=this.getCSS(a,"font-size"),d=this.getCSS(a,"color"),i=this.getCSS(a,"font-weight"),f=this.getCSS(a,"font-style"),h=this.getCSS(a,"text-decoration");b.nodeValue=this.textTransform(b.nodeValue,this.getCSS(a,"text-transform"));var g=b.nodeValue;if(g.length>0){switch(i){case "401":i="bold"}if(h!="none")var k=this.fontMetrics(c,e);this.ctx.font=i+" "+f+" "+e+" "+c;this.ctx.fillStyle=d;c=b;for(e=0;e<g.length;e++){i=c.splitText(1);
if(this.useRangeBounds)document.createRange?(f=document.createRange(),f.selectNode(c)):f=document.body.createTextRange(),f=f.getBoundingClientRect()?f.getBoundingClientRect():{};else{var o=c.parentNode,l=document.createElement("wrapper"),j=c.cloneNode(!0);l.appendChild(c.cloneNode(!0));o.replaceChild(l,c);f=this.getBounds(l);o.replaceChild(j,l)}this.printText(c.nodeValue,f.left,f.bottom);switch(h){case "underline":this.newRect(f.left,Math.round(f.top+k.baseline+k.lineWidth),f.width,1,d);break;case "overline":this.newRect(f.left,
html2canvas.prototype.newElement=function(a){var b=this.getBounds(a),c=b.left,e=b.top,d=b.width,i=b.height,f=this,g;g=this.getCSS(a,"background-color");var h=this.getBorderData(a);this.each(h,function(a,b){if(b.width>0){var g=c,j=e,m=d,n=i-h[2].width;switch(a){case 0:n=h[0].width;break;case 1:g=c+d-h[1].width;m=h[1].width;break;case 2:j=j+i-h[2].width;n=h[2].width;break;case 3:m=h[3].width}f.newRect(g,j,m,n,b.color)}});this.ignoreRe.test(a.nodeName)&&this.opts.iframeDefault!="transparent"&&(g=this.opts.iframeDefault==
"default"?"#efefef":this.opts.iframeDefault);this.newRect(c+h[3].width,e+h[0].width,d-(h[1].width+h[3].width),i-(h[0].width+h[2].width),g);this.drawBackground(a,{left:c+h[3].width,top:e+h[0].width,width:d-(h[1].width+h[3].width),height:i-(h[0].width+h[2].width)});a.nodeName=="IMG"&&((g=f.loadImage(f.getAttr(a,"src")))?this.ctx.drawImage(g,0,0,g.width,g.height,c+parseInt(f.getCSS(a,"padding-left"),10)+h[3].width,e+parseInt(f.getCSS(a,"padding-top"),10)+h[0].width,b.width-(h[1].width+h[3].width+parseInt(f.getCSS(a,
"padding-left"),10)+parseInt(f.getCSS(a,"padding-right"),10)),b.height-(h[0].width+h[2].width+parseInt(f.getCSS(a,"padding-top"),10)+parseInt(f.getCSS(a,"padding-bottom"),10))):this.log("Error loading <img>:"+f.getAttr(a,"src")))};html2canvas.prototype.printText=function(a,b,c){this.trim(a).length>0&&this.ctx.fillText(a,b,c)};html2canvas.prototype.newRect=function(a,b,c,e,d){if(d!="transparent")this.ctx.fillStyle=d,this.ctx.fillRect(a,b,c,e)};
html2canvas.prototype.getImages=function(a){var b=this;this.ignoreRe.test(a.nodeName)||this.each($(a).contents(),function(a,e){RegExp("("+this.ignoreElements+")").test(e.nodeName)||b.getImages(e)});if(a.nodeType==1||typeof a.nodeType=="undefined")(a=this.getCSS(a,"background-image"))&&a!="1"&&a!="none"&&a.substring(0,7)!="-webkit"&&a.substring(0,4)!="-moz"&&this.preloadImage(this.backgroundImageUrl(a))};
html2canvas.prototype.loadImage=function(a){a=this.images.indexOf(a);return a!=-1?this.images[a+1]:!1};html2canvas.prototype.preloadImage=function(a){if(this.images.indexOf(a)==-1){this.images.push(a);var b=new Image,c=this;$(b).load(function(){c.imagesLoaded++;c.start()});b.onerror=function(){c.images.splice(c.images.indexOf(b.src),2);c.imagesLoaded++;c.start()};b.src=a;this.images.push(b)}};
html2canvas.prototype.newText=function(a,b){var c=this.getCSS(a,"font-family"),e=this.getCSS(a,"font-size"),d=this.getCSS(a,"color"),i=this.getCSS(a,"font-weight"),f=this.getCSS(a,"font-style"),g=this.getCSS(a,"text-decoration");b.nodeValue=this.textTransform(b.nodeValue,this.getCSS(a,"text-transform"));var h=b.nodeValue;if(h.length>0){switch(i){case "401":i="bold"}if(g!="none")var k=this.fontMetrics(c,e);this.ctx.font=i+" "+f+" "+e+" "+c;this.ctx.fillStyle=d;c=b;for(e=0;e<h.length;e++){i=c.splitText(1);
if(this.useRangeBounds)document.createRange?(f=document.createRange(),f.selectNode(c)):f=document.body.createTextRange(),f=f.getBoundingClientRect()?f.getBoundingClientRect():{};else{var o=c.parentNode,l=document.createElement("wrapper"),j=c.cloneNode(!0);l.appendChild(c.cloneNode(!0));o.replaceChild(l,c);f=this.getBounds(l);o.replaceChild(j,l)}this.printText(c.nodeValue,f.left,f.bottom);switch(g){case "underline":this.newRect(f.left,Math.round(f.top+k.baseline+k.lineWidth),f.width,1,d);break;case "overline":this.newRect(f.left,
f.top,f.width,1,d);break;case "line-through":this.newRect(f.left,Math.ceil(f.top+k.middle+k.lineWidth),f.width,1,d)}c=i}}};
html2canvas.prototype.fontMetrics=function(a,b){var c=this.fontData.indexOf(a+"-"+b);if(c>-1)return this.fontData[c+1];c=document.createElement("div");document.getElementsByTagName("body")[0].appendChild(c);$(c).css({visibility:"hidden",fontFamily:a,fontSize:b,margin:0,padding:0});var e=document.createElement("img");e.src="http://html2canvas.hertzen.com/images/8.jpg";e.width=1;e.height=1;$(e).css({margin:0,padding:0});var d=document.createElement("span");$(d).css({fontFamily:a,fontSize:b,margin:0,
padding:0});d.appendChild(document.createTextNode("Hidden Text"));c.appendChild(d);c.appendChild(e);var i=e.offsetTop-d.offsetTop+1;c.removeChild(d);c.appendChild(document.createTextNode("Hidden Text"));$(c).css("line-height","normal");$(e).css("vertical-align","super");e={baseline:i,lineWidth:1,middle:e.offsetTop-c.offsetTop+1};this.fontData.push(a+"-"+b);this.fontData.push(e);$(c).remove();return e};
html2canvas.prototype.textTransform=function(a,b){switch(b){case "lowercase":return a.toLowerCase();case "capitalize":return a.replace(/(^|\s|:|-|\(|\))([a-z])/g,function(a,b,d){return b+d.toUpperCase()});case "uppercase":return a.toUpperCase();default:return a}};html2canvas.prototype.trim=function(a){return a.replace(/^\s*/,"").replace(/\s*$/,"")};html2canvas.prototype.parseElement=function(a){var b=this;this.each(a.children,function(a,e){b.parsing(e)});this.finish()};
html2canvas.prototype.parsing=function(a){var b=this;if(!RegExp("("+this.ignoreElements+")").test(a.nodeName)){this.newElement(a);var c=$(a).contents();c.length==1?c[0].nodeType==1?this.parsing(c[0]):c[0].nodeType==3&&this.newText(a,c[0]):this.each(c,function(c,d){d.nodeType==1?b.parsing(d):d.nodeType==3&&b.newText(a,d)})}};html2canvas.prototype.log=function(){};
html2canvas.prototype.parsing=function(a){var b=this;this.newElement(a);if(!this.ignoreRe.test(a.nodeName)){var c=$(a).contents();c.length==1?c[0].nodeType==1?this.parsing(c[0]):c[0].nodeType==3&&this.newText(a,c[0]):this.each(c,function(c,d){d.nodeType==1?b.parsing(d):d.nodeType==3&&b.newText(a,d)})}};html2canvas.prototype.log=function(){};
html2canvas.prototype.getBounds=function(a){window.scroll(0,0);if(a.getBoundingClientRect)return a=a.getBoundingClientRect(),a.top=a.top,a.left=a.left,a;else{var b=$(a).offset();return{left:b.left+parseInt(this.getCSS(a,"border-left-width"),10),top:b.top+parseInt(this.getCSS(a,"border-top-width"),10),width:$(a).innerWidth(),height:$(a).innerHeight()}}};html2canvas.prototype.each=function(a,b){for(var b=b||function(){},c=0;c<a.length;c++)b(c,a[c])};html2canvas.prototype.getAttr=function(a,b){return a.getAttribute(b)};
html2canvas.prototype.extendObj=function(a,b){for(var c in a)b[c]=a[c];return b};html2canvas.prototype.getContents=function(a){return a.nodeName=="iframe"?a.contentDocument||a.contentWindow.document:a.childNodes};html2canvas.prototype.getCSS=function(a,b){return $(a).css(b)};