dfa5e826f09d

fix: shadow root delegatesFocus so modal focus traps see the popup host as focused instead of an opaque closed-shadow node (v3.6.151)

time
2026-06-03 14:14 UTC · 4 months ago
machine
koh2
agent
claude-opus-4-8
session
inline popup fixes
parent
93a2840e97c4
4 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/content/inject.ts+6 −1
manifest.firefox.json+1 −1
@@ -2,7 +2,7 @@22   "_comment_audio_capture": "Firefox does not honor the Chrome 'audioCapture' optional_permission — getUserMedia in WebExtensions is gated solely by the runtime permission prompt. Microphone access for chirp pairing works from the popup under the existing '<all_urls>' host permission; no manifest entry is required or accepted here.",33   "manifest_version": 3,44   "name": "Peach Password Manager",5-  "version": "3.6.150",5+  "version": "3.6.151",66   "description": "Zero-knowledge password manager",77   "browser_specific_settings": {88     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach Password Manager",4-  "version": "3.6.150",4+  "version": "3.6.151",55   "description": "Zero-knowledge password manager",66   "action": {77     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "3.6.150",3+  "version": "3.6.151",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/content/inject.ts+6 −1
@@ -1336,7 +1336,12 @@13361336   host.style.setProperty("--peach-accent-dim", withAlpha(accentHex, "28"));13371337   host.style.setProperty("--peach-glow", withAlpha(accentHex, "18"));13381338   host.style.setProperty("--peach-border-accent", withAlpha(accentHex, "30"));1339-  const shadow = host.attachShadow({ mode: "closed" });1339+  // delegatesFocus: focus on an internal input (search, inline unlock) makes the1340+  // HOST appear focused to the outside DOM. Modal focus traps that monitor1341+  // focusin then see the host (mounted inside the modal) as the focused element1342+  // rather than an opaque closed-shadow node, so they don't fire their1343+  // "focus escaped" handler and yank focus back. Harmless outside modals.1344+  const shadow = host.attachShadow({ mode: "closed", delegatesFocus: true });13401345 13411346   const style = shadow.appendChild(document.createElement("style"));13421347   style.textContent = SELECTOR_STYLES;

view file