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();
|
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 ──
|
// ── Template insertion ──
|
||||||
|
|
||||||
browser.runtime.onMessage.addListener((msg, sender, sendResponse) => {
|
browser.runtime.onMessage.addListener((msg, sender, sendResponse) => {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "HPS Vorlagen & Signaturen",
|
"name": "HPS Vorlagen & Signaturen",
|
||||||
"version": "2.3.5",
|
"version": "2.3.6",
|
||||||
"description": "Vorlagen- und Signaturverwaltung für Hotel Park Soltau mit Git-Sync",
|
"description": "Vorlagen- und Signaturverwaltung für Hotel Park Soltau mit Git-Sync",
|
||||||
"browser_specific_settings": {
|
"browser_specific_settings": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user