Skip to content

fix(mobile): 文件守卫改到冒泡阶段,不再吞掉应用自己的预览点击(#152) - #153

Open
yanzhaohui1999 wants to merge 1 commit into
shaobeichen:mainfrom
yanzhaohui1999:fix/mobile-file-guard-bubble-phase
Open

yanzhaohui1999 wants to merge 1 commit into
shaobeichen:mainfrom
yanzhaohui1999:fix/mobile-file-guard-bubble-phase

Conversation

@yanzhaohui1999

Copy link
Copy Markdown

修复 #152。

问题

手机(窄屏移动布局)上点文案是路径的文件链接(如 dsh-tablet-apk-20260926/build/ic_launcher_512.png),只会弹「手机上无法直接打开电脑上的文件」,右栏预览打不开;同一类链接只要文案不含斜杠(label 写成「点我」,或 fileGuard.ts:1-13 这种)就能正常预览。

根因

守卫注册在捕获阶段并且 stopImmediatePropagation():

document.addEventListener('click', onClick, true)
// onClick:event.preventDefault(); event.stopImmediatePropagation(); showToast(GUARD_MSG)

所以 dsh-web 自己的处理器拿不到事件。而 dsh-web 本来就该优先处理:

  • dsh-context 文件行:onClick: (ev) => { ev.stopPropagation(); if (previewable && props.onPreview?.(e) === true) return; if (abs !== void 0) props.onOpen?.(abs); }
  • dsh-client-ui-reference 的 openReference():ctx.sidebarRight.openResource(...)

判据 looksLikeFilePath(el.textContent) 本身没问题,问题只是它不该在应用之前动手。

改法

  1. 监听器改到冒泡阶段注册,并在 event.defaultPrevented 时早退 → 应用处理过的点击不再被吞;
  2. 去掉 stopImmediatePropagation(),保留 preventDefault()(仍能挡住裸 <a href> 的导航);
  3. 「复制」按钮注入、toast、隐藏「添加工作区」全部不变;
  4. 同步 client/client.js(node client/build.mjs)与 test/file-guard.test.js 的断言(原来断言产物必须含 stopImmediatePropagation,现改为断言冒泡注册 + defaultPrevented 早退 + 不再吞事件)。

验证

  • 把改动前的 startFileGuard 原样抽出来放进干净页面,用 headless Chrome 各点一次(装上模拟 dsh-web 处理器的冒泡监听):

    被点元素(文案) 应用处理器跑到 到达冒泡 提示
    button …/build/ic_launcher_512.png(改动前) 否 否 是
    button 点我(改动前) 是 是 否
    同上第一个(改动后) 是 是 否
  • npm test:179 个用例,178 pass / 1 fail;唯一失败是 test/file-read.test.js 往 $HOME 写临时文件被本机沙箱拒绝(EPERM: /Users/y/pocket-fr-home-*.txt),在未改动的干净检出上同样失败,与本次改动无关。

取舍

兜底保留了:应用没处理(真的会去调桌面端 open)时仍然弹提示,这正是 #17 想要的效果。

唯一的边界情况:若某个链接应用处理了、但既不 preventDefault 也不 stopPropagation,兜底会多弹一次提示。当前 dsh-context 的文件行是 stopPropagation()(dsh-client-ui-reference 走的是同一套右栏预览),所以不受影响;如果后续发现别处会这样,可以再收窄判据。

捕获阶段 + stopImmediatePropagation() 会在 dsh-web 自己的处理器之前把点击吃掉,
于是所有「文案像路径」的文件链接都只剩提示、右栏预览打不开(而文案不含斜杠的同类
链接正常)。

改为冒泡阶段注册 + event.defaultPrevented 早退:应用能处理(预览优先)时让它处理,
只有应用没管、真会去调桌面端 open 时才弹提示兜底。复制按钮注入保持不变。

Refs shaobeichen#152
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.

1 participant