Repository navigation
fix(desktop): HTML 预览的“在浏览器中打开”交给默认浏览器 - #1928
Merged
Merged
Conversation
预览栏的“在浏览器中打开”原来拼出 file:// 地址交给 app.OpenURL, Viva 只接受 http、https、mailto,于是总是报错。改为调用 Viva 新增的 app.OpenPathInBrowser:交给默认浏览器(打开 http 链接的应用), 不跟随 .html 的文件关联,与旧客户端一致。 - 在后台调用,macOS 上要等 open 报告结果,不阻塞窗口线程。 - 失败时记录 app.operation_failed(operation=editor_open_in_browser), 并在日志目录测试里登记。 - 回归测试断言文件交给了 LastOpenedInBrowser,既不是 OpenPath 也不是 OpenURL。 依赖 Lithe-IDEA/Lithe-viva#18(上游 vivaui/viva#272)合入 fork main 后升级 desktop/go.mod 的固定版本,在此之前本分支编译不过。
…n-browser-local-file
desktop/go.mod 的 replace 从 fork main 609dd47 升到 4829f2b, 多出两项补丁: - Lithe-IDEA/Lithe-viva#17:wmSetTitle 改用 0x8053,修复 #16 合入上游 后与 wmSetSize 撞号导致的 Windows 编译失败。补的是 fork 独有的 Window.SetTitle,上游没有对应 PR。 - Lithe-IDEA/Lithe-viva#18:新增 app.OpenPathInBrowser,上游 PR 为 vivaui/viva#272。 require 仍是上游基线 b63e4a0,没有变化。 功能矩阵 embedded-viewers:Viva 的“在浏览器中打开”写明交给默认网页 浏览器、不跟随 .html 的文件关联,并注明 Windows 需实机确认;证据补上 browser_preview.go 及其测试,自动回归的 -run 加上 OpenInBrowser。
与设置页链接和修复前的行为一致:打开失败时只记录 app.operation_failed 和提示,不再同时记一条已执行的操作。
xiaoyumuxi
marked this pull request as ready for review
November 14, 2026 13:38
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
关联 Issue / Linked issue
submit-lithe-issue的规则,修复请求不等于授权建缺陷单,所以没有单独建;需要时可以补建。4829f2b;上游 PR feat(app): open a local file in the default browser vivaui/viva#272)PR 类型 / Type
改动说明 / What changes
背景 / Why
在 HTML 文件的预览栏点“在浏览器中打开”,总是弹出“无法在浏览器中打开文件:app: external URL must use http, https, or mailto”,浏览器不会打开。
原实现把磁盘路径拼成
file://地址交给app.OpenURL,而 Viva 的OpenURL只接受 http、https、mailto。旧客户端(macOSMacHTMLBrowserOpener、Windowshtml_browser.rs)的语义是:把文件交给默认网页浏览器(打开 http 链接的那个应用),而不是.html的文件关联,后者常常是一个编辑器。app.OpenPath跟随文件关联,不符合要求。按 Viva 维护规则,在 fork 里新增 API 并向上游提 PR,Lithe 应用层不写绕过代码。改动 / Changes
“在浏览器中打开”(
desktop/internal/workbench/browser_preview.go)openInBrowser改为调用 Viva 新增的app.OpenPathInBrowser(path),把磁盘文件交给默认网页浏览器,不跟随.html的文件关联。有未保存的修改时仍先保存,这部分逻辑没变。open报告结果)。app.operation_failed(operation=editor_open_in_browser,错误经documentLogError处理,不带路径),并沿用原有的失败提示词条desktop.editorMenu.openInBrowserFailed。原来失败时没有记日志。app.action.performed(editor.openInBrowser)和以前一样,只在成功打开后记录。file://地址的代码和 Windows 盘符特判,以及随之不再需要的net/url引用。测试
browser_preview_test.go:新增回归测试TestOpenInBrowserGivesTheFileToTheDefaultBrowser。先编辑 HTML,再点预览栏按钮,断言四件事:编辑已经保存;文件交给了Driver.LastOpenedInBrowser;既没有走OpenPath(文件关联),也没有走OpenURL;没有任何提示。logevents_test.go:在TestLogEventsMatchCatalog里登记editor_open_in_browser,确认 Core 日志目录接受这条事件。Viva 固定版本(
desktop/go.mod、desktop/go.sum)replace从 fork main609dd47升到4829f2b(github.com/Lithe-IDEA/viva v0.6.3-0.20261114132607-4829f2bdde18)。require的上游基线b63e4a0不变。wmSetTitle改用0x8053。fork #16 合入上游后,它和上游新增的wmSetSize撞号,Windows 编译失败(duplicate case wmSetTitle),会让本仓库的 Windows 构建同样失败Window.SetTitle(fork #1),上游没有这个 APIapp.OpenPathInBrowser、app.ErrNoBrowser、Driver.LastOpenedInBrowserOpenPathInBrowser在各平台找默认浏览器的方式(实现都在 fork 里,列出来方便评审):NSWorkspace URLForApplicationToOpenURL:(以 https 地址为探针)找到默认浏览器,再用/usr/bin/open -a <浏览器> <文件>打开。AssocQueryString查 http 协议的打开命令,代入文件的file:///地址后启动。xdg-settings get default-web-browser,或用xdg-mime查x-scheme-handler/https,找到 desktop 文件后按其Exec启动。app.ErrNoBrowser,界面显示失败提示。功能矩阵(
shared/platform-feature-matrix/features/embedded-viewers.json).html的文件关联;把.html的默认打开程序改成文本编辑器后,仍在浏览器里打开;没有默认浏览器时提示失败原因;Windows 需实机确认能按 http 协议找到默认浏览器。browser_preview.go和browser_preview_test.go;自动回归命令的-run加上OpenInBrowser。其他
preview(0f95f4765,含 fix(desktop): 设置侧栏没有展开箭头的页面图标与分组图标对齐 #1924、fix(desktop): 状态栏内存详情按进程归属统计并重新排版 #1926),用 merge,不改写已推送的历史。不在本 PR 范围内 / Out of scope
Windows 实机验证(找默认浏览器,中文、空格、
#文件名)没有做,矩阵两端保持pending。fork CI 的native (windows-latest)、cross-vet、windows-arm64-text已在 feat(app): open a local file in the default browser Lithe-IDEA/Lithe-viva#18 上通过。fork CI 的
size、web、windows-materials在 feat(app): open a local file in the default browser Lithe-IDEA/Lithe-viva#18 上失败,但 fork main(609dd47)和上游 vivaui/viva 的 main 也以同样的原因失败,都是上游的增量更新(delta updates)带进来的:size:hello darwin/arm64 已超出限制约 332 KB,feat: add editor tab layout modes and reordering #18 只多了 176 B。web和windows-materials:update 包报os "js"/"windows" has no patch support,另外 Windows 上 TempDir 清理时文件被占用。与本改动无关,等上游修复后会随同步消失。
fork 的
Window.SetTitle(fork 优化建议 #1)一直没有上游 PR。fork 的同步和补丁清理由维护团队负责,本 PR 不处理。类型专属:fix
复现与根因
.html文件,在预览栏点“在浏览器中打开”。0faecba49)迁移到 Viva 时,把文件拼成file://地址交给app.OpenURL,而 Viva 的OpenURL只接受 http、https、mailto(git log -S 'file://' -- desktop/internal/workbench/browser_preview.go)。检查项
desktop/internal/workbench/browser_preview_test.go的TestOpenInBrowserGivesTheFileToTheDefaultBrowser。把browser_preview.go换回preview上的版本后运行,失败输出如下:openInBrowser只由预览栏按钮调用。openURL/app.OpenURL的其他调用方(Markdown 和悬停链接、设置页链接、终端链接、插件browser/openExternal)传的都是 http、https 或 mailto 地址,不受影响。file://交给openURL的地方:document_links.go的file://目标是在编辑器里打开。native (windows-latest)上编译并通过测试,实机验证见“不在本 PR 范围内”。.agents/notes/implemented/bug-fix/记录:“交给默认浏览器,不跟随文件关联”这条约束已经写进代码注释和功能矩阵的验证动作,回归测试也同时断言不走OpenPath、不走OpenURL,复发会被测试拦住。范围检查 / Scope checks
功能矩阵 / Feature matrix
shared/platform-feature-matrix/features/embedded-viewers.json:Viva 部分的验证动作、两端证据和自动回归命令;两端的实现和验证状态如实保持partial/pending。./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh(189 项能力通过)和./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD(通过)。.artifacts/下生成的矩阵视图。插件归属 / Plugin ownership
develop-lithe第三节“插件归属与宿主零依赖”的自查命令,rg结果为空。browser/openExternal行为不变。统一日志系统 / Structured logging
app.operation_failed,经operationFailedFields记录;成功时沿用已有的app.action.performed。TestLogEventsMatchCatalog开着目录校验,确认这两条都能被接受。app.action.performed,失败记录app.operation_failed;错误只在窗口线程的结果回调里记录一次。documentLogError处理,去掉了路径。scripts/logging/)已移除,等价检查还没恢复,所以日志门禁记为未完成。目前只有上面的目录校验测试。界面文案 / i18n
desktop.editorMenu.openInBrowserFailed。node scripts/i18n/verify-app-language-localization.mjs(通过)和node scripts/i18n/generate-i18n.mjs --check(中英 11147/11147 完整)。逻辑归属 / Logic placement
性能与内存 / Performance and memory
设置 / Settings
N/A:没有改设置。
插件契约 / Plugin contract
N/A:没有改契约、宿主方法或 Core 固定版本。
发行包与资源 / Bundle and resources
N/A:没有新增运行时资源。仍然运行了
./scripts/desktop/verify/verify-runtime-bundle-immutability.sh,macOS 和 Windows 源码的静态检查都通过。无用代码与重构 / Dead code and refactoring
file://地址、Windows 盘符特判和net/url引用,在本次改动后都没用了,已在本 PR 删除。验证 / Verification
./scripts/desktop/desktop-go.sh test ./...(固定版本指向与4829f2b同一棵树的a788c6c,两者 tree 都是939d8de)./scripts/desktop/desktop-go.sh test ./internal/workbench -count=1(调整performed位置后,固定版本4829f2b)./scripts/desktop/desktop-go.sh test ./internal/workbench -race -run 'OpenInBrowser|HTML|LogEventsMatchCatalog|Viewer|SVG' -count=1browser_preview.go换回preview版本)./scripts/desktop/desktop-go.sh vet ./internal/workbench、gofmt -l./scripts/desktop/desktop-go.sh --exec go run github.com/vivaui/viva/cmd/viva vet ./..../scripts/desktop/generate-desktop-icons.sh、./scripts/desktop/generate-desktop-file-icons.shicons.go、icons_tree.go逐字节一致./.agents/skills/write-stable-tests/scripts/verify-test-stability.sh./scripts/agent-notes/verify-agent-notes.shverify-runtime-bundle-immutability.shgo vet(windows/amd64、windows/arm64、linux/amd64、darwin)和go test ./app ./internal/platform/...(#17 + #18 合并后)a788c6c):native(macOS、Ubuntu、Windows)、cross-vet、windows-arm64-text、darwin、lint、testsize、web、windows-materials失败,原因与 fork main、上游 main 相同未能执行的检查和原因:
#文件名,没有默认浏览器时的提示):当前机器是 macOS,没有在 Windows 上运行。4829f2b后没有在整机里重新手动点击:它的代码树与手动验证时一致,但手动验证用的是本地 fork 源码。提交前确认 / Final checks
preview创建,并合入了最新的preview;目标分支:preview.build/、target/、dist/、.artifacts/等产物,没有凭据、个人路径和未脱敏的日志或截图