From 3032a161b86aa05c4154c1cb9bf5b4089826748f Mon Sep 17 00:00:00 2001 From: MoyuScript <i@moyu.moe> Date: Sun, 17 Jul 2011 02:19:26 +0300 Subject: [PATCH] fixed image search for iframes + added default content for iframes and flash content --- build/html2canvas.js | 50 ++++++++++++++++++++++++------------- src/Core.js | 3 ++- src/Draw.js | 17 ++++++++++--- src/Images.js | 16 ++++++------ src/Traversing.js | 14 ++++++----- tests/external-content.html | 23 +++++++++++++++++ 6 files changed, 89 insertions(+), 34 deletions(-) create mode 100644 tests/external-content.html diff --git a/build/html2canvas.js b/build/html2canvas.js index 4b0a24a..0bf22c4 100644 --- a/build/html2canvas.js +++ b/build/html2canvas.js @@ -43,6 +43,7 @@ function html2canvas(el, userOptions) { ready: function (canvas) { document.body.appendChild(canvas); }, + iframeDefault: "default", flashCanvasPath: "http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js", renderViewport: false }); @@ -60,7 +61,7 @@ function html2canvas(el, userOptions) { this.fontData = []; this.ignoreElements = "IFRAME|OBJECT|PARAM"; - + this.ignoreRe = new RegExp("("+this.ignoreElements+")"); // test how to measure text bounding boxes this.useRangeBounds = false; @@ -434,8 +435,8 @@ html2canvas.prototype.newElement = function(el){ /* - * TODO add support for different border-style's than solid - */ + * TODO add support for different border-style's than solid + */ var borders = this.getBorderData(el); this.each(borders,function(borderSide,borderData){ @@ -473,7 +474,18 @@ html2canvas.prototype.newElement = function(el){ }); - + + + if (this.ignoreRe.test(el.nodeName) && this.opts.iframeDefault != "transparent"){ + if (this.opts.iframeDefault=="default"){ + bgcolor = "#efefef"; + /* + * TODO write X over frame + */ + }else{ + bgcolor = this.opts.iframeDefault; + } + } // draw base element bgcolor this.newRect( @@ -546,13 +558,15 @@ html2canvas.prototype.getImages = function(el) { var self = this; - // TODO remove jQuery dependancy - this.each($(el).contents(),function(i,element){ - var ignRe = new RegExp("("+this.ignoreElements+")"); - if (!ignRe.test(element.nodeName)){ - self.getImages(element); - } - }) + if (!this.ignoreRe.test(el.nodeName)){ + // TODO remove jQuery dependancy + this.each($(el).contents(),function(i,element){ + var ignRe = new RegExp("("+this.ignoreElements+")"); + if (!ignRe.test(element.nodeName)){ + self.getImages(element); + } + }) + } if (el.nodeType==1 || typeof el.nodeType == "undefined"){ var background_image = this.getCSS(el,'background-image'); @@ -826,8 +840,8 @@ html2canvas.prototype.trim = function(text) { html2canvas.prototype.parseElement = function(element){ - var _ = this; - this.each(element.children,function(index,el){ + var _ = this; + this.each(element.children,function(index,el){ _.parsing(el); }); @@ -838,13 +852,15 @@ html2canvas.prototype.parseElement = function(element){ html2canvas.prototype.parsing = function(el){ - - var ignRe = new RegExp("("+this.ignoreElements+")"); + var _ = this; - if (!ignRe.test(el.nodeName)){ + + this.newElement(el); + + if (!this.ignoreRe.test(el.nodeName)){ - this.newElement(el); + // TODO remove jQuery dependancy var contents = $(el).contents(); diff --git a/src/Core.js b/src/Core.js index dab6770..4536036 100644 --- a/src/Core.js +++ b/src/Core.js @@ -13,6 +13,7 @@ function html2canvas(el, userOptions) { ready: function (canvas) { document.body.appendChild(canvas); }, + iframeDefault: "default", flashCanvasPath: "http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js", renderViewport: false }); @@ -30,7 +31,7 @@ function html2canvas(el, userOptions) { this.fontData = []; this.ignoreElements = "IFRAME|OBJECT|PARAM"; - + this.ignoreRe = new RegExp("("+this.ignoreElements+")"); // test how to measure text bounding boxes this.useRangeBounds = false; diff --git a/src/Draw.js b/src/Draw.js index 505d44a..e021da2 100644 --- a/src/Draw.js +++ b/src/Draw.js @@ -18,8 +18,8 @@ html2canvas.prototype.newElement = function(el){ /* - * TODO add support for different border-style's than solid - */ + * TODO add support for different border-style's than solid + */ var borders = this.getBorderData(el); this.each(borders,function(borderSide,borderData){ @@ -57,7 +57,18 @@ html2canvas.prototype.newElement = function(el){ }); - + + + if (this.ignoreRe.test(el.nodeName) && this.opts.iframeDefault != "transparent"){ + if (this.opts.iframeDefault=="default"){ + bgcolor = "#efefef"; + /* + * TODO write X over frame + */ + }else{ + bgcolor = this.opts.iframeDefault; + } + } // draw base element bgcolor this.newRect( diff --git a/src/Images.js b/src/Images.js index d32f741..42f74ae 100644 --- a/src/Images.js +++ b/src/Images.js @@ -5,13 +5,15 @@ html2canvas.prototype.getImages = function(el) { var self = this; - // TODO remove jQuery dependancy - this.each($(el).contents(),function(i,element){ - var ignRe = new RegExp("("+this.ignoreElements+")"); - if (!ignRe.test(element.nodeName)){ - self.getImages(element); - } - }) + if (!this.ignoreRe.test(el.nodeName)){ + // TODO remove jQuery dependancy + this.each($(el).contents(),function(i,element){ + var ignRe = new RegExp("("+this.ignoreElements+")"); + if (!ignRe.test(element.nodeName)){ + self.getImages(element); + } + }) + } if (el.nodeType==1 || typeof el.nodeType == "undefined"){ var background_image = this.getCSS(el,'background-image'); diff --git a/src/Traversing.js b/src/Traversing.js index 983814c..49a93b3 100644 --- a/src/Traversing.js +++ b/src/Traversing.js @@ -1,8 +1,8 @@ html2canvas.prototype.parseElement = function(element){ - var _ = this; - this.each(element.children,function(index,el){ + var _ = this; + this.each(element.children,function(index,el){ _.parsing(el); }); @@ -13,13 +13,15 @@ html2canvas.prototype.parseElement = function(element){ html2canvas.prototype.parsing = function(el){ - - var ignRe = new RegExp("("+this.ignoreElements+")"); + var _ = this; - if (!ignRe.test(el.nodeName)){ + + this.newElement(el); + + if (!this.ignoreRe.test(el.nodeName)){ - this.newElement(el); + // TODO remove jQuery dependancy var contents = $(el).contents(); diff --git a/tests/external-content.html b/tests/external-content.html new file mode 100644 index 0000000..b6b7a02 --- /dev/null +++ b/tests/external-content.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>External content tests</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <link href="#" type="text/css" rel="stylesheet"> + + <script type="text/javascript" src="../external/jquery-1.6.2.js"></script> + <script type="text/javascript" src="../build/html2canvas.js"></script> + <script type="text/javascript" src="../build/jquery.plugin.html2canvas.js"></script> + <script type="text/javascript"> + $(window).ready(function() { + $('body').html2canvas(); + }); + </script> + + + </head> + <body> + <h1>Iframe</h1> + <iframe src="http://www.google.com" style="width:400px;height:300px;border:5px solid black;"></iframe> + </body> +</html>