dsh-plugin-open-in-browser:在系统默认浏览器中打开侧栏文件

前言

在 DSH 里用侧栏预览 HTML、PDF 或图片时,内置预览往往够用;但一旦页面依赖 fetch、ES 模块、绝对路径、Service Worker 或真实 origin,沙箱里的 iframe(srcDoc/blob)常会一片空白。有些格式干脆无法预览,侧栏只会显示「无法预览此文件」。换用系统默认浏览器打开,是相对路径资源和 origin 相关 API 最直接的出路。

下面介绍社区插件 dsh-plugin-open-in-browser(维护者 haoqiya138-source):从侧栏标签页芯片的右键菜单,或「无法预览」空状态,一键把当前文件交给系统默认浏览器,而不是继续卡在应用内预览里。

这是什么

dsh-plugin-open-in-browser 是面向 DSH 桌面客户端的 Cordis 插件,npm 包名同为 dsh-plugin-open-in-browser(当前发布版本见 npm 与仓库 package.json)。它不做「用编辑器 / Git GUI 打开」那类泛用入口——DSH 自带的 @deepseek-ai/dsh-host-open-in-app 已覆盖文档预览区的「在应用中打开」。本插件只做一件事:在浏览器里打开侧栏里的工作区文件,并补上标签页菜单入口,以便预览失败时仍能打开文件。

插件在 DSH 社区插件目录 归类为客户端;源码与说明见 GitHub 仓库(MIT 许可证)。

核心功能

一个插件包内注册两个 UI 席位(Seat),对应两种入口:

席位 出现位置 依赖 Host 提供的信息
sidebar.right.tab.document.unpreviewable 「无法预览此文件」空状态 文件的 Host 路径(absolutePath)
sidebar.right.tab.menu.item 侧栏标签页芯片右键菜单 仅标签的 contentId(dsh-resource://file/session/…)

有意未注册 sidebar.right.tab.document.actions。预览正常时,文档区标题栏已有预览自带控件;再在旁边叠一个「在浏览器中打开」收益不大,而标签芯片右键菜单对所有标签都可用,且一步可达。更重要的是:当第三方预览返回错误(例如 HTTP 405)时,内置预览可能读不到完整元数据,文档区没有 absolutePath,但标签菜单仍持有 dsh-resource://… 地址,足以解析、校验并打开文件。

打开流程上,客户端向本插件 Host 半部注册的固定路由发起请求:

POST /dsh-plugin-open-in-browser/open
content-type: application/json

{ "path": "C:\\Users\\me\\project\\preview.html" }
{ "address": "dsh-resource://file/session/<sessionId>/pages/preview.html" }

address 由标签菜单产生:Host 根据 Session 工作区根目录拼接相对路径并做安全校验。成功时返回 { ok: true, mode: "browser" | "association", path };失败为 { ok: false, code } 及 4xx/5xx。

Host 会解析用户实际的默认浏览器(Windows 上经注册表 UserChoice → ProgId → 命令行,并辅以常见安装路径;再不行才回退到系统文件关联)。对图片、PDF 等,内置 session.openWorkspacePath Remote 往往走系统关联(例如 Windows 上用「照片」打开 .png),本插件则明确尽量用浏览器。若 Host 路由不可用(旧版或未部署 Host 半部),客户端会降级调用该 Remote,避免控件完全失效。

安全层在 Host 与客户端两侧共用:绝对路径检查、路径遍历/UNC/设备名拒绝、扩展名白名单、工作区 containment、符号链接逃逸检测,以及 dsh-resource://file/… 地址解析(实现见仓库 src/security.ts)。

安装与启用

发布包已包含预构建产物 dist/,安装无需本地构建,也无运行时 npm 依赖。

从 npm 安装(README 推荐方式):

  1. 打开 DSH → 插件 → 添加插件。
  2. 输入包名 dsh-plugin-open-in-browser。
  3. 完全退出并重新打开 DSH,以便加载新的 Host 半部与客户端产物(模块加载器会缓存客户端 bundle)。

等价地,也可用插件工具安装:

plugin_manager  action=install_bundle  target=dsh-plugin-open-in-browser

若从本地检出目录安装(目录内已含 dist/):

plugin_manager  action=install_bundle  target=<检出目录的绝对路径>

环境要求:需要 DSH 桌面应用(Host 要能启动本机程序)。远程 / SSH 部署没有可启动的桌面浏览器时,控件会明确提示,而不是静默失败。仅从源码构建时需要 Node ≥ 20;日常使用 npm 包不要求本机 Node。

安装、更新或本地重新构建后,同样应完全退出再打开 DSH。

典型用法

  1. 在侧栏打开某个 HTML 标签页;若内置预览空白或报错,在标签页芯片上右键,选择插件提供的在浏览器中打开项(具体文案见插件 locale/zh.json 中的 meta.title)。
  2. 若文件类型无法预览,侧栏显示「无法预览此文件」时,使用空状态上的同一能力(此时使用 absolutePath 入口)。
  3. 系统默认浏览器会打开经校验后的工作区文件路径;复杂 HTML 在真实 origin 下加载相对资源,行为与在 DSH 沙箱预览中不同,属预期现象。

本地开发插件时,README 建议先 npm run build 与 npm test(node:test 覆盖安全层、浏览器解析、Host 路由与客户端 bundle),再通过 install_bundle 指向检出目录验证。

适用场景与注意

适合:需要在真实浏览器里调试侧栏 HTML/静态站;预览 iframe 无法满足的脚本或模块;PDF、图片等在预览失败或你希望统一用浏览器查看时;标签页已打开但文档预览席因元数据错误无法渲染的场景。

不适合或受限:无桌面环境的远程 Session;期望用系统默认「图片查看器」而非浏览器打开时——本插件优先浏览器,与内置 open-in-app 的定位不同,可按需同时安装官方 open-in-app 插件。

安全与信任:插件 Host 半部在 DSH Host 进程内注册 HTTP 路由并启动外部浏览器,路径与地址均经白名单与工作区边界校验,但仍会以当前 DSH 进程权限访问工作区文件。安装前请阅读 源码 与 MIT 许可证,确认符合你的安全策略。社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,插件为社区维护。

结尾

dsh-plugin-open-in-browser 用标签右键和「无法预览」两个入口,把侧栏文件一键交给系统默认浏览器,并针对预览失败、沙箱限制和 OS 文件关联与「用浏览器打开」之间的差异做了专门处理。需要安装或源码时,可访问 社区目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye