Dopo aver esaminato il codice di diverse estensioni. Ho adottato il seguente approccio (per scattare un'istantanea di un particolare elemento dom). Questo può essere usato in un'estensione per Firefox per prendere screenshot del l'intera pagina, di prendere screenshot della finestra del browser e di prendere screenshot di un particolare elemento DOM (e tutti i suoi nodi secondari):
- Aggiungi tela xul.
- Trova le dimensioni e le coordinate in alto a sinistra dell'elemento.
- Copia parte della finestra su tela.
- Converti canvas in file PNG base64.
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());
}
Per trovare coordinare in alto a sinistra di 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;
}
Per ottenere l'accesso a browser.xul dalla barra laterale
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(...);
Grazie per aver postato la risposta qui :) – flpmor
Questa soluzione funziona alla grande, anche se su YouTube quando è in riproduzione il video flash, se si utilizza SS, viene visualizzata la casella nera anziché l'acquisizione video. C'è qualche soluzione per questo problema? –
@Ivan: sei riuscito a caricare questo come componente aggiuntivo da qualche parte? Potrei usarlo. Apparentemente anche oggi non ci sono componenti aggiuntivi che lo consentano direttamente. –