perf(editor): reduce long-document decoration work and fix fold navigation

This commit is contained in:
2026-09-06 14:30:56 +08:00
parent 750e17212e
commit 874e916106
23 changed files with 9398 additions and 54 deletions
@@ -1,5 +1,5 @@
// @vitest-environment happy-dom
import { expect, it } from 'vitest'
import { expect, it, vi } from 'vitest'
import { installCodeBlockLabels } from './codeBlockLabels'
it('keeps footer labels in sync when the language changes and stops after disposal', async () => {
@@ -16,3 +16,21 @@ it('keeps footer labels in sync when the language changes and stops after dispos
await new Promise(resolve => setTimeout(resolve, 0))
expect(block.dataset.languageLabel).toBe('TypeScript')
})
it('ignores code text mutations and discovers newly inserted code blocks', async () => {
const root = document.createElement('div')
root.innerHTML = '<div class="milkdown-code-block"><button class="language-button">Python</button><div class="cm-content">old</div></div>'
const dispose = installCodeBlockLabels(root)
const scan = vi.spyOn(root, 'querySelectorAll')
try {
root.querySelector('.cm-content')!.textContent = 'new code'
await new Promise(resolve => setTimeout(resolve, 0))
expect(scan).not.toHaveBeenCalled()
const block = document.createElement('div')
block.className = 'milkdown-code-block'
block.innerHTML = '<button class="language-button">Rust</button>'
root.append(block)
await new Promise(resolve => setTimeout(resolve, 0))
expect(block.dataset.languageLabel).toBe('Rust')
} finally { dispose(); scan.mockRestore() }
})