diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 8b324579c14d3..0bb67dccd4c5c 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -60,6 +60,18 @@ interface PreviewStyleLoadErrorMessage extends WebviewMessage { }; } +export class PreviewDocumentVersion { + public constructor( + public readonly resource: vscode.Uri, + public readonly version: number, + ) { } + + public equals(other: PreviewDocumentVersion): boolean { + return this.resource.fsPath === other.resource.fsPath + && this.version === other.version; + } +} + export class MarkdownPreview extends Disposable { public static viewType = 'markdown.preview'; @@ -71,7 +83,7 @@ export class MarkdownPreview extends Disposable { private throttleTimer: any; private line: number | undefined = undefined; private firstUpdate = true; - private currentVersion?: { resource: vscode.Uri, version: number }; + private currentVersion?: PreviewDocumentVersion; private forceUpdate = false; private isScrolling = false; private _disposed: boolean = false; @@ -389,7 +401,8 @@ export class MarkdownPreview extends Disposable { return; } - if (!this.forceUpdate && this.currentVersion && this.currentVersion.resource.fsPath === resource.fsPath && this.currentVersion.version === document.version) { + const pendingVersion = new PreviewDocumentVersion(resource, document.version); + if (!this.forceUpdate && this.currentVersion && this.currentVersion.equals(pendingVersion)) { if (this.line) { this.updateForView(resource, this.line); } @@ -397,10 +410,14 @@ export class MarkdownPreview extends Disposable { } this.forceUpdate = false; - this.currentVersion = { resource, version: document.version }; + this.currentVersion = pendingVersion; if (this._resource === resource) { const content = await this._contentProvider.provideTextDocumentContent(document, this._previewConfigurations, this.line, this.state); - this.setContent(content); + // Another call to `doUpdate` may have happened. + // Make sure we are still updating for the correct document + if (this.currentVersion && this.currentVersion.equals(pendingVersion)) { + this.setContent(content); + } } }