Skip to content

[BUG] 移动端 fileGuard 拦截 DSH 0.1.5 的文件链接,官方右侧栏无法经「点文件」打开 #123

Description

@yanzhaohui1999

环境

与 #122「移动端样式误隐藏宿主右侧栏展开按钮」相同:DSH 0.1.5-rc.1 + dsh-pocket 2.10.4 / 2.10.6 / main HEAD ffe894e8(三份代码逐字节一致,均有此表现),视口 390×844。

现象

手机端点击聊天里的文件路径,只弹出 toast「手机上无法直接打开电脑上的文件」,原生右侧栏不打开。

原因分析(推测)

client/mobile/fileGuard.ts:105-115(main 同):

const onClick = (event: MouseEvent): void => {
  const target = event.target as HTMLElement | null
  if (target === null) return
  const el = target.closest('button, a') as HTMLElement | null
  if (el === null) return
  if (!looksLikeFilePath(el.textContent)) return   // ← 只看文案像不像路径
  event.preventDefault()
  event.stopImmediatePropagation()
  showToast(GUARD_MSG)
}
document.addEventListener('click', onClick, true)   // ← 捕获阶段

这套守卫是按旧行为写的(同文件顶部注释原文:「dsh-web 在手机上点『文件链接』会触发桌面端 workspaces.openPath(open <path>),既打不开(文件在电脑上),又会抛 "path open failed"」)。但 DSH 0.1.5 起,聊天里的文件打开改走 ctx.sidebarRight.openResource(...)——直接打开原生右侧栏(窄屏自动全屏),不再调用 workspaces.openPath,那条"会报 path open failed"的前提看起来已经不再成立。

而守卫的判定是「文本像文件路径的 button/a」,所以 0.1.5 的文件链接也会被一并拦下。

复现证据

移动层生效时点击文件链接 .sidebar-route-demo/takeover-probe.md:只出现 toast,右侧栏不打开。

DOM 实测:[data-shell-overlay] 父元素的 data-rightbar-collapsed 仍为 true,右侧栏面板 rect 停在 x=390(视口外)。

Image

反证:换 ?dsh-layout=desktop 跳过移动层后,点同一条链接,面板移到 x=0 铺满 390×844 视口,原生右侧栏正常打开并渲染文件正文,无 toast。

Image

一点建议

供参考:

  • 或许可以只拦真正会调 workspaces.openPath 的旧路径,对 0.1.5 的 dsh-resource:// 资源链接放行(判据看链接地址 / 宿主标记,可能比按按钮文案正则更准)。
  • 旁挂的「复制」按钮挺好用的,保留它应该没问题;只是它作为附加能力,可能不必 preventDefault 掉打开动作。

附加说明

本条与 #122 叠加后,手机端进入官方右侧栏的两条路径都会受影响:header 里的手动展开按钮被 display: none 隐藏,点文件链接又被守卫拦下。修掉任意一条都能恢复可用,如果方便的话可以一并看一下。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions