mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
Correctly render input[type="password"] value
This commit is contained in:
parent
e363f3813e
commit
498527918c
22
dist/html2canvas.js
vendored
22
dist/html2canvas.js
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
html2canvas 0.5.0-alpha <http://html2canvas.hertzen.com>
|
html2canvas 0.5.0-alpha <http://html2canvas.hertzen.com>
|
||||||
Copyright (c) 2014 Niklas von Hertzen
|
Copyright (c) 2015 Niklas von Hertzen
|
||||||
|
|
||||||
Released under MIT License
|
Released under MIT License
|
||||||
*/
|
*/
|
||||||
@ -580,6 +580,7 @@ window.html2canvas = function(nodeList, options) {
|
|||||||
options.removeContainer = typeof(options.removeContainer) === "undefined" ? true : options.removeContainer;
|
options.removeContainer = typeof(options.removeContainer) === "undefined" ? true : options.removeContainer;
|
||||||
options.javascriptEnabled = typeof(options.javascriptEnabled) === "undefined" ? false : options.javascriptEnabled;
|
options.javascriptEnabled = typeof(options.javascriptEnabled) === "undefined" ? false : options.javascriptEnabled;
|
||||||
options.imageTimeout = typeof(options.imageTimeout) === "undefined" ? 10000 : options.imageTimeout;
|
options.imageTimeout = typeof(options.imageTimeout) === "undefined" ? 10000 : options.imageTimeout;
|
||||||
|
options.renderer = typeof(options.renderer) === "function" ? options.renderer : CanvasRenderer;
|
||||||
|
|
||||||
if (typeof(nodeList) === "string") {
|
if (typeof(nodeList) === "string") {
|
||||||
if (typeof(options.proxy) !== "string") {
|
if (typeof(options.proxy) !== "string") {
|
||||||
@ -626,7 +627,7 @@ function renderWindow(node, container, options, windowWidth, windowHeight) {
|
|||||||
var bounds = getBounds(node);
|
var bounds = getBounds(node);
|
||||||
var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document);
|
var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document);
|
||||||
var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document);
|
var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document);
|
||||||
var renderer = new CanvasRenderer(width, height, imageLoader, options, document);
|
var renderer = new options.renderer(width, height, imageLoader, options, document);
|
||||||
var parser = new NodeParser(node, renderer, support, imageLoader, options);
|
var parser = new NodeParser(node, renderer, support, imageLoader, options);
|
||||||
return parser.ready.then(function() {
|
return parser.ready.then(function() {
|
||||||
log("Finished rendering");
|
log("Finished rendering");
|
||||||
@ -1691,7 +1692,11 @@ NodeContainer.prototype.hasTransform = function() {
|
|||||||
|
|
||||||
NodeContainer.prototype.getValue = function() {
|
NodeContainer.prototype.getValue = function() {
|
||||||
var value = this.node.value || "";
|
var value = this.node.value || "";
|
||||||
value = (this.node.tagName === "SELECT") ? selectionValue(this.node) : value;
|
if (this.node.tagName === "SELECT") {
|
||||||
|
value = selectionValue(this.node);
|
||||||
|
} else if (this.node.type === "password") {
|
||||||
|
value = Array(value.length + 1).join('\u2022'); // jshint ignore:line
|
||||||
|
}
|
||||||
return value.length === 0 ? (this.node.placeholder || "") : value;
|
return value.length === 0 ? (this.node.placeholder || "") : value;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1859,6 +1864,9 @@ function NodeParser(element, renderer, support, imageLoader, options) {
|
|||||||
this.renderQueue = [];
|
this.renderQueue = [];
|
||||||
this.stack = new StackingContext(true, 1, element.ownerDocument, null);
|
this.stack = new StackingContext(true, 1, element.ownerDocument, null);
|
||||||
var parent = new NodeContainer(element, null);
|
var parent = new NodeContainer(element, null);
|
||||||
|
if (options.background) {
|
||||||
|
renderer.rectangle(0, 0, renderer.width, renderer.height, new Color(options.background));
|
||||||
|
}
|
||||||
if (element === element.ownerDocument.documentElement) {
|
if (element === element.ownerDocument.documentElement) {
|
||||||
// http://www.w3.org/TR/css3-background/#special-backgrounds
|
// http://www.w3.org/TR/css3-background/#special-backgrounds
|
||||||
var canvasBackground = new NodeContainer(parent.color('backgroundColor').isTransparent() ? element.ownerDocument.body : element.ownerDocument.documentElement, null);
|
var canvasBackground = new NodeContainer(parent.color('backgroundColor').isTransparent() ? element.ownerDocument.body : element.ownerDocument.documentElement, null);
|
||||||
@ -2135,6 +2143,9 @@ NodeParser.prototype.paint = function(container) {
|
|||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
log(e);
|
log(e);
|
||||||
|
if (this.options.strict) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3147,9 +3158,6 @@ function CanvasRenderer(width, height) {
|
|||||||
this.canvas.height = height;
|
this.canvas.height = height;
|
||||||
}
|
}
|
||||||
this.ctx = this.canvas.getContext("2d");
|
this.ctx = this.canvas.getContext("2d");
|
||||||
if (this.options.background) {
|
|
||||||
this.rectangle(0, 0, width, height, new Color(this.options.background));
|
|
||||||
}
|
|
||||||
this.taintCtx = this.document.createElement("canvas").getContext("2d");
|
this.taintCtx = this.document.createElement("canvas").getContext("2d");
|
||||||
this.ctx.textBaseline = "bottom";
|
this.ctx.textBaseline = "bottom";
|
||||||
this.variables = {};
|
this.variables = {};
|
||||||
@ -3159,7 +3167,7 @@ function CanvasRenderer(width, height) {
|
|||||||
CanvasRenderer.prototype = Object.create(Renderer.prototype);
|
CanvasRenderer.prototype = Object.create(Renderer.prototype);
|
||||||
|
|
||||||
CanvasRenderer.prototype.setFillStyle = function(fillStyle) {
|
CanvasRenderer.prototype.setFillStyle = function(fillStyle) {
|
||||||
this.ctx.fillStyle = (fillStyle instanceof Color) ? fillStyle.toString() : fillStyle;
|
this.ctx.fillStyle = typeof(fillStyle) === "object" ? fillStyle.toString() : fillStyle;
|
||||||
return this.ctx;
|
return this.ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
6
dist/html2canvas.min.js
vendored
6
dist/html2canvas.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/html2canvas.svg.js
vendored
2
dist/html2canvas.svg.js
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
html2canvas 0.5.0-alpha <http://html2canvas.hertzen.com>
|
html2canvas 0.5.0-alpha <http://html2canvas.hertzen.com>
|
||||||
Copyright (c) 2014 Niklas von Hertzen
|
Copyright (c) 2015 Niklas von Hertzen
|
||||||
|
|
||||||
Released under MIT License
|
Released under MIT License
|
||||||
*/
|
*/
|
||||||
|
2
dist/html2canvas.svg.min.js
vendored
2
dist/html2canvas.svg.min.js
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
html2canvas 0.5.0-alpha <http://html2canvas.hertzen.com>
|
html2canvas 0.5.0-alpha <http://html2canvas.hertzen.com>
|
||||||
Copyright (c) 2014 Niklas von Hertzen
|
Copyright (c) 2015 Niklas von Hertzen
|
||||||
|
|
||||||
Released under MIT License
|
Released under MIT License
|
||||||
*/
|
*/
|
||||||
|
@ -16,6 +16,7 @@ window.html2canvas = function(nodeList, options) {
|
|||||||
options.removeContainer = typeof(options.removeContainer) === "undefined" ? true : options.removeContainer;
|
options.removeContainer = typeof(options.removeContainer) === "undefined" ? true : options.removeContainer;
|
||||||
options.javascriptEnabled = typeof(options.javascriptEnabled) === "undefined" ? false : options.javascriptEnabled;
|
options.javascriptEnabled = typeof(options.javascriptEnabled) === "undefined" ? false : options.javascriptEnabled;
|
||||||
options.imageTimeout = typeof(options.imageTimeout) === "undefined" ? 10000 : options.imageTimeout;
|
options.imageTimeout = typeof(options.imageTimeout) === "undefined" ? 10000 : options.imageTimeout;
|
||||||
|
options.renderer = typeof(options.renderer) === "function" ? options.renderer : CanvasRenderer;
|
||||||
|
|
||||||
if (typeof(nodeList) === "string") {
|
if (typeof(nodeList) === "string") {
|
||||||
if (typeof(options.proxy) !== "string") {
|
if (typeof(options.proxy) !== "string") {
|
||||||
@ -62,7 +63,7 @@ function renderWindow(node, container, options, windowWidth, windowHeight) {
|
|||||||
var bounds = getBounds(node);
|
var bounds = getBounds(node);
|
||||||
var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document);
|
var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document);
|
||||||
var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document);
|
var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document);
|
||||||
var renderer = new CanvasRenderer(width, height, imageLoader, options, document);
|
var renderer = new options.renderer(width, height, imageLoader, options, document);
|
||||||
var parser = new NodeParser(node, renderer, support, imageLoader, options);
|
var parser = new NodeParser(node, renderer, support, imageLoader, options);
|
||||||
return parser.ready.then(function() {
|
return parser.ready.then(function() {
|
||||||
log("Finished rendering");
|
log("Finished rendering");
|
||||||
|
@ -244,7 +244,11 @@ NodeContainer.prototype.hasTransform = function() {
|
|||||||
|
|
||||||
NodeContainer.prototype.getValue = function() {
|
NodeContainer.prototype.getValue = function() {
|
||||||
var value = this.node.value || "";
|
var value = this.node.value || "";
|
||||||
value = (this.node.tagName === "SELECT") ? selectionValue(this.node) : value;
|
if (this.node.tagName === "SELECT") {
|
||||||
|
value = selectionValue(this.node);
|
||||||
|
} else if (this.node.type === "password") {
|
||||||
|
value = Array(value.length + 1).join('\u2022'); // jshint ignore:line
|
||||||
|
}
|
||||||
return value.length === 0 ? (this.node.placeholder || "") : value;
|
return value.length === 0 ? (this.node.placeholder || "") : value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,6 +7,9 @@ function NodeParser(element, renderer, support, imageLoader, options) {
|
|||||||
this.renderQueue = [];
|
this.renderQueue = [];
|
||||||
this.stack = new StackingContext(true, 1, element.ownerDocument, null);
|
this.stack = new StackingContext(true, 1, element.ownerDocument, null);
|
||||||
var parent = new NodeContainer(element, null);
|
var parent = new NodeContainer(element, null);
|
||||||
|
if (options.background) {
|
||||||
|
renderer.rectangle(0, 0, renderer.width, renderer.height, new Color(options.background));
|
||||||
|
}
|
||||||
if (element === element.ownerDocument.documentElement) {
|
if (element === element.ownerDocument.documentElement) {
|
||||||
// http://www.w3.org/TR/css3-background/#special-backgrounds
|
// http://www.w3.org/TR/css3-background/#special-backgrounds
|
||||||
var canvasBackground = new NodeContainer(parent.color('backgroundColor').isTransparent() ? element.ownerDocument.body : element.ownerDocument.documentElement, null);
|
var canvasBackground = new NodeContainer(parent.color('backgroundColor').isTransparent() ? element.ownerDocument.body : element.ownerDocument.documentElement, null);
|
||||||
@ -283,6 +286,9 @@ NodeParser.prototype.paint = function(container) {
|
|||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
log(e);
|
log(e);
|
||||||
|
if (this.options.strict) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,9 +6,6 @@ function CanvasRenderer(width, height) {
|
|||||||
this.canvas.height = height;
|
this.canvas.height = height;
|
||||||
}
|
}
|
||||||
this.ctx = this.canvas.getContext("2d");
|
this.ctx = this.canvas.getContext("2d");
|
||||||
if (this.options.background) {
|
|
||||||
this.rectangle(0, 0, width, height, new Color(this.options.background));
|
|
||||||
}
|
|
||||||
this.taintCtx = this.document.createElement("canvas").getContext("2d");
|
this.taintCtx = this.document.createElement("canvas").getContext("2d");
|
||||||
this.ctx.textBaseline = "bottom";
|
this.ctx.textBaseline = "bottom";
|
||||||
this.variables = {};
|
this.variables = {};
|
||||||
@ -18,7 +15,7 @@ function CanvasRenderer(width, height) {
|
|||||||
CanvasRenderer.prototype = Object.create(Renderer.prototype);
|
CanvasRenderer.prototype = Object.create(Renderer.prototype);
|
||||||
|
|
||||||
CanvasRenderer.prototype.setFillStyle = function(fillStyle) {
|
CanvasRenderer.prototype.setFillStyle = function(fillStyle) {
|
||||||
this.ctx.fillStyle = (fillStyle instanceof Color) ? fillStyle.toString() : fillStyle;
|
this.ctx.fillStyle = typeof(fillStyle) === "object" ? fillStyle.toString() : fillStyle;
|
||||||
return this.ctx;
|
return this.ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<input type="hidden" value="THIS SHOULD NOT BE VISIBLE!" />
|
<input type="hidden" value="THIS SHOULD NOT BE VISIBLE!" />
|
||||||
<input type="text" value="textbox" />
|
<input type="text" value="textbox" />
|
||||||
|
<input type="password" value="textbox" />
|
||||||
<input type="text" value="textbox" style="border:5px solid navy;" />
|
<input type="text" value="textbox" style="border:5px solid navy;" />
|
||||||
<input type="text" value="textbox" style="border:5px solid navy;height:40px;" />
|
<input type="text" value="textbox" style="border:5px solid navy;height:40px;" />
|
||||||
|
|
||||||
|
72
tests/mocha/password-rendering.html
Normal file
72
tests/mocha/password-rendering.html
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Mocha Tests</title>
|
||||||
|
<link rel="stylesheet" href="lib/mocha.css" />
|
||||||
|
<script src="../../dist/html2canvas.js"></script>
|
||||||
|
<script src="../../src/log.js"></script>
|
||||||
|
<script src="../../src/renderer.js"></script>
|
||||||
|
<script src="../../src/renderers/canvas.js"></script>
|
||||||
|
<script src="../assets/jquery-1.6.2.js"></script>
|
||||||
|
<script src="lib/expect.js"></script>
|
||||||
|
<script src="lib/mocha.js"></script>
|
||||||
|
<style>
|
||||||
|
.block {
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="mocha"></div>
|
||||||
|
<script>mocha.setup('bdd')</script>
|
||||||
|
<div id="block1" class="block">
|
||||||
|
<input type="text" value="text" />
|
||||||
|
</div>
|
||||||
|
<div id="block2" class="block">
|
||||||
|
<input type="password" value="password" />
|
||||||
|
</div>
|
||||||
|
<div id="green-block"></div>
|
||||||
|
<script>
|
||||||
|
describe("Rendering input values", function() {
|
||||||
|
it("uses default value for input[type='text']", function(done) {
|
||||||
|
CanvasRenderer.prototype.text = function(text) {
|
||||||
|
expect(text).to.equal('text');
|
||||||
|
};
|
||||||
|
html2canvas(document.querySelector("#block1"), {renderer: CanvasRenderer, strict: true}).then(function(canvas) {
|
||||||
|
expect(canvas.width).to.equal(200);
|
||||||
|
expect(canvas.height).to.equal(200);
|
||||||
|
done();
|
||||||
|
}).catch(function(error) {
|
||||||
|
done(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses transformed value for input[type='password']", function(done) {
|
||||||
|
var count = 0;
|
||||||
|
CanvasRenderer.prototype.text = function(text) {
|
||||||
|
expect(text).to.equal('•');
|
||||||
|
count++;
|
||||||
|
};
|
||||||
|
html2canvas(document.querySelector("#block2"), {renderer: CanvasRenderer, strict: true}).then(function(canvas) {
|
||||||
|
expect(canvas.width).to.equal(200);
|
||||||
|
expect(canvas.height).to.equal(200);
|
||||||
|
expect(count).to.equal("password".length);
|
||||||
|
done();
|
||||||
|
}).catch(function(error) {
|
||||||
|
done(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
mocha.checkLeaks();
|
||||||
|
mocha.globals(['jQuery']);
|
||||||
|
if (window.mochaPhantomJS) {
|
||||||
|
mochaPhantomJS.run();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mocha.run();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user