From e7734b76a7b15f1697ebf7e88d02d332067df799 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Apr 2026 15:32:06 -0700 Subject: [PATCH] Cancel stale lookup scan fallback timer when closing popup The setTimeout fallback in triggerLookupForSelectedWord was not being tracked or cancelled, causing it to fire after test globals were restored and hit an undefined document reference. --- src/renderer/handlers/keyboard.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/renderer/handlers/keyboard.ts b/src/renderer/handlers/keyboard.ts index bd97e213..04a4dd78 100644 --- a/src/renderer/handlers/keyboard.ts +++ b/src/renderer/handlers/keyboard.ts @@ -38,6 +38,7 @@ export function createKeyboardHandlers( let pendingSelectionAnchorAfterSubtitleSeek: 'start' | 'end' | null = null; let pendingLookupRefreshAfterSubtitleSeek = false; let resetSelectionToStartOnNextSubtitleSync = false; + let lookupScanFallbackTimer: ReturnType | null = null; const CHORD_MAP = new Map< string, @@ -483,7 +484,9 @@ export function createKeyboardHandlers( }); } // Fallback only if the explicit scan path did not open popup quickly. - setTimeout(() => { + if (lookupScanFallbackTimer !== null) clearTimeout(lookupScanFallbackTimer); + lookupScanFallbackTimer = setTimeout(() => { + lookupScanFallbackTimer = null; if (ctx.state.yomitanPopupVisible || isYomitanPopupVisible(document)) { return; } @@ -523,6 +526,10 @@ export function createKeyboardHandlers( return false; } + if (lookupScanFallbackTimer !== null) { + clearTimeout(lookupScanFallbackTimer); + lookupScanFallbackTimer = null; + } dispatchYomitanPopupVisibility(false); dispatchYomitanFrontendClearActiveTextSource(); clearNativeSubtitleSelection();