Skip to content

Commit f3ac15e

Browse files
committed
list view: make sure all templates are disposed when list is disposed
1 parent b7e6e04 commit f3ac15e

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

src/vs/base/browser/ui/list/listView.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,17 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
484484
// Dispose
485485

486486
dispose() {
487-
this.items = null;
487+
if (this.items) {
488+
for (const item of this.items) {
489+
if (item.row) {
490+
const renderer = this.renderers.get(item.row.templateId);
491+
renderer.disposeTemplate(item.row.templateData);
492+
item.row = null;
493+
}
494+
}
495+
496+
this.items = null;
497+
}
488498

489499
if (this._domNode && this._domNode.parentElement) {
490500
this._domNode.parentNode.removeChild(this._domNode);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as assert from 'assert';
7+
import { ListView } from 'vs/base/browser/ui/list/listView';
8+
import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list';
9+
import { range } from 'vs/base/common/arrays';
10+
11+
suite('ListView', function () {
12+
test('all rows get disposed', function () {
13+
const element = document.createElement('div');
14+
element.style.height = '200px';
15+
element.style.width = '200px';
16+
17+
const delegate: IDelegate<number> = {
18+
getHeight() { return 20; },
19+
getTemplateId() { return 'template'; }
20+
};
21+
22+
let templatesCount = 0;
23+
24+
const renderer: IRenderer<number, void> = {
25+
templateId: 'template',
26+
renderTemplate() { templatesCount++; },
27+
renderElement() { },
28+
disposeTemplate() { templatesCount--; }
29+
};
30+
31+
const listView = new ListView<number>(element, delegate, [renderer]);
32+
listView.layout(200);
33+
34+
assert.equal(templatesCount, 0, 'no templates have been allocated');
35+
listView.splice(0, 0, range(100));
36+
assert.equal(templatesCount, 10, 'some templates have been allocated');
37+
listView.dispose();
38+
assert.equal(templatesCount, 0, 'all templates have been disposed');
39+
});
40+
});

0 commit comments

Comments
 (0)