From 2250b4a848974c3b2b0a9b1aec1ed8dea83d6d9d Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Fri, 11 Sep 2020 12:44:08 +0200 Subject: [PATCH] Fix bug causing a deleted editor to continue believing it had focus Which kept the cursor blink and input poll intervals alive, leaking memory. Closes #6410 --- src/display/selection.js | 7 +++++-- src/edit/CodeMirror.js | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/display/selection.js b/src/display/selection.js index c658c0a272..d377a9f4c8 100644 --- a/src/display/selection.js +++ b/src/display/selection.js @@ -4,6 +4,7 @@ import { getLine } from "../line/utils_line.js" import { charCoords, cursorCoords, displayWidth, paddingH, wrappedLineExtentChar } from "../measurement/position_measurement.js" import { getOrder, iterateBidiSections } from "../util/bidi.js" import { elt } from "../util/dom.js" +import { onBlur } from "./focus.js" export function updateSelection(cm) { cm.display.input.showSelection(cm.display.input.prepareSelection()) @@ -151,8 +152,10 @@ export function restartBlink(cm) { let on = true display.cursorDiv.style.visibility = "" if (cm.options.cursorBlinkRate > 0) - display.blinker = setInterval(() => display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden", - cm.options.cursorBlinkRate) + display.blinker = setInterval(() => { + if (!cm.hasFocus()) onBlur(cm) + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden" + }, cm.options.cursorBlinkRate) else if (cm.options.cursorBlinkRate < 0) display.cursorDiv.style.visibility = "hidden" } diff --git a/src/edit/CodeMirror.js b/src/edit/CodeMirror.js index 3429da1efc..dc01611390 100644 --- a/src/edit/CodeMirror.js +++ b/src/edit/CodeMirror.js @@ -14,7 +14,7 @@ import { Range } from "../model/selection.js" import { extendSelection } from "../model/selection_updates.js" import { ie, ie_version, mobile, webkit } from "../util/browser.js" import { e_preventDefault, e_stop, on, signal, signalDOMEvent } from "../util/event.js" -import { bind, copyObj, Delayed } from "../util/misc.js" +import { copyObj, Delayed } from "../util/misc.js" import { clearDragCursor, onDragOver, onDragStart, onDrop } from "./drop_events.js" import { ensureGlobalHandlers } from "./global_events.js" @@ -76,7 +76,9 @@ export function CodeMirror(place, options) { attachDoc(this, doc) if ((options.autofocus && !mobile) || this.hasFocus()) - setTimeout(bind(onFocus, this), 20) + setTimeout(() => { + if (this.hasFocus() && !this.state.focused) onFocus(this) + }, 20) else onBlur(this)