From c8c69a99b913dc91e350bbcbb9c7367df3bc1c62 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 15 Sep 2015 10:36:47 +0200 Subject: [PATCH] Release free nodes after destroying TextEditor --- spec/dom-element-pool-spec.coffee | 11 +++++++++++ src/dom-element-pool.coffee | 5 +++++ src/line-number-gutter-component.coffee | 2 ++ src/lines-component.coffee | 3 +++ src/text-editor-component.coffee | 1 + 5 files changed, 22 insertions(+) diff --git a/spec/dom-element-pool-spec.coffee b/spec/dom-element-pool-spec.coffee index f16185cca..1399b17fc 100644 --- a/spec/dom-element-pool-spec.coffee +++ b/spec/dom-element-pool-spec.coffee @@ -34,6 +34,17 @@ describe "DOMElementPool", -> expect(elements).not.toContain(domElementPool.build("div")) expect(elements).not.toContain(domElementPool.build("span")) + it "forgets free nodes after being cleared", -> + span = domElementPool.build("span") + div = domElementPool.build("div") + domElementPool.freeElementAndDescendants(span) + domElementPool.freeElementAndDescendants(div) + + domElementPool.clear() + + expect(domElementPool.build("span")).not.toBe(span) + expect(domElementPool.build("div")).not.toBe(div) + it "throws an error when trying to free the same node twice", -> div = domElementPool.build("div") domElementPool.freeElementAndDescendants(div) diff --git a/src/dom-element-pool.coffee b/src/dom-element-pool.coffee index 4cea8b89e..93e798f93 100644 --- a/src/dom-element-pool.coffee +++ b/src/dom-element-pool.coffee @@ -4,6 +4,11 @@ class DOMElementPool @freeElementsByTagName = {} @freedElements = new Set + clear: -> + @freedElements.clear() + for tagName, freeElements of @freeElementsByTagName + freeElements.length = 0 + build: (tagName, className, textContent) -> element = @freeElementsByTagName[tagName]?.pop() element ?= document.createElement(tagName) diff --git a/src/line-number-gutter-component.coffee b/src/line-number-gutter-component.coffee index c95d43641..df8f8bd1b 100644 --- a/src/line-number-gutter-component.coffee +++ b/src/line-number-gutter-component.coffee @@ -22,6 +22,8 @@ class LineNumberGutterComponent extends TiledComponent @domNode.addEventListener 'mousedown', @onMouseDown destroy: -> + @domElementPool.clear() + @domNode.removeEventListener 'click', @onClick @domNode.removeEventListener 'mousedown', @onMouseDown diff --git a/src/lines-component.coffee b/src/lines-component.coffee index a96c4b91d..0fc9fea02 100644 --- a/src/lines-component.coffee +++ b/src/lines-component.coffee @@ -31,6 +31,9 @@ class LinesComponent extends TiledComponent insertionPoint.setAttribute('select', '.overlayer') @domNode.appendChild(insertionPoint) + destroy: -> + @domElementPool.clear() + getDomNode: -> @domNode diff --git a/src/text-editor-component.coffee b/src/text-editor-component.coffee index 51bc2c463..f15a15c3f 100644 --- a/src/text-editor-component.coffee +++ b/src/text-editor-component.coffee @@ -107,6 +107,7 @@ class TextEditorComponent @disposables.dispose() @presenter.destroy() @gutterContainerComponent?.destroy() + @linesComponent.destroy() getDomNode: -> @domNode