mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-30 00:30:29 -04:00
Merge from vscode 731f9c25632dbbf01ee3a7892ad9d2791fe0260c
This commit is contained in:
@@ -5,12 +5,11 @@
|
||||
|
||||
import 'vs/css!./media/extensionActions';
|
||||
import { localize } from 'vs/nls';
|
||||
import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { IAction, Action, Separator, SubmenuAction } from 'vs/base/common/actions';
|
||||
import { Delayer } from 'vs/base/common/async';
|
||||
import * as DOM from 'vs/base/browser/dom';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import * as json from 'vs/base/common/json';
|
||||
import { ActionViewItem, Separator, IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { dispose, Disposable } from 'vs/base/common/lifecycle';
|
||||
import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewPaneContainer, AutoUpdateConfigurationKey, IExtensionContainer, EXTENSIONS_CONFIG, TOGGLE_IGNORE_EXTENSION_ACTION_ID } from 'vs/workbench/contrib/extensions/common/extensions';
|
||||
@@ -61,6 +60,7 @@ import { IFileDialogService, IDialogService } from 'vs/platform/dialogs/common/d
|
||||
import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress';
|
||||
import { Codicon } from 'vs/base/common/codicons';
|
||||
import { IViewsService } from 'vs/workbench/common/views';
|
||||
import { IActionViewItemOptions, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
|
||||
|
||||
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; // {{SQL CARBON EDIT}}
|
||||
import product from 'vs/platform/product/common/product';
|
||||
@@ -729,7 +729,7 @@ export class DropDownMenuActionViewItem extends ExtensionActionViewItem {
|
||||
}
|
||||
}
|
||||
|
||||
export function getContextMenuActions(menuService: IMenuService, contextKeyService: IContextKeyService, instantiationService: IInstantiationService, extension: IExtension | undefined | null): ExtensionAction[][] {
|
||||
export function getContextMenuActions(menuService: IMenuService, contextKeyService: IContextKeyService, instantiationService: IInstantiationService, extension: IExtension | undefined | null): IAction[][] {
|
||||
const scopedContextKeyService = contextKeyService.createScoped();
|
||||
if (extension) {
|
||||
scopedContextKeyService.createKey<string>('extension', extension.identifier.id);
|
||||
@@ -740,9 +740,14 @@ export function getContextMenuActions(menuService: IMenuService, contextKeyServi
|
||||
}
|
||||
}
|
||||
|
||||
const groups: ExtensionAction[][] = [];
|
||||
const groups: IAction[][] = [];
|
||||
const menu = menuService.createMenu(MenuId.ExtensionContext, scopedContextKeyService);
|
||||
menu.getActions({ shouldForwardArgs: true }).forEach(([, actions]) => groups.push(actions.map(action => instantiationService.createInstance(MenuItemExtensionAction, action))));
|
||||
menu.getActions({ shouldForwardArgs: true }).forEach(([, actions]) => groups.push(actions.map(action => {
|
||||
if (action instanceof SubmenuAction) {
|
||||
return action;
|
||||
}
|
||||
return instantiationService.createInstance(MenuItemExtensionAction, action);
|
||||
})));
|
||||
menu.dispose();
|
||||
|
||||
return groups;
|
||||
@@ -771,7 +776,7 @@ export class ManageExtensionAction extends ExtensionDropDownAction {
|
||||
}
|
||||
|
||||
async getActionGroups(runningExtensions: IExtensionDescription[]): Promise<IAction[][]> {
|
||||
const groups: ExtensionAction[][] = [];
|
||||
const groups: IAction[][] = [];
|
||||
if (this.extension) {
|
||||
const actions = await Promise.all([
|
||||
SetColorThemeAction.create(this.workbenchThemeService, this.instantiationService, this.extension),
|
||||
@@ -802,7 +807,11 @@ export class ManageExtensionAction extends ExtensionDropDownAction {
|
||||
|
||||
getContextMenuActions(this.menuService, this.contextKeyService, this.instantiationService, this.extension).forEach(actions => groups.push(actions));
|
||||
|
||||
groups.forEach(group => group.forEach(extensionAction => extensionAction.extension = this.extension));
|
||||
groups.forEach(group => group.forEach(extensionAction => {
|
||||
if (extensionAction instanceof ExtensionAction) {
|
||||
extensionAction.extension = this.extension;
|
||||
}
|
||||
}));
|
||||
|
||||
return groups;
|
||||
}
|
||||
@@ -1769,7 +1778,28 @@ export class ShowPopularExtensionsAction extends Action {
|
||||
return this.viewletService.openViewlet(VIEWLET_ID, true)
|
||||
.then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer)
|
||||
.then(viewlet => {
|
||||
viewlet.search('@sort:installs ');
|
||||
viewlet.search('@popular ');
|
||||
viewlet.focus();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export class PredefinedExtensionFilterAction extends Action {
|
||||
|
||||
constructor(
|
||||
id: string,
|
||||
label: string,
|
||||
private readonly filter: string,
|
||||
@IViewletService private readonly viewletService: IViewletService
|
||||
) {
|
||||
super(id, label, undefined, true);
|
||||
}
|
||||
|
||||
run(): Promise<void> {
|
||||
return this.viewletService.openViewlet(VIEWLET_ID, true)
|
||||
.then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer)
|
||||
.then(viewlet => {
|
||||
viewlet.search(`${this.filter} `);
|
||||
viewlet.focus();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -10,8 +10,7 @@ import { isPromiseCanceledError } from 'vs/base/common/errors';
|
||||
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
|
||||
import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';
|
||||
import { Event as EventOf, Emitter } from 'vs/base/common/event';
|
||||
import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { Separator, IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IAction, Action, Separator, SubmenuAction } from 'vs/base/common/actions';
|
||||
import { IViewlet } from 'vs/workbench/common/viewlet';
|
||||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { append, $, addClass, toggleClass, Dimension, hide, show } from 'vs/base/browser/dom';
|
||||
@@ -20,11 +19,12 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, AutoUpdateConfigurationKey, CloseExtensionDetailsOnViewChangeKey } from '../common/extensions';
|
||||
import {
|
||||
ShowRecommendedExtensionsAction, /*ShowPopularExtensionsAction,*/
|
||||
ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction,
|
||||
EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction, SearchCategoryAction, /*RecentlyPublishedExtensionsAction, */ShowInstalledExtensionsAction, ShowOutdatedExtensionsAction, ShowDisabledExtensionsAction, ShowEnabledExtensionsAction
|
||||
EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction, SearchCategoryAction,
|
||||
/*RecentlyPublishedExtensionsAction, */ShowInstalledExtensionsAction, ShowOutdatedExtensionsAction, ShowDisabledExtensionsAction,
|
||||
ShowEnabledExtensionsAction, PredefinedExtensionFilterAction
|
||||
} from 'vs/workbench/contrib/extensions/browser/extensionsActions';
|
||||
import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IWorkbenchExtensionEnablementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput';
|
||||
import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInFeatureExtensionsView, BuiltInThemesExtensionsView, BuiltInProgrammingLanguageExtensionsView, ServerExtensionsView, DefaultRecommendedExtensionsView, OutdatedExtensionsView, InstalledExtensionsView, SearchBuiltInExtensionsView } from 'vs/workbench/contrib/extensions/browser/extensionsViews';
|
||||
@@ -59,8 +59,6 @@ import { IPreferencesService } from 'vs/workbench/services/preferences/common/pr
|
||||
import { DragAndDropObserver } from 'vs/workbench/browser/dnd';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { SIDE_BAR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme';
|
||||
import { ContextSubMenu } from 'vs/base/browser/contextmenu';
|
||||
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown';
|
||||
|
||||
const NonEmptyWorkspaceContext = new RawContextKey<boolean>('nonEmptyWorkspace', false);
|
||||
const DefaultViewsContext = new RawContextKey<boolean>('defaultExtensionViews', true);
|
||||
@@ -347,6 +345,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
|
||||
@IInstantiationService instantiationService: IInstantiationService,
|
||||
@IEditorGroupsService private readonly editorGroupService: IEditorGroupsService,
|
||||
@IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService,
|
||||
@IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService,
|
||||
@INotificationService private readonly notificationService: INotificationService,
|
||||
@IViewletService private readonly viewletService: IViewletService,
|
||||
@IThemeService themeService: IThemeService,
|
||||
@@ -497,41 +496,43 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
|
||||
}
|
||||
|
||||
getActions(): IAction[] {
|
||||
const filterActions: IAction[] = [];
|
||||
|
||||
// Local extensions filters
|
||||
filterActions.push(...[
|
||||
this.instantiationService.createInstance(ShowBuiltInExtensionsAction, ShowBuiltInExtensionsAction.ID, localize('builtin filter', "Built-in")),
|
||||
this.instantiationService.createInstance(ShowInstalledExtensionsAction, ShowInstalledExtensionsAction.ID, localize('installed filter', "Installed")),
|
||||
this.instantiationService.createInstance(ShowEnabledExtensionsAction, ShowEnabledExtensionsAction.ID, localize('enabled filter', "Enabled")),
|
||||
this.instantiationService.createInstance(ShowDisabledExtensionsAction, ShowDisabledExtensionsAction.ID, localize('disabled filter', "Disabled")),
|
||||
this.instantiationService.createInstance(ShowOutdatedExtensionsAction, ShowOutdatedExtensionsAction.ID, localize('outdated filter', "Outdated")),
|
||||
]);
|
||||
|
||||
if (this.extensionGalleryService.isEnabled()) {
|
||||
filterActions.splice(0, 0, ...[
|
||||
// this.instantiationService.createInstance(PredefinedExtensionFilterAction, 'extensions.filter.featured', localize('featured filter', "Featured"), '@featured'), // {{SQL CARBON EDIT}}
|
||||
// this.instantiationService.createInstance(PredefinedExtensionFilterAction, 'extensions.filter.popular', localize('most popular filter', "Most Popular"), '@popular'), // {{SQL CARBON EDIT}}
|
||||
this.instantiationService.createInstance(PredefinedExtensionFilterAction, 'extensions.filter.recommended', localize('most popular recommended', "Recommended"), '@recommended'),
|
||||
// this.instantiationService.createInstance(RecentlyPublishedExtensionsAction, RecentlyPublishedExtensionsAction.ID, localize('recently published filter', "Recently Published")), // {{SQL CARBON EDIT}}
|
||||
new SubmenuAction('workbench.extensions.action.filterExtensionsByCategory', localize('filter by category', "Category"), EXTENSION_CATEGORIES.map(category => this.instantiationService.createInstance(SearchCategoryAction, `extensions.actions.searchByCategory.${category}`, category, category))),
|
||||
new Separator(),
|
||||
]);
|
||||
filterActions.push(...[
|
||||
new Separator(),
|
||||
new SubmenuAction('workbench.extensions.action.sortBy', localize('sorty by', "Sort By"), [
|
||||
// this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.install', localize('sort by installs', "Install Count"), this.onSearchChange, 'installs'), // {{SQL CARBON EDIT}}
|
||||
// this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.rating', localize('sort by rating', "Rating"), this.onSearchChange, 'rating'), // {{SQL CARBON EDIT}}
|
||||
this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.name', localize('sort by name', "Name"), this.onSearchChange, 'name'),
|
||||
this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.publishedDate', localize('sort by date', "Published Date"), this.onSearchChange, 'publishedDate'),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
return [
|
||||
new Action('workbench.extensions.action.filterExtensions', localize('filterExtensions', "Filter Extensions..."), 'codicon-filter', true),
|
||||
new SubmenuAction('workbench.extensions.action.filterExtensions', localize('filterExtensions', "Filter Extensions..."), filterActions, 'codicon-filter'),
|
||||
this.instantiationService.createInstance(ClearExtensionsInputAction, ClearExtensionsInputAction.ID, ClearExtensionsInputAction.LABEL, this.onSearchChange, this.searchBox ? this.searchBox.getValue() : ''),
|
||||
];
|
||||
}
|
||||
|
||||
getActionViewItem(action: IAction): IActionViewItem | undefined {
|
||||
if (action.id === 'workbench.extensions.action.filterExtensions') {
|
||||
return new DropdownMenuActionViewItem(action,
|
||||
[
|
||||
// this.instantiationService.createInstance(ShowPopularExtensionsAction, ShowPopularExtensionsAction.ID, localize('most popular filter', "Most Popular")), // {{SQL CARBON EDIT}}
|
||||
// this.instantiationService.createInstance(RecentlyPublishedExtensionsAction, RecentlyPublishedExtensionsAction.ID, localize('recently published filter', "Recently Published")), // {{SQL CARBON EDIT}}
|
||||
this.instantiationService.createInstance(ShowRecommendedExtensionsAction, ShowRecommendedExtensionsAction.ID, localize('recomended filter', "Recommended")),
|
||||
new ContextSubMenu(localize('filter by category', "Category"), EXTENSION_CATEGORIES.map(category => this.instantiationService.createInstance(SearchCategoryAction, `extensions.actions.searchByCategory.${category}`, category, category))),
|
||||
|
||||
new Separator(),
|
||||
this.instantiationService.createInstance(ShowBuiltInExtensionsAction, ShowBuiltInExtensionsAction.ID, localize('builtin filter', "Built-in")),
|
||||
this.instantiationService.createInstance(ShowInstalledExtensionsAction, ShowInstalledExtensionsAction.ID, localize('installed filter', "Installed")),
|
||||
this.instantiationService.createInstance(ShowEnabledExtensionsAction, ShowEnabledExtensionsAction.ID, localize('enabled filter', "Enabled")),
|
||||
this.instantiationService.createInstance(ShowDisabledExtensionsAction, ShowDisabledExtensionsAction.ID, localize('disabled filter', "Disabled")),
|
||||
this.instantiationService.createInstance(ShowOutdatedExtensionsAction, ShowOutdatedExtensionsAction.ID, localize('outdated filter', "Outdated")),
|
||||
|
||||
new Separator(),
|
||||
new ContextSubMenu(localize('sorty by', "Sort By"), [
|
||||
// this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.install', localize('sort by installs', "Install Count"), this.onSearchChange, 'installs'), // {{SQL CARBON EDIT}}
|
||||
// this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.rating', localize('sort by rating', "Rating"), this.onSearchChange, 'rating'), // {{SQL CARBON EDIT}}
|
||||
this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.name', localize('sort by name', "Name"), this.onSearchChange, 'name'),
|
||||
this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.publishedDate', localize('sort by date', "Published Date"), this.onSearchChange, 'publishedDate'),
|
||||
]),
|
||||
],
|
||||
this.contextMenuService, undefined, undefined, undefined, 'codicon-filter', undefined, true);
|
||||
}
|
||||
return super.getActionViewItem(action);
|
||||
}
|
||||
|
||||
getSecondaryActions(): IAction[] {
|
||||
const actions: IAction[] = [];
|
||||
|
||||
@@ -541,11 +542,13 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
|
||||
} else {
|
||||
actions.push(this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL), this.instantiationService.createInstance(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL));
|
||||
}
|
||||
actions.push(this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL));
|
||||
|
||||
actions.push(new Separator());
|
||||
actions.push(this.instantiationService.createInstance(DisableAllAction, DisableAllAction.ID, DisableAllAction.LABEL));
|
||||
actions.push(this.instantiationService.createInstance(EnableAllAction, EnableAllAction.ID, EnableAllAction.LABEL));
|
||||
actions.push(this.instantiationService.createInstance(DisableAllAction, DisableAllAction.ID, DisableAllAction.LABEL));
|
||||
|
||||
actions.push(new Separator());
|
||||
actions.push(this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL));
|
||||
|
||||
return actions;
|
||||
}
|
||||
@@ -565,7 +568,14 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
|
||||
}
|
||||
|
||||
private normalizedQuery(): string {
|
||||
return this.searchBox ? this.searchBox.getValue().replace(/@category/g, 'category').replace(/@tag:/g, 'tag:').replace(/@ext:/g, 'ext:') : '';
|
||||
return this.searchBox
|
||||
? this.searchBox.getValue()
|
||||
.replace(/@category/g, 'category')
|
||||
.replace(/@tag:/g, 'tag:')
|
||||
.replace(/@ext:/g, 'ext:')
|
||||
.replace(/@featured/g, 'featured')
|
||||
.replace(/@popular/g, '@sort:installs')
|
||||
: '';
|
||||
}
|
||||
|
||||
saveState(): void {
|
||||
|
||||
@@ -25,8 +25,7 @@ import { attachBadgeStyler } from 'vs/platform/theme/common/styler';
|
||||
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
|
||||
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 { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction, InstallLocalExtensionsInRemoteAction, getContextMenuActions, ExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions';
|
||||
import { WorkbenchPagedList, ListResourceNavigator } from 'vs/platform/list/browser/listService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
|
||||
@@ -38,7 +37,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria';
|
||||
import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list';
|
||||
import { createErrorWithActions } from 'vs/base/common/errorsWithActions';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { IAction, Action, Separator } from 'vs/base/common/actions';
|
||||
import { ExtensionType, ExtensionIdentifier, IExtensionDescription, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions';
|
||||
import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
@@ -248,7 +247,11 @@ export class ExtensionsListView extends ViewPane {
|
||||
});
|
||||
} else if (e.element) {
|
||||
const groups = getContextMenuActions(this.menuService, this.contextKeyService.createScoped(), this.instantiationService, e.element);
|
||||
groups.forEach(group => group.forEach(extensionAction => extensionAction.extension = e.element!));
|
||||
groups.forEach(group => group.forEach(extensionAction => {
|
||||
if (extensionAction instanceof ExtensionAction) {
|
||||
extensionAction.extension = e.element!;
|
||||
}
|
||||
}));
|
||||
let actions: IAction[] = [];
|
||||
for (const menuActions of groups) {
|
||||
actions = [...actions, ...menuActions, new Separator()];
|
||||
|
||||
@@ -40,6 +40,7 @@ import { IProductService } from 'vs/platform/product/common/productService';
|
||||
import { asDomUri } from 'vs/base/browser/dom';
|
||||
import { getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge';
|
||||
import { isWeb } from 'vs/base/common/platform';
|
||||
import { getExtensionKind } from 'vs/workbench/services/extensions/common/extensionsUtil';
|
||||
|
||||
import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator'; // {{SQL CARBON EDIT}}
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener'; // {{SQL CARBON EDIT}}
|
||||
@@ -686,14 +687,79 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
|
||||
if (extensions.length === 1) {
|
||||
return extensions[0];
|
||||
}
|
||||
|
||||
const enabledExtensions = extensions.filter(e => e.local && this.extensionEnablementService.isEnabled(e.local));
|
||||
if (enabledExtensions.length === 0) {
|
||||
return extensions[0];
|
||||
}
|
||||
if (enabledExtensions.length === 1) {
|
||||
return enabledExtensions[0];
|
||||
}
|
||||
return enabledExtensions.find(e => e.server === this.extensionManagementServerService.remoteExtensionManagementServer) || enabledExtensions[0];
|
||||
|
||||
const extensionsToChoose = enabledExtensions.length ? enabledExtensions : extensions;
|
||||
|
||||
let extension = extensionsToChoose.find(extension => {
|
||||
for (const extensionKind of getExtensionKind(extension.local!.manifest, this.productService, this.configurationService)) {
|
||||
switch (extensionKind) {
|
||||
case 'ui':
|
||||
/* UI extension is chosen only if it is installed locally */
|
||||
if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
case 'workspace':
|
||||
/* Choose remote workspace extension if exists */
|
||||
if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
case 'web':
|
||||
/* Choose web extension if exists */
|
||||
if (extension.server === this.extensionManagementServerService.webExtensionManagementServer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
if (!extension && this.extensionManagementServerService.localExtensionManagementServer) {
|
||||
extension = extensionsToChoose.find(extension => {
|
||||
for (const extensionKind of getExtensionKind(extension.local!.manifest, this.productService, this.configurationService)) {
|
||||
switch (extensionKind) {
|
||||
case 'workspace':
|
||||
/* Choose local workspace extension if exists */
|
||||
if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
case 'web':
|
||||
/* Choose local web extension if exists */
|
||||
if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
if (!extension && this.extensionManagementServerService.remoteExtensionManagementServer) {
|
||||
extension = extensionsToChoose.find(extension => {
|
||||
for (const extensionKind of getExtensionKind(extension.local!.manifest, this.productService, this.configurationService)) {
|
||||
switch (extensionKind) {
|
||||
case 'web':
|
||||
/* Choose remote web extension if exists */
|
||||
if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
return extension || extensions[0];
|
||||
}
|
||||
|
||||
private fromGallery(gallery: IGalleryExtension, maliciousExtensionSet: Set<string>): IExtension {
|
||||
|
||||
@@ -7,7 +7,7 @@ import 'vs/css!./media/runtimeExtensionsEditor';
|
||||
import * as nls from 'vs/nls';
|
||||
import * as os from 'os';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
import { Action, IAction } from 'vs/base/common/actions';
|
||||
import { Action, IAction, Separator } from 'vs/base/common/actions';
|
||||
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
@@ -18,7 +18,7 @@ import { IExtensionService, IExtensionsStatus, IExtensionHostProfile } from 'vs/
|
||||
import { IListVirtualDelegate, IListRenderer } from 'vs/base/browser/ui/list/list';
|
||||
import { WorkbenchList } from 'vs/platform/list/browser/listService';
|
||||
import { append, $, addClass, toggleClass, Dimension, clearNode } from 'vs/base/browser/dom';
|
||||
import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||
@@ -164,16 +164,17 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
this._register(this._extensionService.onDidChangeExtensionsStatus(() => this._updateSoon.schedule()));
|
||||
}
|
||||
|
||||
private _updateExtensions(): void {
|
||||
this._elements = this._resolveExtensions();
|
||||
private async _updateExtensions(): Promise<void> {
|
||||
this._elements = await this._resolveExtensions();
|
||||
if (this._list) {
|
||||
this._list.splice(0, this._list.length, this._elements);
|
||||
}
|
||||
}
|
||||
|
||||
private _resolveExtensions(): IRuntimeExtension[] {
|
||||
private async _resolveExtensions(): Promise<IRuntimeExtension[]> {
|
||||
let marketplaceMap: { [id: string]: IExtension; } = Object.create(null);
|
||||
for (let extension of this._extensionsWorkbenchService.local) {
|
||||
const marketPlaceExtensions = await this._extensionsWorkbenchService.queryLocal();
|
||||
for (let extension of marketPlaceExtensions) {
|
||||
marketplaceMap[ExtensionIdentifier.toKey(extension.identifier.id)] = extension;
|
||||
}
|
||||
|
||||
@@ -328,7 +329,7 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
} else {
|
||||
data.icon.style.visibility = 'inherit';
|
||||
}
|
||||
data.name.textContent = element.marketplaceInfo ? element.marketplaceInfo.displayName : element.description.displayName || '';
|
||||
data.name.textContent = element.marketplaceInfo.displayName;
|
||||
data.version.textContent = element.description.version;
|
||||
|
||||
const activationTimes = element.status.activationTimes!;
|
||||
@@ -462,11 +463,10 @@ export class RuntimeExtensionsEditor extends BaseEditor {
|
||||
actions.push(new ReportExtensionIssueAction(e.element, this._openerService, this._clipboardService, this._productService));
|
||||
actions.push(new Separator());
|
||||
|
||||
if (e.element.marketplaceInfo) {
|
||||
actions.push(new Action('runtimeExtensionsEditor.action.disableWorkspace', nls.localize('disable workspace', "Disable (Workspace)"), undefined, true, () => this._extensionsWorkbenchService.setEnablement(e.element!.marketplaceInfo, EnablementState.DisabledWorkspace)));
|
||||
actions.push(new Action('runtimeExtensionsEditor.action.disable', nls.localize('disable', "Disable"), undefined, true, () => this._extensionsWorkbenchService.setEnablement(e.element!.marketplaceInfo, EnablementState.DisabledGlobally)));
|
||||
actions.push(new Separator());
|
||||
}
|
||||
actions.push(new Action('runtimeExtensionsEditor.action.disableWorkspace', nls.localize('disable workspace', "Disable (Workspace)"), undefined, true, () => this._extensionsWorkbenchService.setEnablement(e.element!.marketplaceInfo, EnablementState.DisabledWorkspace)));
|
||||
actions.push(new Action('runtimeExtensionsEditor.action.disable', nls.localize('disable', "Disable"), undefined, true, () => this._extensionsWorkbenchService.setEnablement(e.element!.marketplaceInfo, EnablementState.DisabledGlobally)));
|
||||
actions.push(new Separator());
|
||||
|
||||
const state = this._extensionHostProfileService.state;
|
||||
if (state === ProfileSessionState.Running) {
|
||||
actions.push(this._instantiationService.createInstance(StopExtensionHostProfileAction, StopExtensionHostProfileAction.ID, StopExtensionHostProfileAction.LABEL));
|
||||
|
||||
@@ -14,7 +14,7 @@ import {
|
||||
IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension,
|
||||
DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IGalleryExtensionAssets, IExtensionIdentifier, InstallOperation, IExtensionTipsService, IGalleryMetadata
|
||||
} from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionRecommendationsService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
import { TestExtensionEnablementService } from 'vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test';
|
||||
import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService';
|
||||
@@ -34,7 +34,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
|
||||
import { NativeURLService } from 'vs/platform/url/common/urlService';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
|
||||
import { ExtensionType, IExtension, ExtensionKind } 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';
|
||||
@@ -46,6 +46,8 @@ import { TestLifecycleService } from 'vs/workbench/test/browser/workbenchTestSer
|
||||
import { IExperimentService } from 'vs/workbench/contrib/experiments/common/experimentService';
|
||||
import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test';
|
||||
import { ExtensionTipsService } from 'vs/platform/extensionManagement/node/extensionTipsService';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts';
|
||||
|
||||
suite('ExtensionsWorkbenchServiceTest', () => {
|
||||
|
||||
@@ -981,6 +983,384 @@ suite('ExtensionsWorkbenchServiceTest', () => {
|
||||
assert.equal(actual[0].enablementState, EnablementState.DisabledWorkspace);
|
||||
});
|
||||
|
||||
test('test user extension is preferred when the same extension exists as system and user extension', async () => {
|
||||
testObject = await aWorkbenchService();
|
||||
const userExtension = aLocalExtension('pub.a');
|
||||
const systemExtension = aLocalExtension('pub.a', {}, { type: ExtensionType.System });
|
||||
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [systemExtension, userExtension]);
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, userExtension);
|
||||
});
|
||||
|
||||
test('test user extension is disabled when the same extension exists as system and user extension and system extension is disabled', async () => {
|
||||
testObject = await aWorkbenchService();
|
||||
const systemExtension = aLocalExtension('pub.a', {}, { type: ExtensionType.System });
|
||||
await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([systemExtension], EnablementState.DisabledGlobally);
|
||||
const userExtension = aLocalExtension('pub.a');
|
||||
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [systemExtension, userExtension]);
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, userExtension);
|
||||
assert.equal(actual[0].enablementState, EnablementState.DisabledGlobally);
|
||||
});
|
||||
|
||||
test('Test local ui extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local workspace extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local web extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['web'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local ui,workspace extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui', 'workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local workspace,ui extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace', 'ui'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local ui,workspace,web extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui', 'workspace', 'web'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local ui,web,workspace extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui', 'web', 'workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local web,ui,workspace extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['web', 'ui', 'workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local web,workspace,ui extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['web', 'workspace', 'ui'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local workspace,web,ui extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace', 'web', 'ui'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local workspace,ui,web extension is chosen if it exists only in local server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace', 'ui', 'web'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local UI extension is chosen if it exists in both servers', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test local ui,workspace extension is chosen if it exists in both servers', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui', 'workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test remote workspace extension is chosen if it exists in remote server', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace'];
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, remoteExtension);
|
||||
});
|
||||
|
||||
test('Test remote workspace extension is chosen if it exists in both servers', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, remoteExtension);
|
||||
});
|
||||
|
||||
test('Test remote workspace extension is chosen if it exists in both servers and local is disabled', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localExtension], EnablementState.DisabledGlobally);
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, remoteExtension);
|
||||
assert.equal(actual[0].enablementState, EnablementState.DisabledGlobally);
|
||||
});
|
||||
|
||||
test('Test remote workspace extension is chosen if it exists in both servers and remote is disabled in workspace', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([remoteExtension], EnablementState.DisabledWorkspace);
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, remoteExtension);
|
||||
assert.equal(actual[0].enablementState, EnablementState.DisabledWorkspace);
|
||||
});
|
||||
|
||||
test('Test local ui, workspace extension is chosen if it exists in both servers and local is disabled', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui', 'workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localExtension], EnablementState.DisabledGlobally);
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
assert.equal(actual[0].enablementState, EnablementState.DisabledGlobally);
|
||||
});
|
||||
|
||||
test('Test local ui, workspace extension is chosen if it exists in both servers and local is disabled in workspace', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['ui', 'workspace'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localExtension], EnablementState.DisabledWorkspace);
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
assert.equal(actual[0].enablementState, EnablementState.DisabledWorkspace);
|
||||
});
|
||||
|
||||
test('Test local web extension is chosen if it exists in both servers', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['web'];
|
||||
const localExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`) });
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, localExtension);
|
||||
});
|
||||
|
||||
test('Test remote web extension is chosen if it exists only in remote', async () => {
|
||||
// multi server setup
|
||||
const extensionKind: ExtensionKind[] = ['web'];
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
|
||||
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([]), createExtensionManagementService([remoteExtension]));
|
||||
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
|
||||
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
|
||||
testObject = await aWorkbenchService();
|
||||
|
||||
const actual = await testObject.queryLocal();
|
||||
|
||||
assert.equal(actual.length, 1);
|
||||
assert.equal(actual[0].local, remoteExtension);
|
||||
});
|
||||
|
||||
async function aWorkbenchService(): Promise<ExtensionsWorkbenchService> {
|
||||
const workbenchService: ExtensionsWorkbenchService = instantiationService.createInstance(ExtensionsWorkbenchService);
|
||||
await workbenchService.queryLocal();
|
||||
@@ -1031,4 +1411,49 @@ suite('ExtensionsWorkbenchServiceTest', () => {
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IExtensionManagementService, remoteExtensionManagementService?: IExtensionManagementService): IExtensionManagementServerService {
|
||||
const localExtensionManagementServer: IExtensionManagementServer = {
|
||||
id: 'vscode-local',
|
||||
label: 'local',
|
||||
extensionManagementService: localExtensionManagementService || createExtensionManagementService()
|
||||
};
|
||||
const remoteExtensionManagementServer: IExtensionManagementServer = {
|
||||
id: 'vscode-remote',
|
||||
label: 'remote',
|
||||
extensionManagementService: remoteExtensionManagementService || createExtensionManagementService()
|
||||
};
|
||||
return {
|
||||
_serviceBrand: undefined,
|
||||
localExtensionManagementServer,
|
||||
remoteExtensionManagementServer,
|
||||
webExtensionManagementServer: null,
|
||||
getExtensionManagementServer: (extension: IExtension) => {
|
||||
if (extension.location.scheme === Schemas.file) {
|
||||
return localExtensionManagementServer;
|
||||
}
|
||||
if (extension.location.scheme === REMOTE_HOST_SCHEME) {
|
||||
return remoteExtensionManagementServer;
|
||||
}
|
||||
throw new Error('');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function createExtensionManagementService(installed: ILocalExtension[] = []): IExtensionManagementService {
|
||||
return <IExtensionManagementService>{
|
||||
onInstallExtension: Event.None,
|
||||
onDidInstallExtension: Event.None,
|
||||
onUninstallExtension: Event.None,
|
||||
onDidUninstallExtension: Event.None,
|
||||
getInstalled: () => Promise.resolve<ILocalExtension[]>(installed),
|
||||
installFromGallery: (extension: IGalleryExtension) => Promise.reject(new Error('not supported')),
|
||||
updateMetadata: async (local: ILocalExtension, metadata: IGalleryMetadata) => {
|
||||
local.identifier.uuid = metadata.id;
|
||||
local.publisherDisplayName = metadata.publisherDisplayName;
|
||||
local.publisherId = metadata.publisherId;
|
||||
return local;
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user