From 51ab8846e37bdef6574414a2b4a47abab92c13c0 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Mon, 26 Oct 2026 12:31:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E9=98=85=E8=AF=BB=E8=A7=86=E5=9B=BE):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=98=85=E8=AF=BB=E8=A7=86=E5=9B=BE=E8=B7=A8?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E5=BC=82=E6=AD=A5=E5=B9=B2=E6=89=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/webui/ofdgo.js | 1 - assets/webui/ofdgo_view.js | 32 +++++++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/assets/webui/ofdgo.js b/assets/webui/ofdgo.js index f478c51..7c52e4c 100644 --- a/assets/webui/ofdgo.js +++ b/assets/webui/ofdgo.js @@ -2802,7 +2802,6 @@ function detachDocumentView() { state.scrollFrame = state.thumbnailFrame = state.openActionFrame = 0; state.openActionTask = null; pageView.resetPageLoading(); - state.pageRenderRunning = state.pageRenderWorkers > 0; state.pageWindow = null; state.thumbnailWindow = null; state.visiblePages.clear(); diff --git a/assets/webui/ofdgo_view.js b/assets/webui/ofdgo_view.js index cc097c6..3acc5b2 100644 --- a/assets/webui/ofdgo_view.js +++ b/assets/webui/ofdgo_view.js @@ -229,6 +229,7 @@ export function createPageView(context) { task.resolve(null); } context.state.pageRenderQueue = []; + context.state.pageRenderRunning = context.state.pageRenderWorkers > 0; context.state.pagePrefetchIndex = null; context.state.pagePrefetchDirection = 1; context.state.pageInFlight.clear(); @@ -339,7 +340,7 @@ export function createPageView(context) { const current = context.state.pageInFlight.get(key); if (current) { current.priority = Math.min(current.priority, priority); - if (current.preview && !options.preview) return current.promise.then(() => pageView.loadPageData(index, options)); + if (current.preview && !options.preview) return current.promise.then(() => openSeq === context.state.openSeq ? pageView.loadPageData(index, options) : null); return current.promise; } if (!options.refresh && context.state.pageCache.has(index) && (options.preview || !context.state.pageCache.get(index).previewOnly)) { @@ -369,14 +370,18 @@ export function createPageView(context) { return; } context.state.pageRenderRunning = true; - requestAnimationFrame(pageView.processPageRenderQueue); + const tab = context.documentTab(), openSeq = tab.state.openSeq; + requestAnimationFrame(() => { + if (context.activeTab === tab && openSeq === tab.state.openSeq) pageView.processPageRenderQueue(); + }); }, async processPageRenderQueue() { - const tab = context.documentTab(); + const tab = context.documentTab(), openSeq = tab.state.openSeq; await context.nextFrame(); - if (context.activeTab !== tab) return; - await Promise.all(Array.from({ length: nativeHost?.parallelism || context.wasmWorker?.parallelism || 1 }, () => pageView.processPageRenderTasks())); + if (context.activeTab !== tab || openSeq !== tab.state.openSeq) return; + const available = (nativeHost?.parallelism || context.wasmWorker?.parallelism || 1) - tab.state.pageRenderWorkers; + await Promise.all(Array.from({ length: Math.max(0, available) }, () => pageView.processPageRenderTasks())); }, async processPageRenderTasks() { @@ -516,21 +521,22 @@ export function createPageView(context) { }, async loadSVGFonts(fonts, openSeq) { + const state = context.state; for (const font of fonts) { if (openSeq !== context.state.openSeq) { return; } - if (context.state.svgFonts.has(font.name)) { + if (state.svgFonts.has(font.name)) { continue; } const key = `${openSeq}:${font.name}`; - let loading = context.state.svgFontLoads.get(key); + let loading = state.svgFontLoads.get(key); if (!loading) { loading = pageView.loadSVGFont(font, openSeq); - context.state.svgFontLoads.set(key, loading); + state.svgFontLoads.set(key, loading); } try { await loading; } - finally { if (context.state.svgFontLoads.get(key) === loading) context.state.svgFontLoads.delete(key); } + finally { if (state.svgFontLoads.get(key) === loading) state.svgFontLoads.delete(key); } } }, @@ -807,7 +813,9 @@ export function createPageView(context) { async togglePageLayout() { if (!(context.state.doc?.pageCount > 1) || document.body.hasAttribute("data-busy")) return; const openSeq = context.state.openSeq; - if (!await context.canvasEditor.commitNudge() || !await context.canvasEditor.commitText() || !await context.canvasEditor.commitCrop() || openSeq !== context.state.openSeq) return; + if (!await context.canvasEditor.commitNudge() || openSeq !== context.state.openSeq) return; + if (!await context.canvasEditor.commitText() || openSeq !== context.state.openSeq) return; + if (!await context.canvasEditor.commitCrop() || openSeq !== context.state.openSeq) return; context.state.pageLayoutPreference = context.state.pageLayout === 1 ? 2 : 1; pageView.layoutPages(); pageView.layoutThumbnails(); @@ -1207,7 +1215,9 @@ export function createPageView(context) { async toggleContinuous() { if (!context.state.doc || document.body.hasAttribute("data-busy")) return; const openSeq = context.state.openSeq; - if (!await context.canvasEditor.commitNudge() || !await context.canvasEditor.commitText() || !await context.canvasEditor.commitCrop() || openSeq !== context.state.openSeq) return; + if (!await context.canvasEditor.commitNudge() || openSeq !== context.state.openSeq) return; + if (!await context.canvasEditor.commitText() || openSeq !== context.state.openSeq) return; + if (!await context.canvasEditor.commitCrop() || openSeq !== context.state.openSeq) return; const anchor = context.state.fitMode === "free" ? pageView.scaleAnchor() : null; pageView.setContinuous(!context.state.continuous); if (context.state.pageWindow) {