fix(quick-save): Pending-Queue-Redesign (Blocker 2b) — Worker schreibt eigenen 'quicksave_pending'-Key statt boards, Seite drained in die Inbox; getrennte Schreib-Domaenen, kein boards-Clobber

This commit is contained in:
2026-06-14 14:27:31 +02:00
parent 4897781848
commit 43403bc755
3 changed files with 51 additions and 24 deletions
+8 -7
View File
@@ -46,7 +46,10 @@ function flashBadge(text, color) {
// Interne/nicht speicherbare Seiten (Browser-UI, Extension-Seiten) — kein sinnvolles Bookmark.
const UNSAVEABLE_URL = /^(chrome|chrome-extension|about|edge|opera|moz-extension|brave|vivaldi|view-source|devtools):/i;
// Quick-Save: aktiven Tab lesen, in die Inbox haengen (read-modify-write).
// Quick-Save: aktiven Tab in die Pending-Queue haengen — NICHT boards schreiben.
// Datensicherheit (Phase-4-Review 2b): boards schreibt ausschliesslich die NewTab-Seite. Der Worker
// haengt nur an 'quicksave_pending' an; die Seite drained die Queue in die Inbox. So koennen Worker
// und Seite sich nicht im boards-Array gegenseitig ueberschreiben (kein Lost-Update bestehender Daten).
async function quickSaveActiveTab() {
const tabs = await chrome.tabs.query({ active: true, currentWindow: true });
const tab = tabs && tabs[0];
@@ -56,13 +59,11 @@ async function quickSaveActiveTab() {
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);
// read-modify-write nur auf der EIGENEN Queue (bgGet/bgSet sind via quickSaveChain serialisiert).
const pending = (await bgGet('quicksave_pending')) ?? [];
pending.push({ id: uid(), title: tab.title || tab.url, url: tab.url });
await bgSet('quicksave_pending', pending);
flashBadge(chrome.i18n.getMessage('quickSaveBadge'));
} catch (e) {
// Quota o.ae.: Badge zeigt nichts Gruenes, Fehler in die Worker-Konsole.