feat(quick-save): background.js fuer Chrome-Worker + Firefox-Event-Page, read-modify-write in Inbox, Badge-Bestaetigung
This commit is contained in:
@@ -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();
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user