From 22860a1e38be2a23504ce8a757eff57c1af2969a Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Fri, 17 Jan 2025 13:40:35 +0100 Subject: [PATCH] Delay dispatch of DOM events during view updates FIX: Make sure event handlers registered with `domEventHandlers` are not called during view updates, to avoid triggering nested update errors. Closes https://github.com/codemirror/dev/issues/1507 --- src/input.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/input.ts b/src/input.ts index be26f2a..51f0a45 100644 --- a/src/input.ts +++ b/src/input.ts @@ -1,5 +1,5 @@ import {EditorSelection, EditorState, SelectionRange, RangeSet, Annotation, Text, Facet} from "@codemirror/state" -import {EditorView} from "./editorview" +import {EditorView, UpdateState} from "./editorview" import {ContentView} from "./contentview" import {LineView} from "./blockview" import {ViewUpdate, PluginValue, clickAddsSelectionRange, dragMovesSelection as dragBehavior, atomicRanges, @@ -84,7 +84,8 @@ export class InputState { handleEvent(event: Event) { if (!eventBelongsToEditor(this.view, event) || this.ignoreDuringComposition(event)) return if (event.type == "keydown" && this.keydown(event as KeyboardEvent)) return - this.runHandlers(event.type, event) + if (this.view.updateState != UpdateState.Idle) Promise.resolve().then(() => this.runHandlers(event.type, event)) + else this.runHandlers(event.type, event) } runHandlers(type: string, event: Event) {