Path: blob/main/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IWorkbenchContribution } from '../../../common/contributions.js';6import { IExtensionService } from '../../../services/extensions/common/extensions.js';7import { IProgressService, ProgressLocation } from '../../../../platform/progress/common/progress.js';8import { localize } from '../../../../nls.js';9import { IDisposable } from '../../../../base/common/lifecycle.js';10import { DeferredPromise, timeout } from '../../../../base/common/async.js';11import { ILogService } from '../../../../platform/log/common/log.js';12import { CancellationToken } from '../../../../base/common/cancellation.js';1314export class ExtensionActivationProgress implements IWorkbenchContribution {1516private readonly _listener: IDisposable;1718constructor(19@IExtensionService extensionService: IExtensionService,20@IProgressService progressService: IProgressService,21@ILogService logService: ILogService,22) {2324const options = {25location: ProgressLocation.Window,26title: localize('activation', "Activating Extensions...")27};2829let deferred: DeferredPromise<any> | undefined;30let count = 0;3132this._listener = extensionService.onWillActivateByEvent(e => {33logService.trace('onWillActivateByEvent: ', e.event);3435if (!deferred) {36deferred = new DeferredPromise();37progressService.withProgress(options, _ => deferred!.p);38}3940count++;4142Promise.race([e.activation, timeout(5000, CancellationToken.None)]).finally(() => {43if (--count === 0) {44deferred!.complete(undefined);45deferred = undefined;46}47});48});49}5051dispose(): void {52this._listener.dispose();53}54}555657