diff --git a/src/sql/workbench/services/notebook/common/notebookServiceImpl.ts b/src/sql/workbench/services/notebook/common/notebookServiceImpl.ts index e684777be8..9b6842a8fc 100644 --- a/src/sql/workbench/services/notebook/common/notebookServiceImpl.ts +++ b/src/sql/workbench/services/notebook/common/notebookServiceImpl.ts @@ -11,7 +11,7 @@ import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; import { - INotebookService, INotebookManager, INotebookProvider, DEFAULT_NOTEBOOK_PROVIDER, + INotebookService, INotebookManager, INotebookProvider, DEFAULT_NOTEBOOK_FILETYPE, INotebookEditor, SQL_NOTEBOOK_PROVIDER, OVERRIDE_EDITOR_THEMING_SETTING } from 'sql/workbench/services/notebook/common/notebookService'; import { RenderMimeRegistry } from 'sql/workbench/parts/notebook/outputs/registry'; @@ -97,7 +97,7 @@ export class NotebookService extends Disposable implements INotebookService { constructor( @ILifecycleService lifecycleService: ILifecycleService, @IStorageService private _storageService: IStorageService, - @IExtensionService extensionService: IExtensionService, + @IExtensionService private _extensionService: IExtensionService, @IExtensionManagementService extensionManagementService: IExtensionManagementService, @IInstantiationService private _instantiationService: IInstantiationService, @IContextKeyService private _contextKeyService: IContextKeyService, @@ -121,8 +121,8 @@ export class NotebookService extends Disposable implements INotebookService { }); } - if (extensionService) { - extensionService.whenInstalledExtensionsRegistered().then(() => { + if (this._extensionService) { + this._extensionService.whenInstalledExtensionsRegistered().then(() => { this.cleanupProviders(); // If providers have already registered by this point, add them now (since onHandlerAdded will never fire) @@ -136,7 +136,7 @@ export class NotebookService extends Disposable implements INotebookService { }); } if (extensionManagementService) { - this._register(extensionManagementService.onDidUninstallExtension(({ identifier }) => this.removeContributedProvidersFromCache(identifier, extensionService))); + this._register(extensionManagementService.onDidUninstallExtension(({ identifier }) => this.removeContributedProvidersFromCache(identifier, this._extensionService))); } lifecycleService.onWillShutdown(() => this.shutdown()); @@ -404,15 +404,21 @@ export class NotebookService extends Disposable implements INotebookService { // Try get from actual provider, waiting on its registration if (providerDescriptor) { if (!providerDescriptor.instance) { + // Await extension registration before awaiting provider registration + try { + await this._extensionService.whenInstalledExtensionsRegistered; + } catch (error) { + console.error(error); + } instance = await this.waitOnProviderAvailability(providerDescriptor); } else { instance = providerDescriptor.instance; } } - // Fall back to default if this failed + // Fall back to default (SQL) if this failed if (!instance) { - providerDescriptor = this._providers.get(DEFAULT_NOTEBOOK_PROVIDER); + providerDescriptor = this._providers.get(SQL_NOTEBOOK_PROVIDER); instance = providerDescriptor ? providerDescriptor.instance : undefined; } @@ -424,8 +430,8 @@ export class NotebookService extends Disposable implements INotebookService { } private waitOnProviderAvailability(providerDescriptor: ProviderDescriptor, timeout?: number): Promise { - // Wait up to 10 seconds for the provider to be registered - timeout = timeout || 10000; + // Wait up to 30 seconds for the provider to be registered + timeout = timeout || 30000; let promises: Promise[] = [ providerDescriptor.instanceReady, new Promise((resolve, reject) => setTimeout(() => resolve(), timeout))