From f3ac15e5be9b536b1c0d2bad7c36081ae4fa663e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 22 Jun 2018 10:56:05 +0200 Subject: [PATCH] list view: make sure all templates are disposed when list is disposed --- src/vs/base/browser/ui/list/listView.ts | 12 +++++- .../test/browser/ui/list/listView.test.ts | 40 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/vs/base/test/browser/ui/list/listView.test.ts diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 808cccb229c..1d560a8afec 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -484,7 +484,17 @@ export class ListView implements ISpliceable, IDisposable { // Dispose dispose() { - this.items = null; + if (this.items) { + for (const item of this.items) { + if (item.row) { + const renderer = this.renderers.get(item.row.templateId); + renderer.disposeTemplate(item.row.templateData); + item.row = null; + } + } + + this.items = null; + } if (this._domNode && this._domNode.parentElement) { this._domNode.parentNode.removeChild(this._domNode); diff --git a/src/vs/base/test/browser/ui/list/listView.test.ts b/src/vs/base/test/browser/ui/list/listView.test.ts new file mode 100644 index 00000000000..5f4a644c99a --- /dev/null +++ b/src/vs/base/test/browser/ui/list/listView.test.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { ListView } from 'vs/base/browser/ui/list/listView'; +import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { range } from 'vs/base/common/arrays'; + +suite('ListView', function () { + test('all rows get disposed', function () { + const element = document.createElement('div'); + element.style.height = '200px'; + element.style.width = '200px'; + + const delegate: IDelegate = { + getHeight() { return 20; }, + getTemplateId() { return 'template'; } + }; + + let templatesCount = 0; + + const renderer: IRenderer = { + templateId: 'template', + renderTemplate() { templatesCount++; }, + renderElement() { }, + disposeTemplate() { templatesCount--; } + }; + + const listView = new ListView(element, delegate, [renderer]); + listView.layout(200); + + assert.equal(templatesCount, 0, 'no templates have been allocated'); + listView.splice(0, 0, range(100)); + assert.equal(templatesCount, 10, 'some templates have been allocated'); + listView.dispose(); + assert.equal(templatesCount, 0, 'all templates have been disposed'); + }); +}); \ No newline at end of file -- GitLab