Después de examinar el código de varias extensiones. Tomé el siguiente enfoque (para tomar una instantánea de un elemento dom en particular). Esto puede ser usado en una extensión de Firefox para tomar capturas de pantalla de la página entera, para tomar capturas de pantalla de la ventana del navegador y para tomar capturas de pantalla de un elemento DOM en particular (y todos sus nodos secundarios):
- Añadir lienzo para xul.
- Encuentra las cotas y las coordenadas de la parte superior izquierda del elemento.
- Copia la parte de la ventana en el lienzo.
- Convertir lienzo en archivo base64 PNG.
function getElementScreenshot(elm) {
var x = findPosX(elm);
var y = findPosY(elm);
var width = elm.clientWidth;
var height = elm.clientHeight;
var cnvs = document.getElementById("aCanvas");
cnvs.width = width;
cnvs.height = height;
var ctx = cnvs.getContext("2d");
// To take a snapshot of entire window
// ctx.drawWindow(mainWindow.content, 0, 0, mainWindow.innerWidth, mainWindow.innerHeight, "rgb(255,255,255)");
ctx.drawWindow(mainWindow.content, x, y, width, height, "rgb(255,255,255)");
return(cnvs.toDataURL());
}
Para hallar la coordenada superior izquierda de un elemento
function findPosX(obj) {
var curleft = 0;
if (obj.offsetParent) {
while (1) {
curleft += obj.offsetLeft;
if (!obj.offsetParent) {
break;
}
obj = obj.offsetParent;
}
} else if (obj.x) {
curleft += obj.x;
}
return curleft;
}
function findPosY(obj) {
var curtop = 0;
if (obj.offsetParent) {
while (1) {
curtop += obj.offsetTop;
if (!obj.offsetParent) {
break;
}
obj = obj.offsetParent;
}
} else if (obj.y) {
curtop += obj.y;
}
return curtop;
}
Para conseguir el acceso a browser.xul de la barra lateral
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
mainWindow.gBrowser.addTab(...);
Gracias por publicar la respuesta aquí :) – flpmor
Esta solución funciona muy bien, aunque en youtube cuando se está reproduciendo video flash, si toma SS, muestra una caja negra en lugar de captura de video. ¿Hay alguna solución para este problema? –
@Ivan: ¿Pudiste subir esto como complemento en algún lado? Podría usar eso. Al parecer, incluso hoy en día no hay ningún complemento que lo permita directamente. –