Skip to content

Commit 8bbbace

Browse files
committed
Merge pull request #41 from cobexer/for-niklasvh
a few fixes / improvements
2 parents 433d7ce + 3dec1cd commit 8bbbace

File tree

7 files changed

+50
-117
lines changed

7 files changed

+50
-117
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ index.html
1111
image.jpg
1212
screenshots.html
1313
screenshots_local.html
14+
/.project
15+
/.settings/

src/Core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
var html2canvas = {};
1010

11-
html2canvas.logging = true;
11+
html2canvas.logging = false;
1212

1313
html2canvas.log = function (a) {
1414
if (html2canvas.logging && window.console && window.console.log) {

src/Generate.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,17 @@ html2canvas.Generate.Gradient = function(src, bounds) {
3939
while( j++ < input.length ) {
4040
chr = input.charAt( j );
4141
if (chr === ')') {
42-
color += chr;
42+
color += chr;
4343
steps.push( color );
4444
color = '';
45-
j+=2;
46-
} else if (color || isValidColorStartChar(chr)) {
45+
while (j++ < input.length && input.charAt( j ) !== ',') {
46+
}
47+
} else {
4748
color += chr;
4849
}
4950
}
5051
}
5152

52-
function isValidColorStartChar(c) {
53-
return c && /[^0-9%,]/.test(c);
54-
}
55-
5653
if ( tmp = src.match(/-webkit-linear-gradient\((.*)\)/) ) {
5754

5855
position = tmp[1].split( ",", 1 )[0];
@@ -107,7 +104,12 @@ html2canvas.Generate.Gradient = function(src, bounds) {
107104
increment = 1 / (steps.length - 1);
108105

109106
for (i = 0, len = steps.length; i < len; i+=1) {
110-
lingrad.addColorStop(increment * i, steps[i]);
107+
try {
108+
lingrad.addColorStop(increment * i, steps[i]);
109+
}
110+
catch(e) {
111+
html2canvas.log(['failed to add color stop: ', e, '; tried to add: ', steps[i], '; stop: ', i, '; in: ', src]);
112+
}
111113
}
112114

113115
ctx.fillStyle = lingrad;

src/Preload.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ html2canvas.Preload = function(element, opts){
2525
doc = element.ownerDocument,
2626
domImages = doc.images, // TODO probably should limit it to images present in the element only
2727
imgLen = domImages.length,
28-
link = doc.createElement("a");
28+
link = doc.createElement("a"),
29+
timeoutTimer;
2930

3031
link.href = window.location.href;
3132
pageOrigin = link.protocol + link.host;
@@ -214,7 +215,7 @@ html2canvas.Preload = function(element, opts){
214215
methods = {
215216
loadImage: function( src ) {
216217
var img;
217-
if ( images[src] === undefined ) {
218+
if ( src && images[src] === undefined ) {
218219
if ( src.match(/data:image\/.*;base64,/i) ) {
219220

220221
//Base64 src
@@ -257,7 +258,7 @@ html2canvas.Preload = function(element, opts){
257258

258259
},
259260
cleanupDOM: function(cause) {
260-
var img;
261+
var img, src;
261262
if (!images.cleanupDone) {
262263
if (cause && typeof cause === "string") {
263264
html2canvas.log("html2canvas: Cleanup because: " + cause);
@@ -320,10 +321,7 @@ html2canvas.Preload = function(element, opts){
320321
this.log('html2canvas: Preload: Finding images');
321322
// load <img> images
322323
for (i = 0; i < imgLen; i+=1){
323-
var imgSrc = domImages[i].getAttribute( "src" );
324-
if ( imgSrc ) {
325-
methods.loadImage( imgSrc );
326-
}
324+
methods.loadImage( domImages[i].getAttribute( "src" ) );
327325
}
328326

329327
images.firstRun = false;

src/Renderer.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ html2canvas.Renderer = function(parseQueue, opts){
168168

169169

170170
}
171+
html2canvas.log("html2canvas: Renderer: Canvas renderer done - returning canvas obj");
171172

172173
// this.canvasRenderStorage(queue,this.ctx);
173174
return canvas;
@@ -352,7 +353,7 @@ html2canvas.Renderer = function(parseQueue, opts){
352353

353354

354355

355-
356+
html2canvas.log("html2canvas: Renderer: SVG Renderer done - returning SVG DOM obj");
356357

357358
return svg;
358359

@@ -367,11 +368,13 @@ html2canvas.Renderer = function(parseQueue, opts){
367368
case "canvas":
368369
canvas = doc.createElement('canvas');
369370
if (canvas.getContext){
371+
this.log("html2canvas: Renderer: using canvas renderer");
370372
return canvasRenderer(parseQueue);
371373
}
372374
break;
373375
case "svg":
374376
if (doc.createElementNS){
377+
this.log("html2canvas: Renderer: using SVG renderer");
375378
return svgRenderer(parseQueue);
376379
}
377380
break;
Lines changed: 25 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,54 @@
1-
21
/*
32
* jQuery helper plugin for examples and tests
43
*/
5-
64
(function( $ ){
75
$.fn.html2canvas = function(options) {
8-
9-
var date = new Date();
10-
var message,
11-
timeoutTimer,
12-
timer = date.getTime();
13-
14-
var preload = html2canvas.Preload(this[0], {
15-
"complete": function(images){
16-
17-
var queue = html2canvas.Parse(this[0], images);
18-
19-
20-
var canvas = $(html2canvas.Renderer(queue));
21-
var finishTime = new Date();
22-
23-
24-
canvas.css('position','absolute')
25-
.css('left',0).css('top',0);
26-
$('body').append(canvas);
27-
$(canvas).siblings().toggle();
28-
29-
30-
31-
$(window).click(function(){
32-
if (!canvas.is(':visible')){
33-
$(canvas).toggle().siblings().toggle();
34-
throwMessage("Canvas Render visible");
35-
} else{
36-
$(canvas).siblings().toggle();
37-
$(canvas).toggle();
38-
throwMessage("Canvas Render hidden");
39-
}
40-
41-
42-
});
43-
throwMessage('Screenshot created in '+ ((finishTime.getTime()-timer)/1000) + " seconds<br />",4000);
44-
45-
}
46-
});
47-
48-
49-
50-
51-
52-
53-
54-
/*
55-
var date = new Date();
56-
var message,
57-
timeoutTimer,
6+
var date = new Date(),
7+
$message = null,
8+
timeoutTimer = false,
589
timer = date.getTime();
59-
60-
var object = $.extend({},{
61-
logging: false,
62-
proxyUrl: "http://html2canvas.appspot.com/", // running html2canvas-python proxy
63-
ready: function(renderer) {
64-
65-
var finishTime = new Date();
66-
// console.log((finishTime.getTime()-timer)/1000);
67-
10+
html2canvas.logging = options && options.logging;
11+
html2canvas.Preload(this[0], $.extend({
12+
complete: function(images){
13+
var queue = html2canvas.Parse(this[0], images, options),
14+
$canvas = $(html2canvas.Renderer(queue, options)),
15+
finishTime = new Date();
6816

69-
document.body.appendChild(renderer.canvas);
70-
71-
72-
73-
var canvas = $(renderer.canvas);
74-
canvas.css('position','absolute')
75-
.css('left',0).css('top',0);
76-
17+
$canvas.css({ position: 'absolute', left: 0, top: 0 }).appendTo(document.body);
18+
$canvas.siblings().toggle();
7719

78-
79-
// $('body').append(canvas);
80-
$(canvas).siblings().toggle();
81-
82-
throwMessage('Screenshot created in '+ ((finishTime.getTime()-timer)/1000) + " seconds<br />Total of "+renderer.numDraws+" draws performed",4000);
83-
84-
8520
$(window).click(function(){
86-
if (!canvas.is(':visible')){
87-
$(canvas).toggle().siblings().toggle();
21+
if (!$canvas.is(':visible')){
22+
$canvas.toggle().siblings().toggle();
8823
throwMessage("Canvas Render visible");
8924
} else{
90-
$(canvas).siblings().toggle();
91-
$(canvas).toggle();
25+
$canvas.siblings().toggle();
26+
$canvas.toggle();
9227
throwMessage("Canvas Render hidden");
9328
}
94-
95-
9629
});
30+
throwMessage('Screenshot created in '+ ((finishTime.getTime()-timer)/1000) + " seconds<br />",4000);
9731
}
98-
99-
},options)
100-
101-
new html2canvas(this.get(0), object);
102-
103-
*/
104-
32+
}, options));
33+
10534
function throwMessage(msg,duration){
106-
10735
window.clearTimeout(timeoutTimer);
10836
timeoutTimer = window.setTimeout(function(){
109-
message.fadeOut(function(){
110-
message.remove();
111-
});
37+
$message.fadeOut(function(){
38+
$message.remove();
39+
});
11240
},duration || 2000);
113-
$(message).remove();
114-
message = $('<div />').html(msg).css({
41+
if ($message)
42+
$message.remove();
43+
$message = $('<div />').html(msg).css({
11544
margin:0,
11645
padding:10,
11746
background: "#000",
11847
opacity:0.7,
11948
position:"fixed",
12049
top:10,
12150
right:10,
122-
fontFamily: 'Tahoma' ,
51+
fontFamily: 'Tahoma',
12352
color:'#fff',
12453
fontSize:12,
12554
borderRadius:12,
@@ -129,8 +58,5 @@
12958
textDecoration:'none'
13059
}).hide().fadeIn().appendTo('body');
13160
}
132-
13361
};
134-
13562
})( jQuery );
136-

tests/images.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858
<img src="image.jpg" style="width:0px;height:0px;" />
5959

6060
<canvas id="testcanvas" style="width:100px;height:100px;"></canvas>
61-
61+
<br />
62+
Image without src attribute, should not crash:
63+
<img style="width:50px;height:50px;border:1px solid red;display:block;" />
6264

6365
</body>
6466
</html>

0 commit comments

Comments
 (0)