fix(bug-report): Bildschirmfoto scheitert nicht mehr an einem fremden Bild
html-to-image laedt jedes <img> per fetch nach; ein einziges Bild ohne CORS (z. B. ein direkt von der Website geholtes Favoriten-Symbol) liess die ganze Aufnahme scheitern, im Dialog blieb das Haekchen "Bildschirmfoto beifuegen" gesperrt. Nicht ladbare Bilder werden jetzt zum transparenten Pixel; scheitert die Aufnahme trotzdem, folgt ein zweiter Versuch ohne Bilder und Rahmen. Im Linux-Client 1.3.1 nachgestellt und nach dem Fix gegengeprueft. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -42,23 +42,50 @@ export function computeCaptureSize(
|
||||
};
|
||||
}
|
||||
|
||||
/** 1x1 transparentes PNG — Ersatz fuer Bilder, die sich nicht laden lassen. */
|
||||
const TRANSPARENT_PIXEL =
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
|
||||
|
||||
function isIgnoredNode(n: Node): boolean {
|
||||
return n instanceof HTMLElement && n.dataset.bugReportIgnore === 'true';
|
||||
}
|
||||
|
||||
/**
|
||||
* Nimmt die aktuelle Seite als PNG-Data-URL auf. Liefert `null` statt zu
|
||||
* werfen: das Bild ist eine Beigabe, der Bericht geht auch ohne.
|
||||
*
|
||||
* `html-to-image` laedt jedes `<img>` per `fetch` nach. Ein einziges Bild
|
||||
* von fremder Adresse ohne CORS (z. B. ein direkt von der Website geholtes
|
||||
* Favoriten-Symbol) liess bisher die GANZE Aufnahme scheitern — im Dialog
|
||||
* blieb das Haekchen „Bildschirmfoto beifuegen“ dann gesperrt. Deshalb:
|
||||
* nicht ladbare Bilder werden zum transparenten Pixel, und scheitert die
|
||||
* Aufnahme trotzdem, folgt ein zweiter Versuch ganz ohne Bilder und Rahmen.
|
||||
*/
|
||||
export async function captureScreenshot(): Promise<string | null> {
|
||||
try {
|
||||
const { toPng } = await import('html-to-image');
|
||||
const node = document.body;
|
||||
const size = computeCaptureSize(node.scrollWidth, node.scrollHeight);
|
||||
return await toPng(node, {
|
||||
const base = {
|
||||
pixelRatio: 1,
|
||||
skipFonts: true,
|
||||
cacheBust: true,
|
||||
canvasWidth: size.width,
|
||||
canvasHeight: size.height,
|
||||
filter: (n: Node) => !(n instanceof HTMLElement && n.dataset.bugReportIgnore === 'true'),
|
||||
});
|
||||
imagePlaceholder: TRANSPARENT_PIXEL,
|
||||
onImageErrorHandler: () => undefined,
|
||||
};
|
||||
try {
|
||||
return await toPng(node, { ...base, filter: (n: Node) => !isIgnoredNode(n) });
|
||||
} catch {
|
||||
return await toPng(node, {
|
||||
...base,
|
||||
filter: (n: Node) =>
|
||||
!isIgnoredNode(n) &&
|
||||
!(n instanceof HTMLImageElement) &&
|
||||
!(n instanceof HTMLIFrameElement),
|
||||
});
|
||||
}
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user