From c8fe5d4b96956fe3a5ce339599bb0c8850b467d1 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Wed, 28 Oct 2026 17:41:37 -0700 Subject: [PATCH] perf(editor): skip Markdown classification beyond the hard render cap (#34798) Above the 1 MiB override cap a Markdown file can never render rich, so skip the unsupported-syntax scan and keep those documents out of the eligibility cache. Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../markdown-rich-mode-eligibility-cache.ts | 5 +++++ .../editor/markdown-rich-mode.test.ts | 19 +++++++++++++++++++ .../components/editor/markdown-rich-mode.ts | 9 ++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts b/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts index f756ce786f8..f45afd6aba2 100644 --- a/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts +++ b/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts @@ -4,6 +4,7 @@ import { type MarkdownRichModeEligibility, type MarkdownRichModeEligibilityDecision } from './markdown-rich-mode' +import { exceedsMarkdownRenderOverrideSizeLimit } from './markdown-rich-size-limit' type EligibilityCacheEntry = { content: string @@ -46,6 +47,10 @@ function getCachedMarkdownRichModeEligibilityDecision(params: { } const decision = getMarkdownRichModeEligibilityDecision({ content, sizeOverridden }) + // Don't retain hard-cap documents; checked after lookup so cache hits skip the UTF-8 probe. + if (decision.exceedsSizeLimit && exceedsMarkdownRenderOverrideSizeLimit(content)) { + return decision + } entries.unshift({ content, sizeOverridden, decision }) if (entries.length > MAX_ENTRIES) { entries.length = MAX_ENTRIES diff --git a/src/renderer/src/components/editor/markdown-rich-mode.test.ts b/src/renderer/src/components/editor/markdown-rich-mode.test.ts index 82f90904328..335f8938728 100644 --- a/src/renderer/src/components/editor/markdown-rich-mode.test.ts +++ b/src/renderer/src/components/editor/markdown-rich-mode.test.ts @@ -1,5 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import * as roundTrip from './markdown-round-trip' +import { MARKDOWN_RENDER_OVERRIDE_MAX_SIZE_BYTES } from './markdown-rich-size-limit' import { RICH_MARKDOWN_MAX_SIZE_BYTES } from '../../../../shared/constants' import { getMarkdownRichModeEligibility, @@ -207,6 +208,24 @@ describe('getMarkdownRichModeUnsupportedMessage', () => { unsupportedMessage: expect.any(String) }) }) + + it.each([false, true])( + 'reports only the size limit beyond the hard render cap, override=%s', + (sizeOverridden) => { + const content = `${'a'.repeat(MARKDOWN_RENDER_OVERRIDE_MAX_SIZE_BYTES)}\n[ref]: /docs\n` + + const result = getMarkdownRichModeEligibility({ content, sizeOverridden }) + expect(result).toEqual({ + exceedsSizeLimit: true, + unsupportedMessage: null + }) + + expect( + getMarkdownRichModeEligibility({ content: '[ref]: /docs', sizeOverridden }) + .unsupportedMessage + ).not.toBeNull() + } + ) }) const decide = (content: string) => diff --git a/src/renderer/src/components/editor/markdown-rich-mode.ts b/src/renderer/src/components/editor/markdown-rich-mode.ts index a2db5804733..f25175b53ff 100644 --- a/src/renderer/src/components/editor/markdown-rich-mode.ts +++ b/src/renderer/src/components/editor/markdown-rich-mode.ts @@ -5,7 +5,10 @@ import { getRichMarkdownRoundTripOutput } from './markdown-round-trip' import { extractFrontMatter } from './markdown-frontmatter' -import { canRenderMarkdownAtSize } from './markdown-rich-size-limit' +import { + canRenderMarkdownAtSize, + exceedsMarkdownRenderOverrideSizeLimit +} from './markdown-rich-size-limit' import { translate } from '@/i18n/i18n' import { encodeRawMarkdownHtmlForRichEditor } from './raw-markdown-html' import { createRichMarkdownEditorCodec } from './rich-markdown-source-transport' @@ -142,6 +145,10 @@ export function getMarkdownRichModeEligibilityDecision({ content: string sizeOverridden: boolean }): MarkdownRichModeEligibilityDecision { + // Past the hard cap neither mode renders rich, so the unsupported-syntax scan is moot. + if (exceedsMarkdownRenderOverrideSizeLimit(content)) { + return { exceedsSizeLimit: true, unsupportedReason: null } + } return { exceedsSizeLimit: !canRenderMarkdownAtSize(content, sizeOverridden), unsupportedReason: getMarkdownRichModeUnsupportedReason(content)