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