Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IWorkbenchContribution } from '../../../common/contributions.js';
7
import { IExtensionService } from '../../../services/extensions/common/extensions.js';
8
import { IProgressService, ProgressLocation } from '../../../../platform/progress/common/progress.js';
9
import { localize } from '../../../../nls.js';
10
import { IDisposable } from '../../../../base/common/lifecycle.js';
11
import { DeferredPromise, timeout } from '../../../../base/common/async.js';
12
import { ILogService } from '../../../../platform/log/common/log.js';
13
import { CancellationToken } from '../../../../base/common/cancellation.js';
14
15
export class ExtensionActivationProgress implements IWorkbenchContribution {
16
17
private readonly _listener: IDisposable;
18
19
constructor(
20
@IExtensionService extensionService: IExtensionService,
21
@IProgressService progressService: IProgressService,
22
@ILogService logService: ILogService,
23
) {
24
25
const options = {
26
location: ProgressLocation.Window,
27
title: localize('activation', "Activating Extensions...")
28
};
29
30
let deferred: DeferredPromise<any> | undefined;
31
let count = 0;
32
33
this._listener = extensionService.onWillActivateByEvent(e => {
34
logService.trace('onWillActivateByEvent: ', e.event);
35
36
if (!deferred) {
37
deferred = new DeferredPromise();
38
progressService.withProgress(options, _ => deferred!.p);
39
}
40
41
count++;
42
43
Promise.race([e.activation, timeout(5000, CancellationToken.None)]).finally(() => {
44
if (--count === 0) {
45
deferred!.complete(undefined);
46
deferred = undefined;
47
}
48
});
49
});
50
}
51
52
dispose(): void {
53
this._listener.dispose();
54
}
55
}
56
57