diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index f9e6a1ec67f489fe634f38c085ce898f86538aeb..5c7cc933f66b7b02b97e54ea467590dfd44a2bfb 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -34,13 +34,14 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'v import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { KeymapExtensions, BetterMergeDisabled } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; import { adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { GalleryExtensionsHandler, ExtensionsHandler } from 'vs/workbench/parts/extensions/browser/extensionsQuickOpen'; import { EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { RuntimeExtensionsEditor, RuntimeExtensionsInput, ShowRuntimeExtensionsAction } from 'vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor'; +import { EditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; // Singletons registerSingleton(IExtensionGalleryService, ExtensionGalleryService); @@ -89,6 +90,8 @@ const editorDescriptor = new EditorDescriptor( Registry.as(EditorExtensions.Editors) .registerEditor(editorDescriptor, [new SyncDescriptor(ExtensionsInput)]); +// Running Extensions Editor + const runtimeExtensionsEditorDescriptor = new EditorDescriptor( RuntimeExtensionsEditor, RuntimeExtensionsEditor.ID, @@ -98,6 +101,18 @@ const runtimeExtensionsEditorDescriptor = new EditorDescriptor( Registry.as(EditorExtensions.Editors) .registerEditor(runtimeExtensionsEditorDescriptor, [new SyncDescriptor(RuntimeExtensionsInput)]); +class RuntimeExtensionsInputFactory implements IEditorInputFactory { + serialize(editorInput: EditorInput): string { + return ''; + } + deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput { + return new RuntimeExtensionsInput(); + } +} + +Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(RuntimeExtensionsInput.ID, RuntimeExtensionsInputFactory); + + // Viewlet const viewletDescriptor = new ViewletDescriptor( ExtensionsViewlet, diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css b/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css index 3f5579b4e5e54c00257995f234f0d1ded46356e7..f178a3412a51c29d2706354f115ac81c149f5b53 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css @@ -3,9 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +.runtime-extensions-editor .extension { + display: flex; + padding-left: 20px; +} + +.runtime-extensions-editor .extension .desc { + flex: 1; +} + +.runtime-extensions-editor .extension .desc .name { + font-weight: bold; +} + +.runtime-extensions-editor .extension .desc .time-label { + padding-left: 4px; +} + .runtime-extensions-editor .icon { width: 42px; height: 42px; padding: 10px 14px 10px 0; - float: left; } diff --git a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts index 2463a713843b4e5b0bfacc1ac3a6fa98c58139dd..34e06d06ad3c80d99489bafd5134466be1f09e8f 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -62,7 +62,10 @@ export class RuntimeExtensionsEditor extends BaseEditor { this._updateExtensions(); this._extensionService.getExtensions().then((extensions) => { - this._extensionsDescriptions = extensions; + // We only deal with extensions with source code! + this._extensionsDescriptions = extensions.filter((extension) => { + return !!extension.main; + }); this._updateExtensions(); }); this._register(this._extensionService.onDidChangeExtensionsStatus(() => this._updateExtensions())); @@ -97,7 +100,7 @@ export class RuntimeExtensionsEditor extends BaseEditor { }; } - return result; + return result.filter((element) => element.status.activationTimes); } protected createEditor(parent: Builder): void { @@ -121,6 +124,7 @@ export class RuntimeExtensionsEditor extends BaseEditor { element: HTMLElement; icon: HTMLImageElement; name: HTMLElement; + time: HTMLElement; disposables: IDisposable[]; elementDisposables: IDisposable[]; } @@ -130,7 +134,12 @@ export class RuntimeExtensionsEditor extends BaseEditor { renderTemplate: (root: HTMLElement): IRuntimeExtensionTemplateData => { const element = append(root, $('.extension')); const icon = append(element, $('img.icon')); - const name = append(element, $('span.name')); + + const desc = append(element, $('div.desc')); + const name = append(desc, $('div.name')); + const timeContainer = append(desc, $('div.time')); + append(timeContainer, $('span.octicon.octicon-clock')); + const time = append(timeContainer, $('span.time-label')); const actionbar = new ActionBar(element, { animated: false, actionItemProvider: (action: Action) => { @@ -150,6 +159,7 @@ export class RuntimeExtensionsEditor extends BaseEditor { element, icon, name, + time, disposables, elementDisposables: [] }; @@ -167,6 +177,10 @@ export class RuntimeExtensionsEditor extends BaseEditor { data.icon.src = element.marketplaceInfo.iconUrl; data.name.textContent = element.marketplaceInfo.displayName; + + const activationTimes = element.status.activationTimes; + let syncTime = activationTimes.codeLoadingTime + activationTimes.activateCallTime; + data.time.textContent = `${syncTime}ms`; }, disposeTemplate: (data: IRuntimeExtensionTemplateData): void => { diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 6b574484399b2fcda0be7b698893986924137f47..df7fb5647bc836c796f49a2df8bf68eddccf7f00 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -304,14 +304,16 @@ export class ExtensionService extends Disposable implements IExtensionService { public getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { let result: { [id: string]: IExtensionsStatus; } = Object.create(null); - const extensions = this._registry.getAllExtensionDescriptions(); - for (let i = 0, len = extensions.length; i < len; i++) { - const extension = extensions[i]; - const id = extension.id; - result[id] = { - messages: this._extensionsMessages[id], - activationTimes: this._extensionHostProcessActivationTimes[id] - }; + if (this._registry) { + const extensions = this._registry.getAllExtensionDescriptions(); + for (let i = 0, len = extensions.length; i < len; i++) { + const extension = extensions[i]; + const id = extension.id; + result[id] = { + messages: this._extensionsMessages[id], + activationTimes: this._extensionHostProcessActivationTimes[id] + }; + } } return result; }