From a56038ebef3467a688a23dc3e4f5a932296ba072 Mon Sep 17 00:00:00 2001 From: Codeman maintainer Date: Thu, 22 Oct 2026 19:10:27 +0200 Subject: [PATCH] test(terminal): guard the xterm mouse-service privates touch forwarding reads Merge-time fix for #664: _shouldForwardTouchToApp reads terminal._core.coreMouseService.activeEncoding, an xterm private. The bundle-string loop in test/xterm-private-api.test.ts now checks coreMouseService and activeEncoding too, and both failure messages name _shouldForwardTouchToApp, so an xterm upgrade that renames either field cannot silently stop touch forwarding to native SGR tracking apps. Co-Authored-By: Claude Opus 5.5 (1M context) --- test/xterm-private-api.test.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/test/xterm-private-api.test.ts b/test/xterm-private-api.test.ts index a4eee111..ede5f239 100644 --- a/test/xterm-private-api.test.ts +++ b/test/xterm-private-api.test.ts @@ -49,8 +49,10 @@ describe('xterm private-API dependency guard', () => { 'xterm moved off the verified version — re-verify _kickRenderer in a real browser ' + '(terminal-ui.js: _core._renderService._renderDebouncer._animationFrame) AND the ' + 'CompositionHelper fields installEditSync() uses (terminal-keycode229-recovery.js: ' + - '_handleAnyTextareaChanges, _coreService, _isComposing, _isSendingComposition, _dataAlreadySent), ' + - 'then update VERIFIED_XTERM_VERSION here. The accessor is optional-chained, so a renamed field ' + + '_handleAnyTextareaChanges, _coreService, _isComposing, _isSendingComposition, _dataAlreadySent) ' + + 'and the mouse-encoding read _shouldForwardTouchToApp makes (terminal-ui.js: ' + + '_core.coreMouseService.activeEncoding), then update VERIFIED_XTERM_VERSION here. ' + + 'The accessor is optional-chained, so a renamed field ' + 'degrades to a silent no-op and the freeze it heals comes back unnoticed.' ).toBe(VERIFIED_XTERM_VERSION); }); @@ -60,9 +62,12 @@ describe('xterm private-API dependency guard', () => { // append-only diff duplicates). It reaches `_compositionHelper`, `_coreService`, `_isComposing`, // `_isSendingComposition` and `_dataAlreadySent`; if xterm renames any of them the install quietly // falls back to xterm's own handler and the duplication returns (or, for `_isSendingComposition`, a - // composition xterm finalizes at an Enter keydown is sent twice). Property names survive + // composition xterm finalizes at an Enter keydown is sent twice). terminal-ui.js's + // _shouldForwardTouchToApp reads `_core.coreMouseService.activeEncoding` to forward a touch drag + // only to an app that asked for SGR mouse reports; if either name changes the read is undefined + // and touch quietly stops forwarding to native SGR tracking apps. Property names survive // minification, so a string check on the shipped bundle catches a rename on upgrade. - it('still ships the composition-helper fields the edit-based 229 sync depends on', () => { + it('still ships the composition-helper and mouse-service fields terminal input depends on', () => { const bundle = readFileSync(resolve(root, 'node_modules/@xterm/xterm/lib/xterm.js'), 'utf8'); for (const name of [ '_handleAnyTextareaChanges', @@ -71,11 +76,14 @@ describe('xterm private-API dependency guard', () => { '_isComposing', '_isSendingComposition', '_dataAlreadySent', + 'coreMouseService', + 'activeEncoding', ]) { expect( bundle, `xterm no longer mentions ${name}: re-verify terminal-keycode229-recovery.js installEditSync() ` + - '(src/web/public) against the new CompositionHelper before bumping VERIFIED_XTERM_VERSION' + 'against the new CompositionHelper, and terminal-ui.js _shouldForwardTouchToApp against the ' + + 'new CoreMouseService (both in src/web/public), before bumping VERIFIED_XTERM_VERSION' ).toContain(name); } });