提交 feedae01 编写于 作者: M Matt Bierner

Fixing potential leaks around markdown renderer

- MarkdownRenderer is disposable
- Use DisposableStore instead of arrays
上级 086e0491
......@@ -335,7 +335,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
let isEmptyHoverContent = true;
let containColorPicker = false;
let markdownDisposeables: IDisposable[] = [];
const markdownDisposeables = new DisposableStore();
const markerMessages: MarkerHover[] = [];
messages.forEach((msg) => {
if (!msg.range) {
......@@ -426,7 +426,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
this.updateContents(fragment);
this._colorPicker.layout();
this.renderDisposable.value = combinedDisposable(colorListener, colorChangeListener, widget, ...markdownDisposeables);
this.renderDisposable.value = combinedDisposable(colorListener, colorChangeListener, widget, markdownDisposeables);
});
} else {
if (msg instanceof MarkerHover) {
......@@ -438,15 +438,14 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
.forEach(contents => {
const markdownHoverElement = $('div.hover-row.markdown-hover');
const hoverContentsElement = dom.append(markdownHoverElement, $('div.hover-contents'));
const renderer = new MarkdownRenderer(this._editor, this._modeService, this._openerService);
markdownDisposeables.push(renderer.onDidRenderCodeBlock(() => {
const renderer = markdownDisposeables.add(new MarkdownRenderer(this._editor, this._modeService, this._openerService));
markdownDisposeables.add(renderer.onDidRenderCodeBlock(() => {
hoverContentsElement.className = 'hover-contents code-hover-contents';
this.onContentsChange();
}));
const renderedContents = renderer.render(contents);
const renderedContents = markdownDisposeables.add(renderer.render(contents));
hoverContentsElement.appendChild(renderedContents.element);
fragment.appendChild(markdownHoverElement);
markdownDisposeables.push(renderedContents);
isEmptyHoverContent = false;
});
}
......
......@@ -5,7 +5,7 @@
import { $ } from 'vs/base/browser/dom';
import { IMarkdownString, isEmptyMarkdownString } from 'vs/base/common/htmlContent';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { DisposableStore } from 'vs/base/common/lifecycle';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/hoverOperation';
import { GlyphHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets';
......@@ -91,7 +91,7 @@ export class ModesGlyphHoverWidget extends GlyphHoverWidget {
private readonly _markdownRenderer: MarkdownRenderer;
private readonly _computer: MarginComputer;
private readonly _hoverOperation: HoverOperation<IHoverMessage[]>;
private _renderDisposeables: IDisposable[];
private readonly _renderDisposeables = this._register(new DisposableStore());
constructor(
editor: ICodeEditor,
......@@ -102,7 +102,7 @@ export class ModesGlyphHoverWidget extends GlyphHoverWidget {
this._lastLineNumber = -1;
this._markdownRenderer = new MarkdownRenderer(this._editor, modeService, openerService);
this._markdownRenderer = this._register(new MarkdownRenderer(this._editor, modeService, openerService));
this._computer = new MarginComputer(this._editor);
this._hoverOperation = new HoverOperation(
......@@ -116,7 +116,6 @@ export class ModesGlyphHoverWidget extends GlyphHoverWidget {
}
public dispose(): void {
this._renderDisposeables = dispose(this._renderDisposeables);
this._hoverOperation.cancel();
super.dispose();
}
......@@ -163,16 +162,15 @@ export class ModesGlyphHoverWidget extends GlyphHoverWidget {
}
private _renderMessages(lineNumber: number, messages: IHoverMessage[]): void {
dispose(this._renderDisposeables);
this._renderDisposeables = [];
this._renderDisposeables.clear();
const fragment = document.createDocumentFragment();
messages.forEach((msg) => {
for (const msg of messages) {
const renderedContents = this._markdownRenderer.render(msg.value);
this._renderDisposeables.push(renderedContents);
this._renderDisposeables.add(renderedContents);
fragment.appendChild($('div.hover-row', undefined, renderedContents.element));
});
}
this.updateContents(fragment);
this.showAt(lineNumber);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册