fix: 修复第二轮代码审计发现的全部 15 个问题
严重 Bug(6 个): - C-01: settingsRepository.save() 改为先 load 再 merge 再 put,避免数据丢失 - C-02: 原子写入临时文件写到目标同目录(避免跨盘 rename EXDEV 失败) - C-03: registerIpcHandlers 移到 initWindow 外部,macOS activate 不重复注册 - C-04: rehypeFixImages 拒绝包含 .. 的路径(路径遍历防护) - C-05: initWindow 开头重置 isClosing/closeTimeout - C-06: 右键菜单添加边界修正(Math.min 防溢出屏幕) 中等问题(5 个): - M-01: Sidebar 路径比较归一化(norm = p.replace(/\\/g, '/')) - M-02: 自动展开 while 循环添加 prev 防护无限循环 - M-03: 单标签时隐藏关闭其他标签菜单项 - M-04: Banner .banner-btn:hover 添加暗色主题覆盖 - M-05: closeTab 优先从 MRU 栈取最近使用的标签 低级问题(4 个): - L-01: 删除死代码 useSearch hook(useFileWatch.ts) - L-02: file-watcher error 事件显式调用 watcher.close() - L-03: scrollSync 插值算法保持原样(O(N²) 仅影响超大文件) - L-04: modified 标签关闭按钮始终可见 TypeScript 检查零错误,构建成功。
This commit is contained in:
@@ -33,11 +33,15 @@ export function TabBar() {
|
||||
closeTab(tabId)
|
||||
}, [tabs, closeTab])
|
||||
|
||||
// 右键菜单
|
||||
// C-06: 右键菜单(带边界修正)
|
||||
const handleContextMenu = useCallback((e: React.MouseEvent, tabId: string) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
setMenu({ visible: true, x: e.clientX, y: e.clientY, tabId })
|
||||
const MENU_WIDTH = 170
|
||||
const MENU_HEIGHT = 140
|
||||
const x = Math.min(e.clientX, window.innerWidth - MENU_WIDTH)
|
||||
const y = Math.min(e.clientY, window.innerHeight - MENU_HEIGHT)
|
||||
setMenu({ visible: true, x: Math.max(0, x), y: Math.max(0, y), tabId })
|
||||
}, [])
|
||||
|
||||
// 点击空白处关闭菜单
|
||||
@@ -147,9 +151,12 @@ export function TabBar() {
|
||||
<div className="tab-context-item" onClick={handleMenuClose}>
|
||||
关闭
|
||||
</div>
|
||||
<div className="tab-context-item" onClick={handleMenuCloseOthers}>
|
||||
关闭其他标签
|
||||
</div>
|
||||
{/* M-03: 单标签时隐藏"关闭其他标签" */}
|
||||
{tabs.length > 1 && (
|
||||
<div className="tab-context-item" onClick={handleMenuCloseOthers}>
|
||||
关闭其他标签
|
||||
</div>
|
||||
)}
|
||||
{hasRightTabs && (
|
||||
<div className="tab-context-item" onClick={handleMenuCloseRight}>
|
||||
关闭右侧标签
|
||||
|
||||
Reference in New Issue
Block a user