function saveElementShot(filename, element) {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
var recentWindow = wm.getMostRecentWindow("navigator:browser");
var canvas = recentWindow.document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
var tabbrowser = recentWindow.getBrowser();
var browser = tabbrowser.getBrowserAtIndex(0);
var win = browser.contentWindow;
var width = win.document.body.clientWidth;
var height = win.document.body.clientHeight;
var bcr = eval("win." + element + ".getBoundingClientRect()");
width = parseInt(bcr.width);
height = parseInt(bcr.height);
var top = parseInt(bcr.top);
var left = parseInt(bcr.left);
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext('2d');
ctx.clearRect(left, top, canvas.width, canvas.height);
ctx.save();
ctx.scale(1.0, 1.0);
ctx.drawWindow(win, left, top, width, height, 'rgb(255,255,255)');
ctx.restore();
//var dataUrl = canvas.toDataURL("image/png");
var dataUrl = canvas.toDataURL("image/jpeg");
var nsFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
try {
nsFile.initWithPath(filename);
}
catch (e) {
if (/NS_ERROR_FILE_UNRECOGNIZED_PATH/.test(e.message)) {
if (filename.indexOf('/') != -1) {
filename = filename.replace(/\//g, '\\');
}
else {
filename = filename.replace(/\\/g, '/');
}
nsFile.initWithPath(filename);
}
else {
throw e;
}
}
var SGNsUtils = {
dataUrlToBinaryInputStream: function(dataUrl) {
var nsIoService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var channel = nsIoService
.newChannelFromURI(nsIoService.newURI(dataUrl, null, null));
var binaryInputStream = Components.classes["@mozilla.org/binaryinputstream;1"]
.createInstance(Components.interfaces.nsIBinaryInputStream);
binaryInputStream.setInputStream(channel.open());
return binaryInputStream;
},
newFileOutputStream: function(nsFile) {
var writeFlag = 0x02; // write only
var createFlag = 0x08; // create
var truncateFlag = 0x20; // truncate
var fileOutputStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
fileOutputStream.init(nsFile,
writeFlag | createFlag | truncateFlag,
0664,
null);
return fileOutputStream;
},
writeBinaryInputStreamToFileOutputStream: function(binaryInputStream, fileOutputStream) {
var numBytes = binaryInputStream.available();
var bytes = binaryInputStream.readBytes(numBytes);
fileOutputStream.write(bytes, numBytes);
}
};
var binaryInputStream = SGNsUtils.dataUrlToBinaryInputStream(dataUrl);
var fileOutputStream = SGNsUtils.newFileOutputStream(nsFile);
SGNsUtils.writeBinaryInputStreamToFileOutputStream(binaryInputStream, fileOutputStream);
fileOutputStream.close();
}