diff --git a/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-opener.tsx b/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-opener.tsx index 9fc403fcb934f..16b59b14abbc8 100644 --- a/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-opener.tsx +++ b/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-opener.tsx @@ -22,7 +22,7 @@ import * as glob from './glob'; import { CustomEditor } from '../../../common'; import { CustomEditorWidget } from './custom-editor-widget'; import { v4 } from 'uuid'; -import { Emitter } from '@theia/core'; +import { Disposable, Emitter } from '@theia/core'; export class CustomEditorOpener implements OpenHandler { @@ -57,6 +57,7 @@ export class CustomEditorOpener implements OpenHandler { } } + protected readonly pendingGetWidgets = new Map(); async open(uri: URI, options?: OpenerOptions): Promise { let widget: CustomEditorWidget | undefined; const widgets = this.widgetManager.getWidgets(CustomEditorWidget.FACTORY_ID) as CustomEditorWidget[]; @@ -68,14 +69,21 @@ export class CustomEditorOpener implements OpenHandler { if (widget?.isAttached) { return this.shell.activateWidget(widget.id); } + const stringUri = uri.toString(); + if (!widget && this.pendingGetWidgets.has(stringUri)) { + return; + } if (!widget) { const id = v4(); + this.pendingGetWidgets.set(stringUri, Disposable.create(() => { + this.pendingGetWidgets.delete(stringUri); + })); widget = await this.widgetManager.getOrCreateWidget(CustomEditorWidget.FACTORY_ID, { id }); + this.pendingGetWidgets.get(stringUri)?.dispose(); widget.viewType = this.editor.viewType; widget.resource = uri; + this.onDidOpenCustomEditorEmitter.fire(widget); } - - this.onDidOpenCustomEditorEmitter.fire(widget); } matches(selectors: CustomEditorSelector[], resource: URI): boolean {