Release v2.3.6 — Signatur-Footer: neue Compose-Fenster ziehen gesyncten Footer automatisch

Thunderbird cacht die Identitäts-Signatur pro Sitzung, daher zeigte ein nach
dem Hintergrund-Sync geöffnetes Verfassen-Fenster noch den alten Footer.
background.js hängt sich jetzt an tabs.onCreated und tauscht im Signaturblock
automatisch den Footer-Teil (ab SIG_FOOTER_START) gegen den frischen aus —
ohne Benutzeraktion.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNGrD9ewk1gkStw9znPqQ1
This commit is contained in:
Kendrick Bollens
2026-07-01 12:35:08 +02:00
parent c7383f3a77
commit c5eebd1b06
3 changed files with 80 additions and 1 deletions

View File

@@ -98,6 +98,85 @@ browser.storage.onChanged.addListener((changes, area) => {
});
updateErledigtPopup();
// ── Signatur in neuen Compose-Fenstern automatisch aktualisieren ──
//
// Thunderbird merkt sich die Signatur einer Identität pro Sitzung. Öffnet der
// Benutzer nach einem Hintergrund-Sync ein neues Verfassen-Fenster, steckt darin
// noch die ALTE Signatur (alter Footer) — `identities.update({signature})`
// schreibt zwar den Pref, aber das Compose-Fenster fügt die gecachte Fassung ein.
// Ein Event „neues Compose-Fenster" gibt es in der WebExtension-API nicht, daher
// hängen wir uns an tabs.onCreated und tauschen NUR den Footer-Teil (ab dem
// SIG_FOOTER_START-Marker) im eingefügten Signaturblock gegen den frisch
// gesyncten aus. Header, Trenner ("-- ") und Struktur bleiben unangetastet.
// Vollautomatisch, ohne jede Benutzeraktion.
const SIG_FOOTER_MARK = '<!-- SIG_FOOTER_START -->';
const sigSleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function getFreshFooter() {
const c = await browser.storage.local.get('sig_footer_cache');
return c.sig_footer_cache || '';
}
async function refreshComposeSignature(tabId, tabType) {
// Nicht-Compose-Tabs sofort ignorieren, wenn der Typ bekannt ist.
if (tabType && tabType !== 'messageCompose') return;
const footer = await getFreshFooter();
if (!footer) return;
// Läuft IM Compose-Dokument: findet den Signaturblock, ersetzt nur den Footer.
const code = `(function(){
const editor = document.getElementById('messageEditor');
const doc = editor ? editor.contentDocument : document;
const sig = doc.querySelector('.moz-signature');
if (!sig) return 'notready';
const MARK = ${JSON.stringify(SIG_FOOTER_MARK)};
const cur = sig.innerHTML;
const i = cur.indexOf(MARK);
if (i === -1) return 'unmanaged'; // keine vom Plugin verwaltete Signatur
const before = cur.slice(0, i + MARK.length); // "-- <br>" + Header + Marker
const curFooter = cur.slice(i + MARK.length).replace(/^\\s+/, '');
const NEW = ${JSON.stringify(footer)};
if (curFooter === NEW) return 'current'; // schon aktuell, nichts tun
sig.innerHTML = before + '\\n' + NEW;
return 'updated';
})();`;
// Thunderbird fügt die Signatur evtl. erst kurz nach dem Öffnen ein → kurz pollen.
let throwCount = 0;
for (let attempt = 0; attempt < 20; attempt++) {
let details;
try {
details = await browser.compose.getComposeDetails(tabId);
} catch (_) {
// Kein Compose-Tab oder noch nicht bereit. Bei bekanntem Typ weiter pollen,
// sonst nach ein paar Fehlversuchen aufgeben.
if (tabType !== 'messageCompose' && ++throwCount > 3) return;
await sigSleep(150);
continue;
}
if (!details) { await sigSleep(150); continue; }
if (details.isPlainText) return; // Footer ist HTML — Plaintext nicht anfassen
if (details.type === 'draft') return; // gespeicherte Entwürfe nicht überschreiben
let res;
try {
const out = await browser.tabs.executeScript(tabId, { code });
res = Array.isArray(out) ? out[0] : out;
} catch (_) {
return; // Fenster bereits geschlossen o. Ä.
}
if (res !== 'notready') return; // fertig: updated / current / unmanaged
await sigSleep(150);
}
}
browser.tabs.onCreated.addListener((tab) => {
refreshComposeSignature(tab.id, tab && tab.type).catch((err) =>
console.error('[Sig] Compose-Refresh fehlgeschlagen:', err));
});
// ── Template insertion ──
browser.runtime.onMessage.addListener((msg, sender, sendResponse) => {

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "HPS Vorlagen & Signaturen",
"version": "2.3.5",
"version": "2.3.6",
"description": "Vorlagen- und Signaturverwaltung für Hotel Park Soltau mit Git-Sync",
"browser_specific_settings": {
"gecko": {

Binary file not shown.