From 1324d9c831bec7731f50cbeb0f5b027c18bf0ee5 Mon Sep 17 00:00:00 2001 From: bielie Date: Wed, 25 Feb 2026 16:11:31 +0800 Subject: [PATCH] fix(ena-planner): harden send interception during planning --- modules/ena-planner/ena-planner.js | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/modules/ena-planner/ena-planner.js b/modules/ena-planner/ena-planner.js index 436238c..5c2d025 100644 --- a/modules/ena-planner/ena-planner.js +++ b/modules/ena-planner/ena-planner.js @@ -77,7 +77,9 @@ let overlay = null; let iframeMessageBound = false; let sendListenersInstalled = false; let sendClickHandler = null; +let sendPointerDownHandler = null; let sendKeydownHandler = null; +let sendKeyupHandler = null; /** * ------------------------- @@ -1319,10 +1321,29 @@ async function doInterceptAndPlanThenSend() { function installSendInterceptors() { if (sendListenersInstalled) return; + sendPointerDownHandler = (e) => { + const btn = getSendButton(); + if (!btn) return; + if (e.target !== btn && !btn.contains(e.target)) return; + if (state.isPlanning) { + e.preventDefault(); + e.stopImmediatePropagation(); + return; + } + if (!shouldInterceptNow()) return; + e.preventDefault(); + e.stopImmediatePropagation(); + doInterceptAndPlanThenSend().catch(err => toastErr(String(err?.message ?? err))); + }; sendClickHandler = (e) => { const btn = getSendButton(); if (!btn) return; if (e.target !== btn && !btn.contains(e.target)) return; + if (state.isPlanning) { + e.preventDefault(); + e.stopImmediatePropagation(); + return; + } if (!shouldInterceptNow()) return; e.preventDefault(); e.stopImmediatePropagation(); @@ -1338,17 +1359,31 @@ function installSendInterceptors() { doInterceptAndPlanThenSend().catch(err => toastErr(String(err?.message ?? err))); } }; + sendKeyupHandler = (e) => { + const ta = getSendTextarea(); + if (!ta || e.target !== ta) return; + if (e.key !== 'Enter' || e.shiftKey) return; + if (!state.isPlanning) return; + e.preventDefault(); + e.stopImmediatePropagation(); + }; + document.addEventListener('pointerdown', sendPointerDownHandler, true); document.addEventListener('click', sendClickHandler, true); document.addEventListener('keydown', sendKeydownHandler, true); + document.addEventListener('keyup', sendKeyupHandler, true); sendListenersInstalled = true; } function uninstallSendInterceptors() { if (!sendListenersInstalled) return; + if (sendPointerDownHandler) document.removeEventListener('pointerdown', sendPointerDownHandler, true); if (sendClickHandler) document.removeEventListener('click', sendClickHandler, true); if (sendKeydownHandler) document.removeEventListener('keydown', sendKeydownHandler, true); + if (sendKeyupHandler) document.removeEventListener('keyup', sendKeyupHandler, true); + sendPointerDownHandler = null; sendClickHandler = null; sendKeydownHandler = null; + sendKeyupHandler = null; sendListenersInstalled = false; }