Po przejrzeniu kodu kilku rozszerzeń. Przyjąłem następujące podejście (aby zrobić migawkę konkretnego elementu dom). Może to zostać wykorzystane w rozszerzenie Firefoksa do podjęcia zrzuty ekranu całej strony, do robienia zrzutów ekranu okna przeglądarki oraz do podjęcia zrzuty ekranu z danego elementu DOM (i wszystkich jego węzłów potomnych):
- Dodaj płótno xul.
- Znajdź wymiary i lewy górny współrzędne elementu.
- Skopiuj fragment okna na płótno.
- Konwersja kanwy do pliku PNG na poziomie 64.
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());
}
Aby znaleźć górny lewy współrzędnych elementu
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;
}
aby uzyskać dostęp do browser.xul z bocznym
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(...);
Dziękujemy za przesłanie odpowiedzi tutaj :) – flpmor
To rozwiązanie działa świetnie, chociaż na youtube, gdy odtwarzane jest wideo flash, jeśli weźmiesz SS, pokazuje on czarne pole zamiast przechwytywania wideo. Czy istnieje jakieś obejście tego problemu? –
@Ivan: Czy byłeś w stanie przesłać to jako dodatek? Mógłbym to wykorzystać. Podobno nawet dzisiaj nie ma żadnego dodatku, który pozwala mu bezpośrednio. –