# docs/26 编辑区自绘右键菜单 + WebView 自带菜单屏蔽(补账) ## 先说清一笔旧账 docs/21 §1 写了「App 全局监听 contextmenu 并 preventDefault、编辑区 右键已被屏蔽」,但核查提交 2d1cd30 的实际代码后确认:**那段监听从未 落进代码**,只有文档与提交说明写了。结果就是编辑区右键一直是 WebView 自带菜单——用户再次报回。docs/21 已加勘误。本次把屏蔽与自绘菜单一并 真正实现,并用无头浏览器的真实右键逐项验证(见下)。 ## 实现 1. **全局屏蔽**(App 挂载 effect):document 监听 contextmenu 并 preventDefault;`input / textarea` 豁免(输入框保留系统菜单的拼写 检查与粘贴)。React 的各自定义菜单(标签/文件树/编辑区)在冒泡链 上先于 document 监听打开,不受影响。 2. **编辑区自绘菜单**(新组件 EditorContextMenu):在 .editor-area 上 按事件落点分发——富文本落在 .ProseMirror、源码落在 .source-cm 才 弹出。条目与顶部「编辑/格式」菜单同一套实现: - 剪切 / 复制(无选区禁用,选区状态在打开瞬间从编辑器状态读取, 源码模式经 SourceEditorApi 新增的 hasSelection); - 粘贴(走既有 pasteFromClipboard:富文本经剪贴板读文本插入, 源码聚焦后原生粘贴);全选; - 富文本独有:加粗 / 斜体 / 删除线 / 行内代码 / 超链接…; - 末项模式切换(源码模式 ↔ 即时渲染)。 菜单容器 mousedown 阻止默认行为,焦点与选区留在编辑器里, execCommand 类命令作用准确;位置按窗口尺寸夹取不溢出。 ## 验证 - 无头浏览器真实右键:菜单弹出且条目齐全;无选区时剪切/复制禁用、 全选后可用;点「加粗」选中文本真的变粗;标题栏右键无自绘菜单 (自带菜单已被屏蔽);合成事件核查:编辑区 contextmenu 被 preventDefault、输入框放行。 - 组件测试 2 例(tests/editor-context-menu.test.tsx);vitest 108+2; tsc 0 错误;构建通过。 ## 待真机复验 - WebView2 里右键不再出现自带菜单(拼写检查/检查元素等); - 粘贴在桌面端的剪贴板权限表现(与顶部「编辑 → 粘贴」同一路径)。