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:
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user