@codingame/monaco-vscode-extension-gallery-service-override 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (17) hide show
  1. package/extensionGallery.js +23 -8
  2. package/package.json +9 -9
  3. package/vscode/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.js +123 -163
  4. package/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService.js +1 -1
  5. package/vscode/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.js +42 -7
  6. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor.js +43 -827
  7. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.js +542 -0
  8. package/vscode/src/vs/workbench/contrib/extensions/browser/extensions.contribution.js +63 -54
  9. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList.js +0 -1
  10. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.js +10 -13
  11. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews.js +36 -8
  12. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.js +2 -2
  13. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.js +1 -5
  14. package/vscode/src/vs/workbench/contrib/extensions/browser/media/extension.css.js +1 -1
  15. package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css.js +1 -1
  16. package/vscode/src/vs/workbench/services/extensionManagement/common/extensionFeaturesManagemetService.js +234 -0
  17. package/vscode/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.js +2 -2
@@ -0,0 +1,542 @@
1
+ import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
+ import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vscode/vscode/vs/base/common/lifecycle';
3
+ import { $, append, clearNode } from 'vscode/vscode/vs/base/browser/dom';
4
+ import { Emitter, Event } from 'vscode/vscode/vs/base/common/event';
5
+ import { ExtensionIdentifier } from 'vscode/vscode/vs/platform/extensions/common/extensions';
6
+ import { SplitView, Sizing } from 'vscode/vscode/vs/base/browser/ui/splitview/splitview';
7
+ import { Extensions, IExtensionFeaturesManagementService } from 'vscode/vscode/vs/workbench/services/extensionManagement/common/extensionFeatures';
8
+ import { Registry } from 'vscode/vscode/vs/platform/registry/common/platform';
9
+ import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
10
+ import { localizeWithPath } from 'vscode/vscode/vs/nls';
11
+ import { WorkbenchList } from 'vscode/vscode/vs/platform/list/browser/listService';
12
+ import { getExtensionId } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
13
+ import { Button } from 'vscode/vscode/vs/base/browser/ui/button/button';
14
+ import { defaultButtonStyles, defaultKeybindingLabelStyles } from 'vscode/vscode/vs/platform/theme/browser/defaultStyles';
15
+ import { renderMarkdown } from 'vscode/vscode/vs/base/browser/markdownRenderer';
16
+ import { getErrorMessage, onUnexpectedError } from 'vscode/vscode/vs/base/common/errors';
17
+ import { IOpenerService } from 'vscode/vscode/vs/platform/opener/common/opener';
18
+ import { PANEL_SECTION_BORDER } from 'vscode/vscode/vs/workbench/common/theme';
19
+ import { Themable, IThemeService } from 'vscode/vscode/vs/platform/theme/common/themeService';
20
+ import { DomScrollableElement } from 'vscode/vscode/vs/base/browser/ui/scrollbar/scrollableElement';
21
+ import '../../../../../../../override/vs/platform/dialogs/common/dialogs.js';
22
+ import { ThemeIcon } from 'vscode/vscode/vs/base/common/themables';
23
+ import Severity from 'vscode/vscode/vs/base/common/severity';
24
+ import { errorIcon, warningIcon, infoIcon } from 'vscode/vscode/vs/workbench/contrib/extensions/browser/extensionsIcons';
25
+ import { SeverityIcon } from 'vscode/vscode/vs/platform/severityIcon/browser/severityIcon';
26
+ import { KeybindingLabel } from 'vscode/vscode/vs/base/browser/ui/keybindingLabel/keybindingLabel';
27
+ import { OS } from 'vscode/vscode/vs/base/common/platform';
28
+ import { MarkdownString, isMarkdownString } from 'vscode/vscode/vs/base/common/htmlContent';
29
+ import { Color } from 'vscode/vscode/vs/base/common/color';
30
+ import { IExtensionService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions';
31
+ import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
32
+ import { SyncDescriptor } from 'vscode/vscode/vs/platform/instantiation/common/descriptors';
33
+ import { fromNow } from 'vscode/vscode/vs/base/common/date';
34
+ import { ResolvedKeybinding } from 'vscode/vscode/vs/base/common/keybindings';
35
+ import { IDialogService } from 'vscode/vscode/vs/platform/dialogs/common/dialogs';
36
+
37
+ let RuntimeStatusMarkdownRenderer = class RuntimeStatusMarkdownRenderer extends Disposable {
38
+ static { this.ID = 'runtimeStatus'; }
39
+ constructor(extensionService, extensionFeaturesManagementService) {
40
+ super();
41
+ this.extensionService = extensionService;
42
+ this.extensionFeaturesManagementService = extensionFeaturesManagementService;
43
+ this.type = 'markdown';
44
+ }
45
+ shouldRender(manifest) {
46
+ const extensionId = ( new ExtensionIdentifier(getExtensionId(manifest.publisher, manifest.name)));
47
+ if (!( this.extensionService.extensions.some(e => ExtensionIdentifier.equals(e.identifier, extensionId)))) {
48
+ return false;
49
+ }
50
+ return !!manifest.main || !!manifest.browser;
51
+ }
52
+ render(manifest) {
53
+ const disposables = ( new DisposableStore());
54
+ const extensionId = ( new ExtensionIdentifier(getExtensionId(manifest.publisher, manifest.name)));
55
+ const emitter = disposables.add(( new Emitter()));
56
+ disposables.add(this.extensionService.onDidChangeExtensionsStatus(e => {
57
+ if (( e.some(extension => ExtensionIdentifier.equals(extension, extensionId)))) {
58
+ emitter.fire(this.getActivationData(manifest));
59
+ }
60
+ }));
61
+ disposables.add(this.extensionFeaturesManagementService.onDidChangeAccessData(e => emitter.fire(this.getActivationData(manifest))));
62
+ return {
63
+ onDidChange: emitter.event,
64
+ data: this.getActivationData(manifest),
65
+ dispose: () => disposables.dispose()
66
+ };
67
+ }
68
+ getActivationData(manifest) {
69
+ const data = ( new MarkdownString());
70
+ const extensionId = ( new ExtensionIdentifier(getExtensionId(manifest.publisher, manifest.name)));
71
+ const status = this.extensionService.getExtensionsStatus()[extensionId.value];
72
+ if (( this.extensionService.extensions.some(extension => ExtensionIdentifier.equals(extension.identifier, extensionId)))) {
73
+ data.appendMarkdown(`### ${( localizeWithPath(
74
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
75
+ 'activation',
76
+ "Activation"
77
+ ))}\n\n`);
78
+ if (status.activationTimes) {
79
+ if (status.activationTimes.activationReason.startup) {
80
+ data.appendMarkdown(`Activated on Startup: \`${status.activationTimes.activateCallTime}ms\``);
81
+ }
82
+ else {
83
+ data.appendMarkdown(`Activated by \`${status.activationTimes.activationReason.activationEvent}\` event: \`${status.activationTimes.activateCallTime}ms\``);
84
+ }
85
+ }
86
+ else {
87
+ data.appendMarkdown('Not yet activated');
88
+ }
89
+ if (status.runtimeErrors.length) {
90
+ data.appendMarkdown(`\n ### ${( localizeWithPath(
91
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
92
+ 'uncaught errors',
93
+ "Uncaught Errors ({0})",
94
+ status.runtimeErrors.length
95
+ ))}\n`);
96
+ for (const error of status.runtimeErrors) {
97
+ data.appendMarkdown(`$(${Codicon.error.id}) ${getErrorMessage(error)}\n\n`);
98
+ }
99
+ }
100
+ if (status.messages.length) {
101
+ data.appendMarkdown(`\n ### ${( localizeWithPath(
102
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
103
+ 'messaages',
104
+ "Messages ({0})",
105
+ status.messages.length
106
+ ))}\n`);
107
+ for (const message of status.messages) {
108
+ data.appendMarkdown(`$(${(message.type === Severity.Error ? Codicon.error : message.type === Severity.Warning ? Codicon.warning : Codicon.info).id}) ${message.message}\n\n`);
109
+ }
110
+ }
111
+ }
112
+ const features = ( Registry.as(Extensions.ExtensionFeaturesRegistry)).getExtensionFeatures();
113
+ for (const feature of features) {
114
+ const accessData = this.extensionFeaturesManagementService.getAccessData(extensionId, feature.id);
115
+ if (accessData) {
116
+ data.appendMarkdown(`\n ### ${feature.label}\n\n`);
117
+ const status = accessData?.current?.status;
118
+ if (status) {
119
+ if (status?.severity === Severity.Error) {
120
+ data.appendMarkdown(`$(${errorIcon.id}) ${status.message}\n\n`);
121
+ }
122
+ if (status?.severity === Severity.Warning) {
123
+ data.appendMarkdown(`$(${warningIcon.id}) ${status.message}\n\n`);
124
+ }
125
+ }
126
+ if (accessData?.totalCount) {
127
+ if (accessData.current) {
128
+ data.appendMarkdown(`${( localizeWithPath(
129
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
130
+ 'last request',
131
+ "Last Request: `{0}`",
132
+ fromNow(accessData.current.lastAccessed, true, true)
133
+ ))}\n\n`);
134
+ data.appendMarkdown(`${( localizeWithPath(
135
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
136
+ 'requests count session',
137
+ "Requests (Session) : `{0}`",
138
+ accessData.current.count
139
+ ))}\n\n`);
140
+ }
141
+ data.appendMarkdown(`${( localizeWithPath(
142
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
143
+ 'requests count total',
144
+ "Requests (Overall): `{0}`",
145
+ accessData.totalCount
146
+ ))}\n\n`);
147
+ }
148
+ }
149
+ }
150
+ return data;
151
+ }
152
+ };
153
+ RuntimeStatusMarkdownRenderer = ( __decorate([
154
+ ( __param(0, IExtensionService)),
155
+ ( __param(1, IExtensionFeaturesManagementService))
156
+ ], RuntimeStatusMarkdownRenderer));
157
+ const runtimeStatusFeature = {
158
+ id: RuntimeStatusMarkdownRenderer.ID,
159
+ label: ( localizeWithPath(
160
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
161
+ 'runtime',
162
+ "Runtime Status"
163
+ )),
164
+ access: {
165
+ canToggle: false
166
+ },
167
+ renderer: ( new SyncDescriptor(RuntimeStatusMarkdownRenderer)),
168
+ };
169
+ let ExtensionFeaturesTab = class ExtensionFeaturesTab extends Themable {
170
+ constructor(manifest, feature, themeService, instantiationService) {
171
+ super(themeService);
172
+ this.manifest = manifest;
173
+ this.feature = feature;
174
+ this.instantiationService = instantiationService;
175
+ this.featureView = this._register(( new MutableDisposable()));
176
+ this.layoutParticipants = [];
177
+ this.extensionId = ( new ExtensionIdentifier(getExtensionId(manifest.publisher, manifest.name)));
178
+ this.domNode = $('div.subcontent.feature-contributions');
179
+ this.create();
180
+ }
181
+ layout(height, width) {
182
+ this.layoutParticipants.forEach(participant => participant.layout(height, width));
183
+ }
184
+ create() {
185
+ const features = this.getFeatures();
186
+ if (features.length === 0) {
187
+ append($('.no-features'), this.domNode).textContent = ( localizeWithPath(
188
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
189
+ 'noFeatures',
190
+ "No features contributed."
191
+ ));
192
+ return;
193
+ }
194
+ const splitView = ( new SplitView(this.domNode, {
195
+ orientation: 1 ,
196
+ proportionalLayout: true
197
+ }));
198
+ this.layoutParticipants.push({
199
+ layout: (height, width) => {
200
+ splitView.el.style.height = `${height - 14}px`;
201
+ splitView.layout(width);
202
+ }
203
+ });
204
+ const featuresListContainer = $('.features-list-container');
205
+ const list = this.createFeaturesList(featuresListContainer);
206
+ list.splice(0, list.length, features);
207
+ const featureViewContainer = $('.feature-view-container');
208
+ this._register(list.onDidChangeSelection(e => {
209
+ const feature = e.elements[0];
210
+ if (feature) {
211
+ this.showFeatureView(feature, featureViewContainer);
212
+ }
213
+ }));
214
+ const index = this.feature ? features.findIndex(f => f.id === this.feature) : 0;
215
+ list.setSelection([index === -1 ? 0 : index]);
216
+ splitView.addView({
217
+ onDidChange: Event.None,
218
+ element: featuresListContainer,
219
+ minimumSize: 100,
220
+ maximumSize: Number.POSITIVE_INFINITY,
221
+ layout: (width, _, height) => {
222
+ featuresListContainer.style.width = `${width}px`;
223
+ list.layout(height, width);
224
+ }
225
+ }, 200, undefined, true);
226
+ splitView.addView({
227
+ onDidChange: Event.None,
228
+ element: featureViewContainer,
229
+ minimumSize: 500,
230
+ maximumSize: Number.POSITIVE_INFINITY,
231
+ layout: (width, _, height) => {
232
+ featureViewContainer.style.width = `${width}px`;
233
+ this.featureViewDimension = { height, width };
234
+ this.layoutFeatureView();
235
+ }
236
+ }, Sizing.Distribute, undefined, true);
237
+ splitView.style({
238
+ separatorBorder: this.theme.getColor(PANEL_SECTION_BORDER)
239
+ });
240
+ }
241
+ createFeaturesList(container) {
242
+ const renderer = this.instantiationService.createInstance(ExtensionFeatureItemRenderer, this.extensionId);
243
+ const delegate = ( new ExtensionFeatureItemDelegate());
244
+ const list = this.instantiationService.createInstance(WorkbenchList, 'ExtensionFeaturesList', append(container, $('.features-list-wrapper')), delegate, [renderer], {
245
+ multipleSelectionSupport: false,
246
+ setRowLineHeight: false,
247
+ horizontalScrolling: false,
248
+ accessibilityProvider: {
249
+ getAriaLabel(extensionFeature) {
250
+ return extensionFeature?.label ?? '';
251
+ },
252
+ getWidgetAriaLabel() {
253
+ return ( localizeWithPath(
254
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
255
+ 'extension features list',
256
+ "Extension Features"
257
+ ));
258
+ }
259
+ },
260
+ openOnSingleClick: true
261
+ });
262
+ return list;
263
+ }
264
+ layoutFeatureView() {
265
+ this.featureView.value?.layout(this.featureViewDimension?.height, this.featureViewDimension?.width);
266
+ }
267
+ showFeatureView(feature, container) {
268
+ if (this.featureView.value?.feature.id === feature.id) {
269
+ return;
270
+ }
271
+ clearNode(container);
272
+ this.featureView.value = this.instantiationService.createInstance(ExtensionFeatureView, this.extensionId, this.manifest, feature);
273
+ container.appendChild(this.featureView.value.domNode);
274
+ this.layoutFeatureView();
275
+ }
276
+ getFeatures() {
277
+ const features = ( Registry.as(Extensions.ExtensionFeaturesRegistry))
278
+ .getExtensionFeatures().filter(feature => {
279
+ const renderer = this.getRenderer(feature);
280
+ const shouldRender = renderer?.shouldRender(this.manifest);
281
+ renderer?.dispose();
282
+ return shouldRender;
283
+ }).sort((a, b) => a.label.localeCompare(b.label));
284
+ const renderer = this.getRenderer(runtimeStatusFeature);
285
+ if (renderer?.shouldRender(this.manifest)) {
286
+ features.splice(0, 0, runtimeStatusFeature);
287
+ }
288
+ renderer?.dispose();
289
+ return features;
290
+ }
291
+ getRenderer(feature) {
292
+ return feature.renderer ? this.instantiationService.createInstance(feature.renderer) : undefined;
293
+ }
294
+ };
295
+ ExtensionFeaturesTab = ( __decorate([
296
+ ( __param(2, IThemeService)),
297
+ ( __param(3, IInstantiationService))
298
+ ], ExtensionFeaturesTab));
299
+ class ExtensionFeatureItemDelegate {
300
+ getHeight() { return 22; }
301
+ getTemplateId() { return 'extensionFeatureDescriptor'; }
302
+ }
303
+ let ExtensionFeatureItemRenderer = class ExtensionFeatureItemRenderer {
304
+ constructor(extensionId, extensionFeaturesManagementService) {
305
+ this.extensionId = extensionId;
306
+ this.extensionFeaturesManagementService = extensionFeaturesManagementService;
307
+ this.templateId = 'extensionFeatureDescriptor';
308
+ }
309
+ renderTemplate(container) {
310
+ container.classList.add('extension-feature-list-item');
311
+ const label = append(container, $('.extension-feature-label'));
312
+ const disabledElement = append(container, $('.extension-feature-disabled-label'));
313
+ disabledElement.textContent = ( localizeWithPath(
314
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
315
+ 'revoked',
316
+ "No Access"
317
+ ));
318
+ const statusElement = append(container, $('.extension-feature-status'));
319
+ return { label, disabledElement, statusElement, disposables: ( new DisposableStore()) };
320
+ }
321
+ renderElement(element, index, templateData) {
322
+ templateData.disposables.clear();
323
+ templateData.label.textContent = element.label;
324
+ templateData.disabledElement.style.display = element.id === runtimeStatusFeature.id || this.extensionFeaturesManagementService.isEnabled(this.extensionId, element.id) ? 'none' : 'inherit';
325
+ templateData.disposables.add(this.extensionFeaturesManagementService.onDidChangeEnablement(({ extension, featureId, enabled }) => {
326
+ if (ExtensionIdentifier.equals(extension, this.extensionId) && featureId === element.id) {
327
+ templateData.disabledElement.style.display = enabled ? 'none' : 'inherit';
328
+ }
329
+ }));
330
+ const statusElementClassName = templateData.statusElement.className;
331
+ const updateStatus = () => {
332
+ const accessData = this.extensionFeaturesManagementService.getAccessData(this.extensionId, element.id);
333
+ if (accessData?.current?.status) {
334
+ templateData.statusElement.style.display = 'inherit';
335
+ templateData.statusElement.className = `${statusElementClassName} ${SeverityIcon.className(accessData.current.status.severity)}`;
336
+ }
337
+ else {
338
+ templateData.statusElement.style.display = 'none';
339
+ }
340
+ };
341
+ updateStatus();
342
+ templateData.disposables.add(this.extensionFeaturesManagementService.onDidChangeAccessData(({ extension, featureId }) => {
343
+ if (ExtensionIdentifier.equals(extension, this.extensionId) && featureId === element.id) {
344
+ updateStatus();
345
+ }
346
+ }));
347
+ }
348
+ disposeElement(element, index, templateData, height) {
349
+ templateData.disposables.dispose();
350
+ }
351
+ disposeTemplate(templateData) {
352
+ templateData.disposables.dispose();
353
+ }
354
+ };
355
+ ExtensionFeatureItemRenderer = ( __decorate([
356
+ ( __param(1, IExtensionFeaturesManagementService))
357
+ ], ExtensionFeatureItemRenderer));
358
+ let ExtensionFeatureView = class ExtensionFeatureView extends Disposable {
359
+ constructor(extensionId, manifest, feature, openerService, instantiationService, extensionFeaturesManagementService, dialogService) {
360
+ super();
361
+ this.extensionId = extensionId;
362
+ this.manifest = manifest;
363
+ this.feature = feature;
364
+ this.openerService = openerService;
365
+ this.instantiationService = instantiationService;
366
+ this.extensionFeaturesManagementService = extensionFeaturesManagementService;
367
+ this.dialogService = dialogService;
368
+ this.layoutParticipants = [];
369
+ this.domNode = $('.extension-feature-content');
370
+ this.create(this.domNode);
371
+ }
372
+ create(content) {
373
+ const header = append(content, $('.feature-header'));
374
+ const title = append(header, $('.feature-title'));
375
+ title.textContent = this.feature.label;
376
+ if (this.feature.access.canToggle) {
377
+ const actionsContainer = append(header, $('.feature-actions'));
378
+ const button = ( new Button(actionsContainer, defaultButtonStyles));
379
+ this.updateButtonLabel(button);
380
+ this._register(this.extensionFeaturesManagementService.onDidChangeEnablement(({ extension, featureId }) => {
381
+ if (ExtensionIdentifier.equals(extension, this.extensionId) && featureId === this.feature.id) {
382
+ this.updateButtonLabel(button);
383
+ }
384
+ }));
385
+ this._register(button.onDidClick(async () => {
386
+ const enabled = this.extensionFeaturesManagementService.isEnabled(this.extensionId, this.feature.id);
387
+ const confirmationResult = await this.dialogService.confirm({
388
+ title: ( localizeWithPath(
389
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
390
+ 'accessExtensionFeature',
391
+ "Enable '{0}' Feature",
392
+ this.feature.label
393
+ )),
394
+ message: enabled
395
+ ? ( localizeWithPath(
396
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
397
+ 'disableAccessExtensionFeatureMessage',
398
+ "Would you like to revoke '{0}' extension to access '{1}' feature?",
399
+ this.manifest.displayName ?? this.extensionId.value,
400
+ this.feature.label
401
+ ))
402
+ : ( localizeWithPath(
403
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
404
+ 'enableAccessExtensionFeatureMessage',
405
+ "Would you like to allow '{0}' extension to access '{1}' feature?",
406
+ this.manifest.displayName ?? this.extensionId.value,
407
+ this.feature.label
408
+ )),
409
+ custom: true,
410
+ primaryButton: enabled ? ( localizeWithPath(
411
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
412
+ 'revoke',
413
+ "Revoke Access"
414
+ )) : ( localizeWithPath(
415
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
416
+ 'grant',
417
+ "Allow Access"
418
+ )),
419
+ cancelButton: ( localizeWithPath(
420
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
421
+ 'cancel',
422
+ "Cancel"
423
+ )),
424
+ });
425
+ if (confirmationResult.confirmed) {
426
+ this.extensionFeaturesManagementService.setEnablement(this.extensionId, this.feature.id, !enabled);
427
+ }
428
+ }));
429
+ }
430
+ const body = append(content, $('.feature-body'));
431
+ const bodyContent = $('.feature-body-content');
432
+ const scrollableContent = this._register(( new DomScrollableElement(bodyContent, {})));
433
+ append(body, scrollableContent.getDomNode());
434
+ this.layoutParticipants.push({ layout: () => scrollableContent.scanDomNode() });
435
+ scrollableContent.scanDomNode();
436
+ if (this.feature.description) {
437
+ const description = append(bodyContent, $('.feature-description'));
438
+ description.textContent = this.feature.description;
439
+ }
440
+ const accessData = this.extensionFeaturesManagementService.getAccessData(this.extensionId, this.feature.id);
441
+ if (accessData?.current?.status) {
442
+ append(bodyContent, $('.feature-status', undefined, $(`span${ThemeIcon.asCSSSelector(accessData.current.status.severity === Severity.Error ? errorIcon : accessData.current.status.severity === Severity.Warning ? warningIcon : infoIcon)}`, undefined), $('span', undefined, accessData.current.status.message)));
443
+ }
444
+ const featureContentElement = append(bodyContent, $('.feature-content'));
445
+ if (this.feature.renderer) {
446
+ const renderer = this.instantiationService.createInstance(this.feature.renderer);
447
+ if (renderer.type === 'table') {
448
+ this.renderTableData(featureContentElement, renderer);
449
+ }
450
+ else if (renderer.type === 'markdown') {
451
+ this.renderMarkdownData(featureContentElement, renderer);
452
+ }
453
+ }
454
+ }
455
+ updateButtonLabel(button) {
456
+ button.label = this.extensionFeaturesManagementService.isEnabled(this.extensionId, this.feature.id) ? ( localizeWithPath(
457
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
458
+ 'revoke',
459
+ "Revoke Access"
460
+ )) : ( localizeWithPath(
461
+ 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab',
462
+ 'enable',
463
+ "Allow Access"
464
+ ));
465
+ }
466
+ renderTableData(container, renderer) {
467
+ const tableData = this._register(renderer.render(this.manifest));
468
+ if (tableData.onDidChange) {
469
+ this._register(tableData.onDidChange(data => {
470
+ clearNode(container);
471
+ this.renderTable(data, container);
472
+ }));
473
+ }
474
+ this.renderTable(tableData.data, container);
475
+ }
476
+ renderTable(tableData, container) {
477
+ append(container, $('table', undefined, $('tr', undefined, ...( tableData.headers.map(header => $('th', undefined, header)))), ...( tableData.rows
478
+ .map(row => {
479
+ return $('tr', undefined, ...( row.map(rowData => {
480
+ if (typeof rowData === 'string') {
481
+ return $('td', undefined, rowData);
482
+ }
483
+ const data = Array.isArray(rowData) ? rowData : [rowData];
484
+ return $('td', undefined, ...( data.map(item => {
485
+ const result = [];
486
+ if (isMarkdownString(rowData)) {
487
+ const element = $('', undefined);
488
+ this.renderMarkdown(rowData, element);
489
+ result.push(element);
490
+ }
491
+ else if (item instanceof ResolvedKeybinding) {
492
+ const element = $('');
493
+ const kbl = ( new KeybindingLabel(element, OS, defaultKeybindingLabelStyles));
494
+ kbl.set(item);
495
+ result.push(element);
496
+ }
497
+ else if (item instanceof Color) {
498
+ result.push($('span', { class: 'colorBox', style: 'background-color: ' + Color.Format.CSS.format(item) }, ''));
499
+ result.push($('code', undefined, Color.Format.CSS.formatHex(item)));
500
+ }
501
+ return result;
502
+ })).flat());
503
+ })));
504
+ }))));
505
+ }
506
+ renderMarkdownData(container, renderer) {
507
+ container.classList.add('markdown');
508
+ const markdownData = this._register(renderer.render(this.manifest));
509
+ if (markdownData.onDidChange) {
510
+ this._register(markdownData.onDidChange(data => {
511
+ clearNode(container);
512
+ this.renderMarkdown(data, container);
513
+ }));
514
+ }
515
+ this.renderMarkdown(markdownData.data, container);
516
+ }
517
+ renderMarkdown(markdown, container) {
518
+ const { element, dispose } = renderMarkdown({
519
+ value: markdown.value,
520
+ isTrusted: markdown.isTrusted,
521
+ supportThemeIcons: true
522
+ }, {
523
+ actionHandler: {
524
+ callback: (content) => this.openerService.open(content, { allowCommands: !!markdown.isTrusted }).catch(onUnexpectedError),
525
+ disposables: this._store
526
+ },
527
+ });
528
+ this._register(toDisposable(dispose));
529
+ append(container, element);
530
+ }
531
+ layout(height, width) {
532
+ this.layoutParticipants.forEach(p => p.layout(height, width));
533
+ }
534
+ };
535
+ ExtensionFeatureView = ( __decorate([
536
+ ( __param(3, IOpenerService)),
537
+ ( __param(4, IInstantiationService)),
538
+ ( __param(5, IExtensionFeaturesManagementService)),
539
+ ( __param(6, IDialogService))
540
+ ], ExtensionFeatureView));
541
+
542
+ export { ExtensionFeaturesTab };