diff --git a/src/js/opera/background.js b/src/js/opera/background.js index 2e24644..8498d56 100644 --- a/src/js/opera/background.js +++ b/src/js/opera/background.js @@ -38,12 +38,26 @@ chrome.tabs.onActivated.addListener((activeInfo) => { // Pfad ist relativ zu DIESER Datei (src/js/opera/), daher ../quicksave-core.js. importScripts('../quicksave-core.js'); +// 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; + +// Re-Entry-Schutz: ein zweiter Quick-Save waehrend der erste laeuft wuerde read-modify-write +// rennen (lost update). Bei aktivem Save den zweiten Druck verwerfen. +let qsBusy = false; + function quickSaveActiveTab() { + if (qsBusy) return; + qsBusy = true; chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { const tab = tabs && tabs[0]; - if (!tab || !tab.url) { - chrome.action.setBadgeText({ text: chrome.i18n.getMessage('quickSaveNoTab') }); + if (!tab || !tab.url || UNSAVEABLE_URL.test(tab.url)) { + // Kein speicherbarer Tab: kurzer roter Marker (langer Text wird im Badge abgeschnitten). + chrome.action.setBadgeText({ text: '×' }); + if (chrome.action.setBadgeBackgroundColor) { + chrome.action.setBadgeBackgroundColor({ color: '#c0392b' }); + } setTimeout(() => chrome.action.setBadgeText({ text: '' }), 2000); + qsBusy = false; return; } // read-modify-write: aktuellen boards-Stand frisch holen, anhaengen, zurueckschreiben. @@ -54,6 +68,7 @@ function quickSaveActiveTab() { chrome.storage.local.set({ boards }, () => { if (chrome.runtime.lastError) { console.error('Quick-Save fehlgeschlagen:', chrome.runtime.lastError.message); + qsBusy = false; return; } chrome.action.setBadgeText({ text: chrome.i18n.getMessage('quickSaveBadge') }); @@ -61,6 +76,7 @@ function quickSaveActiveTab() { chrome.action.setBadgeBackgroundColor({ color: '#1f9d55' }); } setTimeout(() => chrome.action.setBadgeText({ text: '' }), 2000); + qsBusy = false; }); }); });