Skip to content

Commit a8d43eb

Browse files
committed
Fix issue where listeners remain after WebglRenderer throws
See microsoft/vscode#239838
1 parent d81b25c commit a8d43eb

1 file changed

Lines changed: 14 additions & 12 deletions

File tree

addons/addon-webgl/src/WebglRenderer.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,20 @@ export class WebglRenderer extends Disposable implements IRenderer {
7676
) {
7777
super();
7878

79+
// IMPORTANT: Canvas initialization and fetching of the context must be first in order to
80+
// prevent possible listeners leaking and continuing to operate after the WebglRenderer has been
81+
// discarded.
82+
this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');
83+
const contextAttributes = {
84+
antialias: false,
85+
depth: false,
86+
preserveDrawingBuffer
87+
};
88+
this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;
89+
if (!this._gl) {
90+
throw new Error('WebGL2 not supported ' + this._gl);
91+
}
92+
7993
this._register(this._themeService.onChangeColors(() => this._handleColorChange()));
8094

8195
this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);
@@ -91,18 +105,6 @@ export class WebglRenderer extends Disposable implements IRenderer {
91105
this._updateCursorBlink();
92106
this._register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));
93107

94-
this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');
95-
96-
const contextAttributes = {
97-
antialias: false,
98-
depth: false,
99-
preserveDrawingBuffer
100-
};
101-
this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;
102-
if (!this._gl) {
103-
throw new Error('WebGL2 not supported ' + this._gl);
104-
}
105-
106108
this._deviceMaxTextureSize = this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE);
107109

108110
this._register(addDisposableListener(this._canvas, 'webglcontextlost', (e) => {

0 commit comments

Comments
 (0)