mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-30 00:30:29 -04:00
Merge from vscode cfc1ab4c5f816765b91fb7ead3c3427a7c8581a3
This commit is contained in:
@@ -84,7 +84,9 @@ class NavBar extends Disposable {
|
||||
private _onChange = this._register(new Emitter<{ id: string | null, focus: boolean }>());
|
||||
get onChange(): Event<{ id: string | null, focus: boolean }> { return this._onChange.event; }
|
||||
|
||||
private currentId: string | null = null;
|
||||
private _currentId: string | null = null;
|
||||
get currentId(): string | null { return this._currentId; }
|
||||
|
||||
private actions: Action[];
|
||||
private actionbar: ActionBar;
|
||||
|
||||
@@ -114,11 +116,11 @@ class NavBar extends Disposable {
|
||||
}
|
||||
|
||||
update(): void {
|
||||
this._update(this.currentId);
|
||||
this._update(this._currentId);
|
||||
}
|
||||
|
||||
_update(id: string | null = this.currentId, focus?: boolean): Promise<void> {
|
||||
this.currentId = id;
|
||||
_update(id: string | null = this._currentId, focus?: boolean): Promise<void> {
|
||||
this._currentId = id;
|
||||
this._onChange.fire({ id, focus: !!focus });
|
||||
this.actions.forEach(a => a.checked = a.id === id);
|
||||
return Promise.resolve(undefined);
|
||||
@@ -309,12 +311,12 @@ export class ExtensionEditor extends BaseEditor {
|
||||
|
||||
async setInput(input: ExtensionsInput, options: EditorOptions | undefined, token: CancellationToken): Promise<void> {
|
||||
if (this.template) {
|
||||
await this.updateTemplate(input, this.template);
|
||||
await this.updateTemplate(input, this.template, !!options?.preserveFocus);
|
||||
}
|
||||
return super.setInput(input, options, token);
|
||||
}
|
||||
|
||||
private async updateTemplate(input: ExtensionsInput, template: IExtensionEditorTemplate): Promise<void> {
|
||||
private async updateTemplate(input: ExtensionsInput, template: IExtensionEditorTemplate, preserveFocus: boolean): Promise<void> {
|
||||
const runningExtensions = await this.extensionService.getExtensions();
|
||||
const colorThemes = await this.workbenchThemeService.getColorThemes();
|
||||
const fileIconThemes = await this.workbenchThemeService.getFileIconThemes();
|
||||
@@ -444,31 +446,34 @@ export class ExtensionEditor extends BaseEditor {
|
||||
template.content.innerHTML = ''; // Clear content before setting navbar actions.
|
||||
|
||||
template.navbar.clear();
|
||||
template.navbar.onChange(e => this.onNavbarChange(extension, e, template), this, this.transientDisposables);
|
||||
|
||||
if (extension.hasReadme()) {
|
||||
template.navbar.push(NavbarSection.Readme, localize('details', "Details"), localize('detailstooltip', "Extension details, rendered from the extension's 'README.md' file"));
|
||||
}
|
||||
this.extensionManifest.get()
|
||||
.promise
|
||||
.then(manifest => {
|
||||
if (manifest) {
|
||||
combinedInstallAction.manifest = manifest;
|
||||
}
|
||||
if (extension.extensionPack.length) {
|
||||
template.navbar.push(NavbarSection.ExtensionPack, localize('extensionPack', "Extension Pack"), localize('extensionsPack', "Set of extensions that can be installed together"));
|
||||
}
|
||||
if (manifest && manifest.contributes) {
|
||||
template.navbar.push(NavbarSection.Contributions, localize('contributions', "Feature Contributions"), localize('contributionstooltip', "Lists contributions to VS Code by this extension"));
|
||||
}
|
||||
if (extension.hasChangelog()) {
|
||||
template.navbar.push(NavbarSection.Changelog, localize('changelog', "Changelog"), localize('changelogtooltip', "Extension update history, rendered from the extension's 'CHANGELOG.md' file"));
|
||||
}
|
||||
if (extension.dependencies.length) {
|
||||
template.navbar.push(NavbarSection.Dependencies, localize('dependencies', "Dependencies"), localize('dependenciestooltip', "Lists extensions this extension depends on"));
|
||||
}
|
||||
this.editorLoadComplete = true;
|
||||
});
|
||||
|
||||
const manifest = await this.extensionManifest.get().promise;
|
||||
if (manifest) {
|
||||
combinedInstallAction.manifest = manifest;
|
||||
}
|
||||
if (extension.extensionPack.length) {
|
||||
template.navbar.push(NavbarSection.ExtensionPack, localize('extensionPack', "Extension Pack"), localize('extensionsPack', "Set of extensions that can be installed together"));
|
||||
}
|
||||
if (manifest && manifest.contributes) {
|
||||
template.navbar.push(NavbarSection.Contributions, localize('contributions', "Feature Contributions"), localize('contributionstooltip', "Lists contributions to VS Code by this extension"));
|
||||
}
|
||||
if (extension.hasChangelog()) {
|
||||
template.navbar.push(NavbarSection.Changelog, localize('changelog', "Changelog"), localize('changelogtooltip', "Extension update history, rendered from the extension's 'CHANGELOG.md' file"));
|
||||
}
|
||||
if (extension.dependencies.length) {
|
||||
template.navbar.push(NavbarSection.Dependencies, localize('dependencies', "Dependencies"), localize('dependenciestooltip', "Lists extensions this extension depends on"));
|
||||
}
|
||||
|
||||
if (template.navbar.currentId) {
|
||||
this.onNavbarChange(extension, { id: template.navbar.currentId, focus: !preserveFocus }, template);
|
||||
}
|
||||
template.navbar.onChange(e => this.onNavbarChange(extension, e, template), this, this.transientDisposables);
|
||||
|
||||
this.editorLoadComplete = true;
|
||||
}
|
||||
|
||||
private setSubText(extension: IExtension, reloadAction: ReloadAction, template: IExtensionEditorTemplate): void {
|
||||
@@ -528,6 +533,7 @@ export class ExtensionEditor extends BaseEditor {
|
||||
if (e.enabled === false) {
|
||||
hide(template.subtextContainer);
|
||||
}
|
||||
this.layout();
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -598,18 +604,18 @@ export class ExtensionEditor extends BaseEditor {
|
||||
try {
|
||||
const body = await this.renderMarkdown(cacheResult, template);
|
||||
|
||||
const webviewElement = this.contentDisposables.add(this.webviewService.createWebviewEditorOverlay('extensionEditor', {
|
||||
const webview = this.contentDisposables.add(this.webviewService.createWebviewOverlay('extensionEditor', {
|
||||
enableFindWidget: true,
|
||||
}, {}));
|
||||
|
||||
webviewElement.claim(this);
|
||||
webviewElement.layoutWebviewOverElement(template.content);
|
||||
webviewElement.html = body;
|
||||
webview.claim(this);
|
||||
webview.layoutWebviewOverElement(template.content);
|
||||
webview.html = body;
|
||||
|
||||
this.contentDisposables.add(webviewElement.onDidFocus(() => this.fireOnDidFocus()));
|
||||
this.contentDisposables.add(webview.onDidFocus(() => this.fireOnDidFocus()));
|
||||
const removeLayoutParticipant = arrays.insert(this.layoutParticipants, {
|
||||
layout: () => {
|
||||
webviewElement.layoutWebviewOverElement(template.content);
|
||||
webview.layoutWebviewOverElement(template.content);
|
||||
}
|
||||
});
|
||||
this.contentDisposables.add(toDisposable(removeLayoutParticipant));
|
||||
@@ -617,15 +623,15 @@ export class ExtensionEditor extends BaseEditor {
|
||||
let isDisposed = false;
|
||||
this.contentDisposables.add(toDisposable(() => { isDisposed = true; }));
|
||||
|
||||
this.contentDisposables.add(this.themeService.onThemeChange(async () => {
|
||||
this.contentDisposables.add(this.themeService.onDidColorThemeChange(async () => {
|
||||
// Render again since syntax highlighting of code blocks may have changed
|
||||
const body = await this.renderMarkdown(cacheResult, template);
|
||||
if (!isDisposed) { // Make sure we weren't disposed of in the meantime
|
||||
webviewElement.html = body;
|
||||
webview.html = body;
|
||||
}
|
||||
}));
|
||||
|
||||
this.contentDisposables.add(webviewElement.onDidClickLink(link => {
|
||||
this.contentDisposables.add(webview.onDidClickLink(link => {
|
||||
if (!link) {
|
||||
return;
|
||||
}
|
||||
@@ -637,7 +643,7 @@ export class ExtensionEditor extends BaseEditor {
|
||||
}
|
||||
}, null, this.contentDisposables));
|
||||
|
||||
return webviewElement;
|
||||
return webview;
|
||||
} catch (e) {
|
||||
const p = append(template.content, $('p.nocontent'));
|
||||
p.textContent = noContentCopy;
|
||||
@@ -1224,7 +1230,7 @@ export class ExtensionEditor extends BaseEditor {
|
||||
$('th', undefined, localize('schema', "Schema"))
|
||||
),
|
||||
...contrib.map(v => $('tr', undefined,
|
||||
$('td', undefined, $('code', undefined, v.fileMatch)),
|
||||
$('td', undefined, $('code', undefined, Array.isArray(v.fileMatch) ? v.fileMatch.join(', ') : v.fileMatch)),
|
||||
$('td', undefined, v.url)
|
||||
))));
|
||||
|
||||
@@ -1484,9 +1490,9 @@ registerAction2(class StartExtensionEditorFindPreviousAction extends Action2 {
|
||||
});
|
||||
|
||||
function getExtensionEditor(accessor: ServicesAccessor): ExtensionEditor | null {
|
||||
const activeControl = accessor.get(IEditorService).activeControl as ExtensionEditor;
|
||||
if (activeControl instanceof ExtensionEditor) {
|
||||
return activeControl;
|
||||
const activeEditorPane = accessor.get(IEditorService).activeEditorPane;
|
||||
if (activeEditorPane instanceof ExtensionEditor) {
|
||||
return activeEditorPane;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ import {
|
||||
import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput';
|
||||
import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor';
|
||||
import { StatusUpdater, MaliciousExtensionChecker, ExtensionsViewletViewsContribution, ExtensionsViewPaneContainer } from 'vs/workbench/contrib/extensions/browser/extensionsViewlet';
|
||||
import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen';
|
||||
import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen';
|
||||
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
|
||||
import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry';
|
||||
import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate';
|
||||
@@ -50,6 +50,8 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||
import { CONTEXT_SYNC_ENABLEMENT } from 'vs/platform/userDataSync/common/userDataSync';
|
||||
import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/quickAccess';
|
||||
import { InstallExtensionQuickAccessProvider, ManageExtensionsQuickAccessProvider } from 'vs/workbench/contrib/extensions/browser/extensionsQuickAccess';
|
||||
|
||||
// Singletons
|
||||
registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService);
|
||||
@@ -59,7 +61,7 @@ Registry.as<IOutputChannelRegistry>(OutputExtensions.OutputChannels)
|
||||
.registerChannel({ id: ExtensionsChannelId, label: ExtensionsLabel, log: false });
|
||||
|
||||
// Quickopen
|
||||
Registry.as<IQuickOpenRegistry>(Extensions.Quickopen).registerQuickOpenHandler(
|
||||
Registry.as<IQuickOpenRegistry>(QuickOpenExtensions.Quickopen).registerQuickOpenHandler(
|
||||
QuickOpenHandlerDescriptor.create(
|
||||
ExtensionsHandler,
|
||||
ExtensionsHandler.ID,
|
||||
@@ -70,6 +72,14 @@ Registry.as<IQuickOpenRegistry>(Extensions.Quickopen).registerQuickOpenHandler(
|
||||
)
|
||||
);
|
||||
|
||||
// Quick Access
|
||||
Registry.as<IQuickAccessRegistry>(Extensions.Quickaccess).registerQuickAccessProvider({
|
||||
ctor: ManageExtensionsQuickAccessProvider,
|
||||
prefix: ManageExtensionsQuickAccessProvider.PREFIX,
|
||||
placeholder: localize('manageExtensionsQuickAccessPlaceholder', "Press Enter to manage extensions."),
|
||||
helpEntries: [{ description: localize('manageExtensionsHelp', "Manage Extensions"), needsEditor: false }]
|
||||
});
|
||||
|
||||
// Editor
|
||||
Registry.as<IEditorRegistry>(EditorExtensions.Editors).registerEditor(
|
||||
EditorDescriptor.create(
|
||||
@@ -484,7 +494,7 @@ class ExtensionsContributions implements IWorkbenchContribution {
|
||||
const canManageExtensions = extensionManagementServerService.localExtensionManagementServer || extensionManagementServerService.remoteExtensionManagementServer;
|
||||
|
||||
if (canManageExtensions) {
|
||||
Registry.as<IQuickOpenRegistry>(Extensions.Quickopen).registerQuickOpenHandler(
|
||||
Registry.as<IQuickOpenRegistry>(QuickOpenExtensions.Quickopen).registerQuickOpenHandler(
|
||||
QuickOpenHandlerDescriptor.create(
|
||||
GalleryExtensionsHandler,
|
||||
GalleryExtensionsHandler.ID,
|
||||
@@ -494,6 +504,13 @@ class ExtensionsContributions implements IWorkbenchContribution {
|
||||
true
|
||||
)
|
||||
);
|
||||
|
||||
Registry.as<IQuickAccessRegistry>(Extensions.Quickaccess).registerQuickAccessProvider({
|
||||
ctor: InstallExtensionQuickAccessProvider,
|
||||
prefix: InstallExtensionQuickAccessProvider.PREFIX,
|
||||
placeholder: localize('installExtensionQuickAccessPlaceholder', "Type the name of an extension to install or search."),
|
||||
helpEntries: [{ description: localize('installExtensionQuickAccessHelp', "Install or Search Extensions"), needsEditor: false }]
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||
import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
|
||||
import { registerThemingParticipant, IColorTheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
|
||||
import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { Color } from 'vs/base/common/color';
|
||||
import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing';
|
||||
@@ -52,7 +52,7 @@ import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
|
||||
import { alert } from 'vs/base/browser/ui/aria/aria';
|
||||
import { coalesce } from 'vs/base/common/arrays';
|
||||
import { IWorkbenchThemeService, COLOR_THEME_SETTING, ICON_THEME_SETTING, IFileIconTheme, IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||
import { IWorkbenchThemeService, ThemeSettings, IWorkbenchFileIconTheme, IWorkbenchColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { prefersExecuteOnUI, prefersExecuteOnWorkspace } from 'vs/workbench/services/extensions/common/extensionsUtil';
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
@@ -718,7 +718,7 @@ export class ManageExtensionAction extends ExtensionDropDownAction {
|
||||
this.update();
|
||||
}
|
||||
|
||||
getActionGroups(runningExtensions: IExtensionDescription[], colorThemes: IColorTheme[], fileIconThemes: IFileIconTheme[]): IAction[][] {
|
||||
getActionGroups(runningExtensions: IExtensionDescription[], colorThemes: IWorkbenchColorTheme[], fileIconThemes: IWorkbenchFileIconTheme[]): IAction[][] {
|
||||
const groups: ExtensionAction[][] = [];
|
||||
if (this.extension) {
|
||||
const extensionColorThemes = SetColorThemeAction.getColorThemes(colorThemes, this.extension);
|
||||
@@ -1319,7 +1319,7 @@ export class ReloadAction extends ExtensionAction {
|
||||
|
||||
export class SetColorThemeAction extends ExtensionAction {
|
||||
|
||||
static getColorThemes(colorThemes: IColorTheme[], extension: IExtension): IColorTheme[] {
|
||||
static getColorThemes(colorThemes: IWorkbenchColorTheme[], extension: IExtension): IWorkbenchColorTheme[] {
|
||||
return colorThemes.filter(c => c.extensionData && ExtensionIdentifier.equals(c.extensionData.extensionId, extension.identifier.id));
|
||||
}
|
||||
|
||||
@@ -1328,7 +1328,7 @@ export class SetColorThemeAction extends ExtensionAction {
|
||||
|
||||
|
||||
constructor(
|
||||
private readonly colorThemes: IColorTheme[],
|
||||
private readonly colorThemes: IWorkbenchColorTheme[],
|
||||
@IExtensionService extensionService: IExtensionService,
|
||||
@IWorkbenchThemeService private readonly workbenchThemeService: IWorkbenchThemeService,
|
||||
@IQuickInputService private readonly quickInputService: IQuickInputService,
|
||||
@@ -1357,7 +1357,7 @@ export class SetColorThemeAction extends ExtensionAction {
|
||||
return;
|
||||
}
|
||||
let extensionThemes = SetColorThemeAction.getColorThemes(this.colorThemes, this.extension!);
|
||||
const currentTheme = this.colorThemes.filter(t => t.settingsId === this.configurationService.getValue(COLOR_THEME_SETTING))[0] || this.workbenchThemeService.getColorTheme();
|
||||
const currentTheme = this.colorThemes.filter(t => t.settingsId === this.configurationService.getValue(ThemeSettings.COLOR_THEME))[0] || this.workbenchThemeService.getColorTheme();
|
||||
showCurrentTheme = showCurrentTheme || extensionThemes.some(t => t.id === currentTheme.id);
|
||||
if (showCurrentTheme) {
|
||||
extensionThemes = extensionThemes.filter(t => t.id !== currentTheme.id);
|
||||
@@ -1377,7 +1377,7 @@ export class SetColorThemeAction extends ExtensionAction {
|
||||
onDidFocus: item => delayer.trigger(() => this.workbenchThemeService.setColorTheme(item.id, undefined)),
|
||||
ignoreFocusLost
|
||||
});
|
||||
let confValue = this.configurationService.inspect(COLOR_THEME_SETTING);
|
||||
let confValue = this.configurationService.inspect(ThemeSettings.COLOR_THEME);
|
||||
const target = typeof confValue.workspaceValue !== 'undefined' ? ConfigurationTarget.WORKSPACE : ConfigurationTarget.USER;
|
||||
return this.workbenchThemeService.setColorTheme(pickedTheme ? pickedTheme.id : currentTheme.id, target);
|
||||
}
|
||||
@@ -1389,12 +1389,12 @@ export class SetFileIconThemeAction extends ExtensionAction {
|
||||
private static readonly DisabledClass = `${SetFileIconThemeAction.EnabledClass} disabled`;
|
||||
|
||||
|
||||
static getFileIconThemes(fileIconThemes: IFileIconTheme[], extension: IExtension): IFileIconTheme[] {
|
||||
static getFileIconThemes(fileIconThemes: IWorkbenchFileIconTheme[], extension: IExtension): IWorkbenchFileIconTheme[] {
|
||||
return fileIconThemes.filter(c => c.extensionData && ExtensionIdentifier.equals(c.extensionData.extensionId, extension.identifier.id));
|
||||
}
|
||||
|
||||
constructor(
|
||||
private readonly fileIconThemes: IFileIconTheme[],
|
||||
private readonly fileIconThemes: IWorkbenchFileIconTheme[],
|
||||
@IExtensionService extensionService: IExtensionService,
|
||||
@IWorkbenchThemeService private readonly workbenchThemeService: IWorkbenchThemeService,
|
||||
@IQuickInputService private readonly quickInputService: IQuickInputService,
|
||||
@@ -1423,7 +1423,7 @@ export class SetFileIconThemeAction extends ExtensionAction {
|
||||
return;
|
||||
}
|
||||
let extensionThemes = SetFileIconThemeAction.getFileIconThemes(this.fileIconThemes, this.extension!);
|
||||
const currentTheme = this.fileIconThemes.filter(t => t.settingsId === this.configurationService.getValue(ICON_THEME_SETTING))[0] || this.workbenchThemeService.getFileIconTheme();
|
||||
const currentTheme = this.fileIconThemes.filter(t => t.settingsId === this.configurationService.getValue(ThemeSettings.ICON_THEME))[0] || this.workbenchThemeService.getFileIconTheme();
|
||||
showCurrentTheme = showCurrentTheme || extensionThemes.some(t => t.id === currentTheme.id);
|
||||
if (showCurrentTheme) {
|
||||
extensionThemes = extensionThemes.filter(t => t.id !== currentTheme.id);
|
||||
@@ -1443,7 +1443,7 @@ export class SetFileIconThemeAction extends ExtensionAction {
|
||||
onDidFocus: item => delayer.trigger(() => this.workbenchThemeService.setFileIconTheme(item.id, undefined)),
|
||||
ignoreFocusLost
|
||||
});
|
||||
let confValue = this.configurationService.inspect(ICON_THEME_SETTING);
|
||||
let confValue = this.configurationService.inspect(ThemeSettings.ICON_THEME);
|
||||
const target = typeof confValue.workspaceValue !== 'undefined' ? ConfigurationTarget.WORKSPACE : ConfigurationTarget.USER;
|
||||
return this.workbenchThemeService.setFileIconTheme(pickedTheme ? pickedTheme.id : currentTheme.id, target);
|
||||
}
|
||||
@@ -3258,7 +3258,7 @@ export const extensionButtonProminentHoverBackground = registerColor('extensionB
|
||||
hc: null
|
||||
}, localize('extensionButtonProminentHoverBackground', "Button background hover color for actions extension that stand out (e.g. install button)."));
|
||||
|
||||
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
||||
registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => {
|
||||
const foregroundColor = theme.getColor(foreground);
|
||||
if (foregroundColor) {
|
||||
collector.addRule(`.extension .monaco-action-bar .action-item .action-label.extension-action.built-in-status { border-color: ${foregroundColor}; }`);
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput';
|
||||
import { IPickerQuickAccessItem, PickerQuickAccessProvider } from 'vs/platform/quickinput/common/quickAccess';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { localize } from 'vs/nls';
|
||||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { VIEWLET_ID, IExtensionsViewPaneContainer } from 'vs/workbench/contrib/extensions/common/extensions';
|
||||
import { IExtensionGalleryService, IExtensionManagementService, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
|
||||
export class InstallExtensionQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {
|
||||
|
||||
static PREFIX = 'ext install ';
|
||||
|
||||
constructor(
|
||||
@IViewletService private readonly viewletService: IViewletService,
|
||||
@IExtensionGalleryService private readonly galleryService: IExtensionGalleryService,
|
||||
@IExtensionManagementService private readonly extensionsService: IExtensionManagementService,
|
||||
@INotificationService private readonly notificationService: INotificationService,
|
||||
@ILogService private readonly logService: ILogService
|
||||
) {
|
||||
super(InstallExtensionQuickAccessProvider.PREFIX);
|
||||
}
|
||||
|
||||
protected getPicks(filter: string, token: CancellationToken): Array<IPickerQuickAccessItem | IQuickPickSeparator> | Promise<Array<IPickerQuickAccessItem | IQuickPickSeparator>> {
|
||||
|
||||
// Nothing typed
|
||||
if (!filter) {
|
||||
return [{
|
||||
label: localize('type', "Type an extension name to install or search.")
|
||||
}];
|
||||
}
|
||||
|
||||
const genericSearchPickItem: IPickerQuickAccessItem = {
|
||||
label: localize('searchFor', "Press Enter to search for extension '{0}'.", filter),
|
||||
accept: () => this.searchExtension(filter)
|
||||
};
|
||||
|
||||
// Extension ID typed: try to find it
|
||||
if (/\./.test(filter)) {
|
||||
return this.getPicksForExtensionId(filter, genericSearchPickItem, token);
|
||||
}
|
||||
|
||||
// Extension name typed: offer to search it
|
||||
else {
|
||||
return [genericSearchPickItem];
|
||||
}
|
||||
}
|
||||
|
||||
protected async getPicksForExtensionId(filter: string, fallback: IPickerQuickAccessItem, token: CancellationToken): Promise<Array<IPickerQuickAccessItem | IQuickPickSeparator>> {
|
||||
try {
|
||||
const galleryResult = await this.galleryService.query({ names: [filter], pageSize: 1 }, token);
|
||||
if (token.isCancellationRequested) {
|
||||
return []; // return early if canceled
|
||||
}
|
||||
|
||||
const galleryExtension = galleryResult.firstPage[0];
|
||||
if (!galleryExtension) {
|
||||
return [fallback];
|
||||
} else {
|
||||
return [{
|
||||
label: localize('install', "Press Enter to install extension '{0}'.", filter),
|
||||
accept: () => this.installExtension(galleryExtension, filter)
|
||||
}];
|
||||
}
|
||||
} catch (error) {
|
||||
if (token.isCancellationRequested) {
|
||||
return []; // expected error
|
||||
}
|
||||
|
||||
this.logService.error(error);
|
||||
|
||||
return [fallback];
|
||||
}
|
||||
}
|
||||
|
||||
private async installExtension(extension: IGalleryExtension, name: string): Promise<void> {
|
||||
try {
|
||||
await openExtensionsViewlet(this.viewletService, `@id:${name}`);
|
||||
await this.extensionsService.installFromGallery(extension);
|
||||
} catch (error) {
|
||||
this.notificationService.error(error);
|
||||
}
|
||||
}
|
||||
|
||||
private async searchExtension(name: string): Promise<void> {
|
||||
openExtensionsViewlet(this.viewletService, name);
|
||||
}
|
||||
}
|
||||
|
||||
export class ManageExtensionsQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {
|
||||
|
||||
static PREFIX = 'ext ';
|
||||
|
||||
constructor(@IViewletService private readonly viewletService: IViewletService) {
|
||||
super(ManageExtensionsQuickAccessProvider.PREFIX);
|
||||
}
|
||||
|
||||
protected getPicks(): Array<IPickerQuickAccessItem | IQuickPickSeparator> {
|
||||
return [{
|
||||
label: localize('manage', "Press Enter to manage your extensions."),
|
||||
accept: () => openExtensionsViewlet(this.viewletService)
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
async function openExtensionsViewlet(viewletService: IViewletService, search = ''): Promise<void> {
|
||||
const viewlet = await viewletService.openViewlet(VIEWLET_ID, true);
|
||||
const view = viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer | undefined;
|
||||
view?.search(search);
|
||||
view?.focus();
|
||||
}
|
||||
@@ -169,7 +169,7 @@ class OpenExtensionAction extends Action {
|
||||
|
||||
run(sideByside: boolean): Promise<any> {
|
||||
if (this._extensionData) {
|
||||
return this.extensionsWorkdbenchService.open(this._extensionData.extension, sideByside);
|
||||
return this.extensionsWorkdbenchService.open(this._extensionData.extension, { sideByside });
|
||||
}
|
||||
return Promise.resolve();
|
||||
}
|
||||
@@ -218,7 +218,7 @@ export class ExtensionsTree extends WorkbenchAsyncDataTree<IExtensionData, IExte
|
||||
|
||||
this.disposables.add(this.onDidChangeSelection(event => {
|
||||
if (event.browserEvent && event.browserEvent instanceof KeyboardEvent) {
|
||||
extensionsWorkdbenchService.open(event.elements[0].extension, false);
|
||||
extensionsWorkdbenchService.open(event.elements[0].extension, { sideByside: false });
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction, InstallLocalExtensionsInRemoteAction, getContextMenuActions } from 'vs/workbench/contrib/extensions/browser/extensionsActions';
|
||||
import { WorkbenchPagedList } from 'vs/platform/list/browser/listService';
|
||||
import { WorkbenchPagedList, ResourceNavigator } from 'vs/platform/list/browser/listService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
|
||||
import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer';
|
||||
@@ -114,7 +114,7 @@ export class ExtensionsListView extends ViewPane {
|
||||
@IMenuService private readonly menuService: IMenuService,
|
||||
@IOpenerService openerService: IOpenerService,
|
||||
) {
|
||||
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: options.title, showActionsAlways: true }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
super({ ...(options as IViewPaneOptions), showActionsAlways: true }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
||||
this.server = options.server;
|
||||
}
|
||||
|
||||
@@ -146,14 +146,14 @@ export class ExtensionsListView extends ViewPane {
|
||||
}
|
||||
});
|
||||
this._register(this.list.onContextMenu(e => this.onContextMenu(e), this));
|
||||
this._register(this.list.onFocusChange(e => extensionsViewState.onFocusChange(coalesce(e.elements)), this));
|
||||
this._register(this.list.onDidChangeFocus(e => extensionsViewState.onFocusChange(coalesce(e.elements)), this));
|
||||
this._register(this.list);
|
||||
this._register(extensionsViewState);
|
||||
|
||||
this._register(Event.chain(this.list.onOpen)
|
||||
.map(e => e.elements[0])
|
||||
.filter(e => !!e)
|
||||
.on(this.openExtension, this));
|
||||
const resourceNavigator = this._register(ResourceNavigator.createListResourceNavigator(this.list, { openOnFocus: false, openOnSelection: true, openOnSingleClick: true }));
|
||||
this._register(Event.debounce(Event.filter(resourceNavigator.onDidOpenResource, e => e.element !== null), (last, event) => event, 75, true)(options => {
|
||||
this.openExtension(this.list!.model.get(options.element!), { sideByside: options.sideBySide, ...options.editorOptions });
|
||||
}));
|
||||
|
||||
this._register(Event.chain(this.list.onPin)
|
||||
.map(e => e.elements[0])
|
||||
@@ -828,16 +828,16 @@ export class ExtensionsListView extends ViewPane {
|
||||
}
|
||||
}
|
||||
|
||||
private openExtension(extension: IExtension): void {
|
||||
private openExtension(extension: IExtension, options: { sideByside?: boolean, preserveFocus?: boolean, pinned?: boolean }): void {
|
||||
extension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0] || extension;
|
||||
this.extensionsWorkbenchService.open(extension).then(undefined, err => this.onError(err));
|
||||
this.extensionsWorkbenchService.open(extension, options).then(undefined, err => this.onError(err));
|
||||
}
|
||||
|
||||
private pin(): void {
|
||||
const activeControl = this.editorService.activeControl;
|
||||
if (activeControl) {
|
||||
activeControl.group.pinEditor(activeControl.input);
|
||||
activeControl.focus();
|
||||
const activeEditorPane = this.editorService.activeEditorPane;
|
||||
if (activeEditorPane) {
|
||||
activeEditorPane.group.pinEditor(activeEditorPane.input);
|
||||
activeEditorPane.focus();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import { localize } from 'vs/nls';
|
||||
import { IExtensionTipsService, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { extensionButtonProminentBackground, extensionButtonProminentForeground, ExtensionToolTipAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions';
|
||||
import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService';
|
||||
import { IThemeService, IColorTheme } from 'vs/platform/theme/common/themeService';
|
||||
import { EXTENSION_BADGE_REMOTE_BACKGROUND, EXTENSION_BADGE_REMOTE_FOREGROUND } from 'vs/workbench/common/theme';
|
||||
import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
@@ -225,14 +225,14 @@ export class RecommendationWidget extends ExtensionWidget {
|
||||
this.element = append(this.parent, $('div.bookmark'));
|
||||
const recommendation = append(this.element, $('.recommendation'));
|
||||
append(recommendation, $('span.codicon.codicon-star'));
|
||||
const applyBookmarkStyle = (theme: ITheme) => {
|
||||
const applyBookmarkStyle = (theme: IColorTheme) => {
|
||||
const bgColor = theme.getColor(extensionButtonProminentBackground);
|
||||
const fgColor = theme.getColor(extensionButtonProminentForeground);
|
||||
recommendation.style.borderTopColor = bgColor ? bgColor.toString() : 'transparent';
|
||||
recommendation.style.color = fgColor ? fgColor.toString() : 'white';
|
||||
};
|
||||
applyBookmarkStyle(this.themeService.getTheme());
|
||||
this.themeService.onThemeChange(applyBookmarkStyle, this, this.disposables);
|
||||
applyBookmarkStyle(this.themeService.getColorTheme());
|
||||
this.themeService.onDidColorThemeChange(applyBookmarkStyle, this, this.disposables);
|
||||
this.tooltip = extRecommendations[this.extension.identifier.id.toLowerCase()].reasonText;
|
||||
}
|
||||
}
|
||||
@@ -296,13 +296,13 @@ class RemoteBadge extends Disposable {
|
||||
if (!this.element) {
|
||||
return;
|
||||
}
|
||||
const bgColor = this.themeService.getTheme().getColor(EXTENSION_BADGE_REMOTE_BACKGROUND);
|
||||
const fgColor = this.themeService.getTheme().getColor(EXTENSION_BADGE_REMOTE_FOREGROUND);
|
||||
const bgColor = this.themeService.getColorTheme().getColor(EXTENSION_BADGE_REMOTE_BACKGROUND);
|
||||
const fgColor = this.themeService.getColorTheme().getColor(EXTENSION_BADGE_REMOTE_FOREGROUND);
|
||||
this.element.style.backgroundColor = bgColor ? bgColor.toString() : '';
|
||||
this.element.style.color = fgColor ? fgColor.toString() : '';
|
||||
};
|
||||
applyBadgeStyle();
|
||||
this._register(this.themeService.onThemeChange(() => applyBadgeStyle()));
|
||||
this._register(this.themeService.onDidColorThemeChange(() => applyBadgeStyle()));
|
||||
|
||||
if (this.tooltip) {
|
||||
const updateTitle = () => {
|
||||
|
||||
@@ -651,8 +651,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
|
||||
return text.substr(0, 350);
|
||||
}
|
||||
|
||||
open(extension: IExtension, sideByside: boolean = false): Promise<any> {
|
||||
return Promise.resolve(this.editorService.openEditor(this.instantiationService.createInstance(ExtensionsInput, extension), undefined, sideByside ? SIDE_GROUP : ACTIVE_GROUP));
|
||||
open(extension: IExtension, { sideByside, preserveFocus, pinned }: { sideByside?: boolean, preserveFocus?: boolean, pinned?: boolean } = { sideByside: false, preserveFocus: false, pinned: false }): Promise<any> {
|
||||
return Promise.resolve(this.editorService.openEditor(this.instantiationService.createInstance(ExtensionsInput, extension), { preserveFocus, pinned }, sideByside ? SIDE_GROUP : ACTIVE_GROUP));
|
||||
}
|
||||
|
||||
private getPrimaryExtension(extensions: IExtension[]): IExtension {
|
||||
|
||||
@@ -87,7 +87,7 @@ export interface IExtensionsWorkbenchService {
|
||||
installVersion(extension: IExtension, version: string): Promise<IExtension>;
|
||||
reinstall(extension: IExtension): Promise<IExtension>;
|
||||
setEnablement(extensions: IExtension | IExtension[], enablementState: EnablementState): Promise<void>;
|
||||
open(extension: IExtension, sideByside?: boolean): Promise<any>;
|
||||
open(extension: IExtension, options?: { sideByside?: boolean, preserveFocus?: boolean, pinned?: boolean }): Promise<any>;
|
||||
checkForUpdates(): Promise<void>;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,3 +40,53 @@
|
||||
.runtime-extensions-editor .monaco-action-bar .actions-container {
|
||||
justify-content: left;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .icon-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .icon-container > .icon {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
padding: 10px 14px 10px 0;
|
||||
flex-shrink: 0;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .icon-container .extension-remote-badge .codicon {
|
||||
color: currentColor;
|
||||
}
|
||||
|
||||
.vs .runtime-extensions-editor .extension > .icon-container > .icon,
|
||||
.vs-dark .runtime-extensions-editor .extension > .icon-container > .icon {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .desc > .header-container {
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .desc > .header-container > .header {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
flex-wrap: nowrap;
|
||||
overflow: hidden;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .desc > .header-container > .header > .name {
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.runtime-extensions-editor .extension > .desc > .header-container > .header > .version {
|
||||
opacity: 0.85;
|
||||
font-size: 80%;
|
||||
padding-left: 6px;
|
||||
min-width: fit-content;
|
||||
min-width: -moz-fit-content;
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { editorBackground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { domEvent } from 'vs/base/browser/event';
|
||||
|
||||
export const IExtensionHostProfileService = createDecorator<IExtensionHostProfileService>('extensionHostProfileService');
|
||||
export const CONTEXT_PROFILE_SESSION_STATE = new RawContextKey<string>('profileSessionState', 'none');
|
||||
@@ -257,7 +258,9 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
interface IRuntimeExtensionTemplateData {
|
||||
root: HTMLElement;
|
||||
element: HTMLElement;
|
||||
icon: HTMLImageElement;
|
||||
name: HTMLElement;
|
||||
version: HTMLElement;
|
||||
msgContainer: HTMLElement;
|
||||
actionbar: ActionBar;
|
||||
activationTime: HTMLElement;
|
||||
@@ -270,9 +273,14 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
templateId: TEMPLATE_ID,
|
||||
renderTemplate: (root: HTMLElement): IRuntimeExtensionTemplateData => {
|
||||
const element = append(root, $('.extension'));
|
||||
const iconContainer = append(element, $('.icon-container'));
|
||||
const icon = append(iconContainer, $<HTMLImageElement>('img.icon'));
|
||||
|
||||
const desc = append(element, $('div.desc'));
|
||||
const name = append(desc, $('div.name'));
|
||||
const headerContainer = append(desc, $('.header-container'));
|
||||
const header = append(headerContainer, $('.header'));
|
||||
const name = append(header, $('div.name'));
|
||||
const version = append(header, $('span.version'));
|
||||
|
||||
const msgContainer = append(desc, $('div.msg'));
|
||||
|
||||
@@ -289,13 +297,15 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
return {
|
||||
root,
|
||||
element,
|
||||
icon,
|
||||
name,
|
||||
version,
|
||||
actionbar,
|
||||
activationTime,
|
||||
profileTime,
|
||||
msgContainer,
|
||||
disposables,
|
||||
elementDisposables: []
|
||||
elementDisposables: [],
|
||||
};
|
||||
},
|
||||
|
||||
@@ -305,7 +315,18 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
|
||||
toggleClass(data.root, 'odd', index % 2 === 1);
|
||||
|
||||
const onError = Event.once(domEvent(data.icon, 'error'));
|
||||
onError(() => data.icon.src = element.marketplaceInfo.iconUrlFallback, null, data.elementDisposables);
|
||||
data.icon.src = element.marketplaceInfo.iconUrl;
|
||||
|
||||
if (!data.icon.complete) {
|
||||
data.icon.style.visibility = 'hidden';
|
||||
data.icon.onload = () => data.icon.style.visibility = 'inherit';
|
||||
} else {
|
||||
data.icon.style.visibility = 'inherit';
|
||||
}
|
||||
data.name.textContent = element.marketplaceInfo ? element.marketplaceInfo.displayName : element.description.displayName || '';
|
||||
data.version.textContent = element.description.version;
|
||||
|
||||
const activationTimes = element.status.activationTimes!;
|
||||
let syncTime = activationTimes.codeLoadingTime + activationTimes.activateCallTime;
|
||||
|
||||
@@ -27,7 +27,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices';
|
||||
import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices';
|
||||
import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
|
||||
@@ -39,7 +39,7 @@ import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browse
|
||||
import { ExtensionIdentifier, IExtensionContributions, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
|
||||
import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { ILabelService, IFormatterChangeEvent } from 'vs/platform/label/common/label';
|
||||
import { ExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
@@ -92,7 +92,7 @@ suite('ExtensionsActions Test', () => {
|
||||
}());
|
||||
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
instantiationService.stub(ILabelService, { onDidChangeFormatters: new Emitter<void>().event });
|
||||
instantiationService.stub(ILabelService, { onDidChangeFormatters: new Emitter<IFormatterChangeEvent>().event });
|
||||
|
||||
instantiationService.set(IExtensionTipsService, instantiationService.createInstance(ExtensionTipsService));
|
||||
instantiationService.stub(IURLService, URLService);
|
||||
|
||||
@@ -22,7 +22,8 @@ import { Emitter } from 'vs/base/common/event';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { TestContextService, TestLifecycleService, productService } from 'vs/workbench/test/browser/workbenchTestServices';
|
||||
import { TestLifecycleService, productService } from 'vs/workbench/test/browser/workbenchTestServices';
|
||||
import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices';
|
||||
import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices';
|
||||
import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
|
||||
@@ -27,7 +27,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { TestContextService, TestMenuService } from 'vs/workbench/test/browser/workbenchTestServices';
|
||||
import { TestMenuService } from 'vs/workbench/test/browser/workbenchTestServices';
|
||||
import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
|
||||
@@ -46,6 +46,8 @@ import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
|
||||
import { IMenuService } from 'vs/platform/actions/common/actions';
|
||||
import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices';
|
||||
import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views';
|
||||
|
||||
|
||||
suite('ExtensionsListView Tests', () => {
|
||||
@@ -137,6 +139,12 @@ suite('ExtensionsListView Tests', () => {
|
||||
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage());
|
||||
instantiationService.stubPromise(IExperimentService, 'getExperimentsByType', []);
|
||||
|
||||
instantiationService.stub(IViewDescriptorService, {
|
||||
getViewLocation(): ViewContainerLocation {
|
||||
return ViewContainerLocation.Sidebar;
|
||||
}
|
||||
});
|
||||
|
||||
instantiationService.stub(IExtensionService, {
|
||||
getExtensions: (): Promise<IExtensionDescription[]> => {
|
||||
return Promise.resolve([
|
||||
|
||||
@@ -27,7 +27,6 @@ import { IPager } from 'vs/base/common/paging';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { TestContextService } from 'vs/workbench/test/browser/workbenchTestServices';
|
||||
import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
|
||||
@@ -41,6 +40,7 @@ import { ExtensionType } from 'vs/platform/extensions/common/extensions';
|
||||
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
|
||||
import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl';
|
||||
import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService';
|
||||
import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices';
|
||||
|
||||
suite('ExtensionsWorkbenchServiceTest', () => {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user