diff --git a/manifest.firefox.json b/manifest.firefox.json index 213277f..f84fde0 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "0.9.30", + "version": "0.9.31", "description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.", "browser_specific_settings": { "gecko": { diff --git a/manifest.json b/manifest.json index 191a30c..e18a5c1 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "0.9.30", + "version": "0.9.31", "description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.", "permissions": [ "storage", diff --git a/package.json b/package.json index b5e9cdd..d69c4aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "silent-send", - "version": "0.9.30", + "version": "0.9.31", "private": true, "license": "MIT", "description": "Browser extension that substitutes personal data before sending to AI services", diff --git a/src/content/content.js b/src/content/content.js index 3a24f8b..93ae82e 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -1076,6 +1076,7 @@ function highlightMatches(root) { if (!hasHighlightAPI) return; + if (!settings.enabled) { hlSubstituted.clear(); hlRevealed.clear(); return; } // Clear previous ranges hlSubstituted.clear(); @@ -1158,7 +1159,7 @@ // Watch for ANY new content on the page function observeResponses() { const observer = new MutationObserver((mutations) => { - if (!hasSubstitutions()) return; + if (!settings.enabled || !hasSubstitutions()) return; // Always schedule highlight refresh for new content (yellow markers) let hasNewContent = false; @@ -1223,21 +1224,22 @@ let revealInterval = null; function checkRevealToggle() { - if (settings.revealMode && !prevRevealMode) { + const effectiveReveal = settings.revealMode && settings.enabled; + if (effectiveReveal && !prevRevealMode) { // Just turned ON — reveal everything existing console.log('[Silent Send] Reveal mode ON'); revealAllResponses(); // Keep re-revealing periodically to catch new/streamed content revealInterval = setInterval(() => { - if (settings.revealMode) revealAllResponses(); + if (settings.revealMode && settings.enabled) revealAllResponses(); }, 2000); - } else if (!settings.revealMode && prevRevealMode) { - // Just turned OFF — restore originals + } else if (!effectiveReveal && prevRevealMode) { + // Just turned OFF (or extension disabled) — restore originals console.log('[Silent Send] Reveal mode OFF'); if (revealInterval) { clearInterval(revealInterval); revealInterval = null; } unrevealAllResponses(); } - prevRevealMode = settings.revealMode; + prevRevealMode = effectiveReveal; } // Hook into config updates to detect reveal toggle @@ -1246,6 +1248,13 @@ if (event.data?.type === 'ss:config-updated') { // Settings were updated — check if reveal mode changed setTimeout(checkRevealToggle, 100); + + // If extension was just disabled, clean up all visual artifacts + if (settings.enabled === false) { + if (hasHighlightAPI && hlSubstituted) { hlSubstituted.clear(); hlRevealed.clear(); } + if (preSendWarningEl) preSendWarningEl.classList.remove('visible'); + if (warningEl) warningEl.classList.remove('visible'); + } } }); @@ -1452,7 +1461,7 @@ } document.addEventListener('input', (e) => { - if (settings.autoDetect === false) return; + if (!settings.enabled || settings.autoDetect === false) return; const target = e.target; if (target.matches?.('[contenteditable], textarea, input[type="text"]')) { // Debounce — don't scan on every keystroke @@ -1462,7 +1471,7 @@ }, true); document.addEventListener('paste', (e) => { - if (settings.autoDetect === false) return; + if (!settings.enabled || settings.autoDetect === false) return; const target = e.target; if (target.matches?.('[contenteditable], textarea, input[type="text"]') || target.closest?.('[contenteditable]')) { @@ -1499,7 +1508,7 @@ updateRevealBadge(); // If reveal mode was already on at page load, reveal everything - if (settings.revealMode && hasSubstitutions()) { + if (settings.enabled && settings.revealMode && hasSubstitutions()) { // Wait for page content to render setTimeout(revealAllResponses, 1000); setTimeout(revealAllResponses, 3000);