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
↓ peach-browser-dfa5e826.tar.gzatlas at this save
files changed4 files
manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/content/inject.ts+6 −1manifest.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": {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",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": {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;