diff --git a/background.js b/background.js index 2e868c8..4e7a143 100644 --- a/background.js +++ b/background.js @@ -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 = ''; +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); // "--
" + 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) => { diff --git a/manifest.json b/manifest.json index f5a42c9..2c586b2 100644 --- a/manifest.json +++ b/manifest.json @@ -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": { diff --git a/templates-reply-hotel.xpi b/templates-reply-hotel.xpi index c3fcee4..d01d959 100644 Binary files a/templates-reply-hotel.xpi and b/templates-reply-hotel.xpi differ