feat(quick-save): background.js fuer Chrome-Worker + Firefox-Event-Page, read-modify-write in Inbox, Badge-Bestaetigung

This commit is contained in:
2026-06-14 10:24:06 +02:00
parent c8ff4dd9d2
commit 17506011c1
+71
View File
@@ -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();
}
});