From 3ae740216bbac0b2def4fb3725ef190cb282ed86 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 29 Mar 2026 17:28:46 +0000 Subject: [PATCH] fix: restore missing isInNonChatArea + SKIP_REVEAL_TAGS from unmerged branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause found: commit 9a11896 (v2.0.14) added isInNonChatArea() and expanded SKIP_REVEAL_TAGS with NAV/ASIDE/HEADER/FOOTER, but that commit was on a branch that was never merged into main. When we started our work from main, these fixes were missing. Restored: - isInNonChatArea() function — prevents reveal from touching sidebars, navigation, headers, footers, and other non-chat UI - SKIP_REVEAL_TAGS expanded with NAV, ASIDE, HEADER, FOOTER - isInNonChatArea checks added to revealInElement, unrevealInElement, and highlightMatches (both element-level and walker-level) https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT --- manifest.firefox.json | 2 +- manifest.json | 2 +- package.json | 2 +- src/content/content.js | 13 ++++++++++++- src/options/options.html | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/manifest.firefox.json b/manifest.firefox.json index a27eaab..04b5adc 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "0.9.14", + "version": "0.9.15", "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 95acc09..4c4696e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "0.9.14", + "version": "0.9.15", "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 8a74f3c..0646944 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "silent-send", - "version": "0.9.14", + "version": "0.9.15", "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 df55dbb..1b2c7ef 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -1504,8 +1504,8 @@ function revealInElement(el) { if (SKIP_REVEAL_TAGS.has(el.tagName)) return; if (el.classList?.contains('ss-reveal-badge')) return; - // Never touch contenteditable elements (chat input boxes) if (el.isContentEditable) return; + if (isInNonChatArea(el)) return; const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, { acceptNode(node) { @@ -1513,6 +1513,7 @@ if (parent && SKIP_REVEAL_TAGS.has(parent.tagName)) return NodeFilter.FILTER_REJECT; if (parent?.closest?.('.ss-autodetect-warning, .ss-presend-warning, .ss-reveal-badge')) return NodeFilter.FILTER_REJECT; if (parent?.closest?.('[contenteditable="true"]')) return NodeFilter.FILTER_REJECT; + if (isInNonChatArea(parent)) return NodeFilter.FILTER_REJECT; return NodeFilter.FILTER_ACCEPT; } }); @@ -1532,11 +1533,13 @@ function unrevealInElement(el) { if (SKIP_REVEAL_TAGS.has(el.tagName)) return; if (el.isContentEditable) return; + if (isInNonChatArea(el)) return; const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, { acceptNode(node) { const parent = node.parentElement; if (parent?.closest?.('[contenteditable="true"]')) return NodeFilter.FILTER_REJECT; + if (isInNonChatArea(parent)) return NodeFilter.FILTER_REJECT; return NodeFilter.FILTER_ACCEPT; } }); @@ -1571,6 +1574,7 @@ if (parent && SKIP_REVEAL_TAGS.has(parent.tagName)) return NodeFilter.FILTER_REJECT; if (parent?.closest?.('.ss-autodetect-warning, .ss-presend-warning, .ss-reveal-badge')) return NodeFilter.FILTER_REJECT; if (parent?.closest?.('[contenteditable="true"]')) return NodeFilter.FILTER_REJECT; + if (isInNonChatArea(parent)) return NodeFilter.FILTER_REJECT; return NodeFilter.FILTER_ACCEPT; } }); @@ -1612,8 +1616,15 @@ // Elements to skip when revealing (inputs, scripts, styles, extension UI) const SKIP_REVEAL_TAGS = new Set([ 'SCRIPT', 'STYLE', 'NOSCRIPT', 'IFRAME', 'INPUT', 'TEXTAREA', 'SELECT', + 'NAV', 'ASIDE', 'HEADER', 'FOOTER', ]); + // Skip reveal in navigation, sidebars, headers, and other non-chat UI + function isInNonChatArea(el) { + if (!el) return false; + return !!el.closest('nav, aside, header, footer, [role="navigation"], [role="banner"], [role="complementary"], [data-sidebar], [class*="sidebar"], [class*="Sidebar"], [class*="nav-"], [class*="Nav"], [class*="menu"], [class*="Menu"], [class*="header"], [class*="Header"]'); + } + // Reveal ALL text on the page + apply highlights function revealAllResponses() { const pairs = getRevealPairs(); diff --git a/src/options/options.html b/src/options/options.html index 9bedb4e..548a0d9 100644 --- a/src/options/options.html +++ b/src/options/options.html @@ -629,7 +629,7 @@