Skip to content

fix(renderer): exclude system control buttons from AI interactive click handling - #218

Merged
lioensky merged 1 commit into
lioensky:mainfrom
infinite-vector:fix/interactive-button-event-hijack
Sep 30, 2026
Merged

lioensky merged 1 commit into
lioensky:mainfrom
infinite-vector:fix/interactive-button-event-hijack

Conversation

@infinite-vector

Copy link
Copy Markdown
Contributor

动机与背景

在聊天消息渲染中,工具结果气泡右上方提供的“从上下文中删除此工具结果”按钮(.vcp-tool-result-delete-btn)点击无响应,控制台输出 [ContentProcessor] Button has no text to send。

根因分析

  1. contentProcessor.js 的 processInteractiveButtons 使用宽泛选择器 contentDiv.querySelectorAll('button'),将系统内建的工具栏控制按钮误识别为 AI 交互按钮;
  2. handleAIButtonClick 在入口未做语义校验前无差别调用了 event.stopImmediatePropagation(),导致底层 messageRenderer 上的全局删除委托无法捕获事件;由于系统按钮内仅包含图标 SVG 而无文本,直接抛警告返回,阻断了整个两段式确认与删除流程。

解决方案(双保险设计)

  1. **源头排他性准入过滤:**在 processInteractiveButtons 中加入系统按钮特征检测,明确排除 .vcp-tool-result-delete-btn、.code-copy-btn、.mermaid-viewer-btn 及处于系统工具栏内的按钮,不挂载 AI 交互监听器;
  2. **友善穿透兜底:**重构 handleAIButtonClick,在判定按钮不存在有效发送内容时,静默让出事件处理权,不阻止事件冒泡。

测试验证

  • 运行 node --test tests/content-processor-owner.test.mjs,5/5 项单测全部通过;
  • 真实界面实测:工具结果删除按钮恢复两段式确认(红色“确认删除?”),再次点击可正常删除历史并重绘。

@lioensky
lioensky merged commit 49bf991 into lioensky:main Sep 30, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants