From e546c8e4fffe67b918761617291e15ccae23544a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke <marijnh@gmail.com>
Date: Wed, 16 Apr 2014 12:34:44 +0200
Subject: [PATCH] Be more accurate about which handlers to fire change events
 for

I.e. don't fire for a handler that wasn't registered when the change happened.
---
 lib/codemirror.js | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/lib/codemirror.js b/lib/codemirror.js
index 9a47f3aa4..33b981159 100644
--- a/lib/codemirror.js
+++ b/lib/codemirror.js
@@ -1955,11 +1955,8 @@
       delayedCallbacks = null;
     }
     // Fire change events, and delayed event handlers
-    if (op.changeObjs) {
-      for (var i = 0; i < op.changeObjs.length; i++)
-        signal(cm, "change", cm, op.changeObjs[i]);
+    if (op.changeObjs)
       signal(cm, "changes", cm, op.changeObjs);
-    }
     if (op.cursorActivity) signal(cm, "cursorActivity", cm, op.origin);
     if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
   }
@@ -3481,13 +3478,17 @@
     else
       regChange(cm, from.line, to.line + 1, lendiff);
 
-    if (hasHandler(cm, "change") || hasHandler(cm, "changes"))
-      (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push({
+    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+    if (changeHandler || changesHandler) {
+      var obj = {
         from: from, to: to,
         text: change.text,
         removed: change.removed,
         origin: change.origin
-      });
+      };
+      if (changeHandler) signalLater(cm, "change", cm, obj);
+      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
+    }
   }
 
   function replaceRange(doc, code, from, to, origin) {
-- 
GitLab