diff --git a/src/js/background.js b/src/js/background.js new file mode 100644 index 0000000..aab1540 --- /dev/null +++ b/src/js/background.js @@ -0,0 +1,71 @@ +/* ============================================= + HELLION NEWTAB — background.js + Quick-Save Background fuer Chrome (Service-Worker) + UND Firefox (Event-Page). Kein DOM/window. Listener + synchron auf Top-Level. Geteilte Logik via importScripts. + ============================================= */ + +// Geteiltes DOM-freies Helfer-Modul aus Phase 1: ensureInbox(boards), uid(), +// normalizeBookmark(...). importScripts ist im Service-Worker UND in der +// Firefox-Event-Page verfuegbar. +importScripts('quicksave-core.js'); + +// chrome.storage.local-Lese-/Schreib-Helfer als Promises (kein Store-Modul im Worker, +// das ist DOM/Seiten-gebunden). Identisches Verhalten: get -> Wert oder null. +function bgGet(key) { + return new Promise(resolve => { + chrome.storage.local.get([key], r => resolve(r[key] ?? null)); + }); +} + +function bgSet(key, value) { + return new Promise((resolve, reject) => { + chrome.storage.local.set({ [key]: value }, () => { + if (chrome.runtime.lastError) { + reject(new Error(chrome.runtime.lastError.message)); + return; + } + resolve(); + }); + }); +} + +// Kurze Badge-Bestaetigung, dann automatisch wieder leeren. +function flashBadge(text) { + chrome.action.setBadgeText({ text }); + // Hintergrundfarbe optional, ohne extra Permission moeglich. + if (chrome.action.setBadgeBackgroundColor) { + chrome.action.setBadgeBackgroundColor({ color: '#1f9d55' }); + } + setTimeout(() => chrome.action.setBadgeText({ text: '' }), 2000); +} + +// Quick-Save: aktiven Tab lesen, in die Inbox haengen (read-modify-write). +async function quickSaveActiveTab() { + const tabs = await chrome.tabs.query({ active: true, currentWindow: true }); + const tab = tabs && tabs[0]; + if (!tab || !tab.url) { + flashBadge(chrome.i18n.getMessage('quickSaveNoTab')); + return; + } + + // read-modify-write: aktuellen Stand frisch aus Storage holen, NICHT blind setzen. + const boards = (await bgGet('boards')) ?? []; + const inbox = ensureInbox(boards); + inbox.bookmarks.push(normalizeBookmark({ title: tab.title || tab.url, url: tab.url })); + + try { + await bgSet('boards', boards); + flashBadge(chrome.i18n.getMessage('quickSaveBadge')); + } catch (e) { + // Quota o.ae.: Badge zeigt nichts Gruenes, Fehler in die Worker-Konsole. + console.error('Quick-Save fehlgeschlagen:', e.message); + } +} + +// Listener SYNCHRON auf Top-Level registrieren (Event-Page/Worker-Anforderung). +chrome.commands.onCommand.addListener(command => { + if (command === 'quick-save') { + quickSaveActiveTab(); + } +});