⚡ perf(vscode): 预览切走标签页时页面留着,切回来不再重新生成、重发文档和整份重画

This commit is contained in:
cruldra committed 2026-10-13 13:17:22 +11:00
1 parent 53283808a0
commit 5426c50cd9
8 files changed
+118 -59

No files matched your search

@@ -9,7 +9,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { App } from './App'
import { createViewStateStore } from './viewState'
/** 扩展端那头:页面发出去的消息、页面挂着的收消息回调,以及 webview 自己存的状态(标签页切回来页面重新加载时还在) */
/** 扩展端那头:页面发出去的消息、页面挂着的收消息回调,以及 webview 自己存的状态(页面重新加载时还在) */
const host = vi.hoisted(() => ({
posted: [] as unknown[],
listeners: new Set<(msg: unknown) => void>(),
@@ -99,7 +99,7 @@ afterEach(async () => {
vi.unstubAllGlobals()
})
describe('标签页切走再切回来,调用树弹框照旧开着', () => {
describe('页面重新加载后,调用树弹框照旧开着', () => {
it('弹框开着、选了第二个入口:页面重新加载拿到文档后重新打开那块、要它的树,停回第二个入口;关掉后再加载就不开了', async () => {
await load()
await deliver(documentOf(3, [block('0', 'mask_phone')]))
@@ -127,7 +127,7 @@ describe('标签页切走再切回来,调用树弹框照旧开着', () => {
expect(host.posted).not.toContainEqual(expect.objectContaining({ type: 'openCallTree' }))
})
it('页面重新加载前切走、文档还没到又切走一次,记着的弹框还在', async () => {
it('重新加载后文档还没到,页面又重新加载了一次:记着的弹框还在', async () => {
saved = { editing: [], folds: {}, callTree: { anchor: 'mask_phone', entry: 1 } }
await load()
await unload()
@@ -50,7 +50,7 @@ function record(reportedLine: { current: number | undefined }): void {
/**
* 记住并恢复预览看到的位置:
* ① 滚动时把视口顶部那块记进 webview 状态,页面因标签页切走被重新加载后照着滚回去;
* ① 滚动时把视口顶部那块记进 webview 状态,页面重新加载后(VS Code 重启后恢复标签页、webview 进程崩了重建)照着滚回去;
* ② 同时把那块的起始行报给扩展端,切回文本编辑器时把这行放到顶部。
* 第一份文档带 reveal(刚从文本编辑器切过来、跳到定义)时不恢复,交给 useReveal 滚。
*/
@@ -2,7 +2,7 @@ import type { ScrollAnchor } from './scrollPosition'
import type { BlockView, OpenedFrom } from './types'
/**
* 标签页切走时 VS Code 会销毁 webview、切回来重新加载,靠它恢复:哪些块停在「编辑」、
* 页面重新加载(webview 进程崩了重建、开发者重载 webview)时靠它恢复(标签页切走时页面一直留着,用不上它):哪些块停在「编辑」、
* 用户把哪些块、属性行和子行折叠 / 展开了(块 id 是它在树里的位置,文档刷新后照旧对得上;属性行、子行 id 见 [propertyRowId]、[propertyItemId]),滚到了哪,
* 以及开着哪一块的调用树弹框、选中第几个入口。
* VS Code 重启后恢复标签页时也带着它,这个标签页是从哪儿打开的靠它报回扩展端。