mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-09 00:49:41 +02:00
fix(review): content-free IME traces, guarded onData self-heal, Android-only retap recovery (PR #143)
- BLOCKER (privacy): the CJK diagnostic trace logged typed CONTENT — _esc(e.key) per keystroke, up to 24 chars of textarea value on focus/blur/compstart/ compend/input, and the flushed text — mirrored into _crashDiag, which persists to localStorage and beacons to POST /api/crash-diag. Traces are now content-free: key CLASS via _kdesc (any single code point → 'printable', named keys pass through), value lengths + phantom presence via _vdesc (len=N[+ph]), and 'flush send len=N'. _esc removed. - MAJOR: the onData self-heal refocused the CJK field whenever gated data arrived with focus elsewhere — but onData also fires for xterm's SELF-GENERATED query replies (DA/DSR/CPR/OSC during Ink redraws), so it stole focus from rename/search/settings inputs while output streamed. Now requires document.activeElement === this.terminal.textarea (genuine typed input) and bails when shouldSuppressTerminalQueryResponse(data) matches. - MAJOR: the pointerdown blur→setTimeout(focus,0) wedged-IME recovery ran on ALL platforms; on iOS tapping the focused empty field is normal and the async refocus is outside the user-gesture stack. The listener is now only registered when /Android/i.test(navigator.userAgent). - tests: trace-privacy test (no typed character or textarea value ever appears in the trace; lengths/key classes still recorded), iOS harness asserts the pointerdown recovery never cycles, self-heal source guard asserts both new conditions; vm harness gained a ua option (navigator injected, Android UA default so the existing wedged-IME test still exercises the recovery). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -652,8 +652,17 @@ Object.assign(CodemanApp.prototype, {
|
||||
// typed lands HERE and is swallowed — keyboard shows the IME composing
|
||||
// while both the CJK field and the terminal stay empty. Route focus
|
||||
// back so the very next keystroke lands in the CJK field again.
|
||||
// Only GENUINE typed input qualifies: onData also fires for xterm's
|
||||
// self-generated query replies (DA/DSR/CPR/OSC during Ink redraws),
|
||||
// which arrive no matter what has focus — so require focus to be on
|
||||
// xterm's own textarea and bail on query replies, or this would steal
|
||||
// focus from the rename/search/settings inputs while output streams.
|
||||
const cjkEl = document.getElementById('cjkInput');
|
||||
if (cjkEl?.classList.contains('cjk-input-visible') && document.activeElement !== cjkEl) {
|
||||
if (
|
||||
cjkEl?.classList.contains('cjk-input-visible') &&
|
||||
document.activeElement === this.terminal.textarea &&
|
||||
!window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(data)
|
||||
) {
|
||||
_crashDiag.log('CJK regain-focus (onData swallowed input)');
|
||||
cjkEl.focus();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user