browser.runtime.onMessage.addListener(async msg => { if (msg.action !== 'insertTemplate') return; try { const [tab] = await browser.tabs.query({ active: true, currentWindow: true, windowType: 'messageCompose', }); if (!tab) throw new Error('Kein Compose-Fenster gefunden'); const details = await browser.compose.getComposeDetails(tab.id); const isHtmlTemplate = msg.text.includes('<'); // If compose is plain text but template is HTML, switch to HTML mode first if (details.isPlainText && isHtmlTemplate) { await browser.compose.setComposeDetails(tab.id, { isPlainText: false }); } if (details.isPlainText && !isHtmlTemplate) { // Plain text template in plain text mode - use old method const old = details.plainTextBody || ''; const newBody = msg.text + (old ? '\n' + old : ''); await browser.compose.setComposeDetails(tab.id, { plainTextBody: newBody }); } else { // HTML mode: use insertText API to go through the editor's rendering pipeline const htmlContent = isHtmlTemplate ? msg.text : msg.text.replace(/\n/g, '
'); // Move cursor to beginning of body first via script injection await browser.tabs.executeScript(tab.id, { code: ` const editor = document.getElementById('messageEditor'); const editorDoc = editor ? editor.contentDocument : document; const body = editorDoc.body; if (body) { const range = editorDoc.createRange(); range.setStart(body, 0); range.collapse(true); const sel = editorDoc.getSelection(); sel.removeAllRanges(); sel.addRange(range); } ` }).catch(() => { // Fallback: some TB versions structure the editor differently }); // Insert HTML at cursor position - this goes through the editor's render pipeline await browser.compose.insertText(tab.id, htmlContent + '
', { insertAsText: false }); } await browser.notifications.create({ type: 'basic', iconUrl: browser.runtime.getURL('icons/icon.png'), title: 'Vorlage eingefügt', message: 'Erfolgreich', }); } catch (e) { console.error('background.js error:', e); // Fallback: if insertText fails, try setComposeDetails try { const [tab] = await browser.tabs.query({ active: true, currentWindow: true, windowType: 'messageCompose', }); if (tab) { const details = await browser.compose.getComposeDetails(tab.id); const old = details.body || ''; const htmlTpl = msg.text.includes('<') ? msg.text : msg.text.replace(/\n/g, '
'); const bodyIdx = old.indexOf('', bodyIdx) + 1; newBody = old.slice(0, insertAt) + '\n' + htmlTpl + '\n' + old.slice(insertAt); } else { newBody = htmlTpl + '
' + old; } await browser.compose.setComposeDetails(tab.id, { body: newBody }); await browser.notifications.create({ type: 'basic', iconUrl: browser.runtime.getURL('icons/icon.png'), title: 'Vorlage eingefügt', message: 'Erfolgreich (Fallback)', }); } } catch (e2) { console.error('background.js fallback error:', e2); browser.notifications.create({ type: 'basic', iconUrl: browser.runtime.getURL('icons/icon.png'), title: 'Fehler beim Einfügen', message: e2.message, }); } } });