diff --git a/fluxer_app/src/features/channel/components/textarea/TextareaContextMenu.tsx b/fluxer_app/src/features/channel/components/textarea/TextareaContextMenu.tsx index c93baca44..0236d88ac 100644 --- a/fluxer_app/src/features/channel/components/textarea/TextareaContextMenu.tsx +++ b/fluxer_app/src/features/channel/components/textarea/TextareaContextMenu.tsx @@ -217,6 +217,7 @@ export const TextareaContextMenu = observer( ); onClose(); }; + const isPasswordTarget = targetElement instanceof HTMLInputElement && targetElement.type === 'password'; const spellcheckEnabled = Spellcheck.enabled; const hasMisspelling = spellcheckEnabled && misspelledWord && suggestions.length > 0; return ( @@ -307,19 +308,21 @@ export const TextareaContextMenu = observer( {i18n._(SELECT_ALL_DESCRIPTOR)} - - ( - - )} - data-flx="channel.textarea.textarea-context-menu.menu-item-submenu" - /> - + {!isPasswordTarget && ( + + ( + + )} + data-flx="channel.textarea.textarea-context-menu.menu-item-submenu" + /> + + )} {showSendButtonToggle && ( | null = null; let ipcRegistered = false; let launchModeLogged = false; -const contextSourceByWebContents = new WeakMap< - WebContents, - { - isTextarea: boolean; - ts: number; - } ->(); const norm = (code: string): string => code.toLowerCase(); const beginSessionApply = (session: Session): number => { const generation = (sessionApplyGeneration.get(session) ?? 0) + 1; @@ -971,20 +964,6 @@ const suggestWord = (session: Session, word: string): Array => { const ensureSharedIpc = () => { if (ipcRegistered) return; ipcRegistered = true; - ipcMain.on( - 'spellcheck-context-target', - ( - event, - payload: { - isTextarea?: boolean; - }, - ) => { - contextSourceByWebContents.set(event.sender, { - isTextarea: Boolean(payload?.isTextarea), - ts: Date.now(), - }); - }, - ); ipcMain.on( 'spellcheck:update-autodetect-text', ( @@ -1016,31 +995,6 @@ const ensureSharedIpc = () => { return suggestWord(event.sender.session, word); }); }; -const shouldHandleContextMenu = (webContents: WebContents, params: Electron.ContextMenuParams): boolean => { - if (!params['isEditable']) return false; - const inputFieldType = ( - params as { - inputFieldType?: string; - } - ).inputFieldType; - const isPassword = - ( - params as { - isPassword?: boolean; - } - ).isPassword === true || - inputFieldType === 'password' || - ( - params as { - formControlType?: string; - } - ).formControlType === 'password'; - if (isPassword) return false; - const target = contextSourceByWebContents.get(webContents); - const targetRecent = target && Date.now() - target.ts < 5000; - const isTextLike = inputFieldType === 'plainText' || inputFieldType === 'textarea' || inputFieldType === undefined; - return Boolean((targetRecent && target.isTextarea) || isTextLike); -}; let rendererSpellcheckHandlersRegistered = false; export const registerSpellcheck = (webContents: WebContents): void => { @@ -1117,7 +1071,7 @@ export const registerSpellcheck = (webContents: WebContents): void => { }); } webContents.on('context-menu', (event, params) => { - if (!shouldHandleContextMenu(webContents, params)) return; + if (!params.isEditable) return; event.preventDefault(); const cur = sessionState.get(session) ?? {...defaultState}; const resolved = sessionResolvedEngine.get(session) ?? resolveEngine(cur, session); diff --git a/fluxer_desktop/src/preload/index.ts b/fluxer_desktop/src/preload/index.ts index c1450566b..1f8a3b9ca 100644 --- a/fluxer_desktop/src/preload/index.ts +++ b/fluxer_desktop/src/preload/index.ts @@ -870,16 +870,6 @@ const api: ElectronAPI = { } satisfies VoiceEngineV2BridgeHardwareEncoderApi, }; -window.addEventListener( - 'contextmenu', - (event) => { - const target = event.target as HTMLElement | null; - const isTextarea = Boolean(target?.closest?.('textarea')); - ipcRenderer.send('spellcheck-context-target', {isTextarea}); - }, - true, -); - let spellcheckAutodetectTimer: NodeJS.Timeout | null = null; let spellcheckAutodetectContextSequence = 0; const SPELLCHECK_AUTODETECT_DEBOUNCE_MS = 750;