提交 7fe4bc2a 编写于 作者: S Sandeep Somavarapu

Fix #15611

上级 37b7c49c
......@@ -8,13 +8,14 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { distinct, coalesce } from 'vs/base/common/arrays';
import Event, { Emitter } from 'vs/base/common/event';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IExtensionManagementService, DidUninstallExtensionEvent, IExtensionEnablementService, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionManagementService, DidUninstallExtensionEvent, IExtensionEnablementService, IExtensionIdentifier, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
import { adoptToGalleryExtensionId, getIdAndVersionFromLocalExtensionId, areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
const DISABLED_EXTENSIONS_STORAGE_PATH = 'extensionsIdentifiers/disabled';
const ENABLED_EXTENSIONS_STORAGE_PATH = 'extensionsIdentifiers/enabled';
export class ExtensionEnablementService implements IExtensionEnablementService {
......@@ -31,115 +32,216 @@ export class ExtensionEnablementService implements IExtensionEnablementService {
@IEnvironmentService private environmentService: IEnvironmentService,
@IExtensionManagementService extensionManagementService: IExtensionManagementService
) {
extensionManagementService.onDidUninstallExtension(this.onDidUninstallExtension, this, this.disposables);
extensionManagementService.onDidUninstallExtension(this._onDidUninstallExtension, this, this.disposables);
}
private get hasWorkspace(): boolean {
return this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY;
}
getGloballyDisabledExtensions(): IExtensionIdentifier[] {
return this.getDisabledExtensions(StorageScope.GLOBAL);
}
getDisabledExtensions(): TPromise<IExtensionIdentifier[]> {
getWorkspaceDisabledExtensions(): IExtensionIdentifier[] {
return this.getDisabledExtensions(StorageScope.WORKSPACE);
}
let result = this._getDisabledExtensions(StorageScope.GLOBAL);
canEnable(identifier: IExtensionIdentifier): boolean {
if (this.environmentService.disableExtensions) {
return false;
if (this.hasWorkspace) {
for (const e of this._getDisabledExtensions(StorageScope.WORKSPACE)) {
if (!result.some(r => areSameExtensions(r, e))) {
result.push(e);
}
}
const workspaceEnabledExtensions = this._getEnabledExtensions(StorageScope.WORKSPACE);
if (workspaceEnabledExtensions.length) {
result = result.filter(r => !workspaceEnabledExtensions.some(e => areSameExtensions(e, r)));
}
}
return !this.isEnabled(identifier);
return TPromise.as(result);
}
isEnabled(identifier: IExtensionIdentifier): boolean {
if (this.environmentService.disableExtensions) {
return false;
}
if (this.getGloballyDisabledExtensions().some(d => areSameExtensions(d, identifier))) {
return false;
getEnablementState(identifier: IExtensionIdentifier): EnablementState {
if (this.hasWorkspace) {
if (this._getEnabledExtensions(StorageScope.WORKSPACE).filter(e => areSameExtensions(e, identifier))[0]) {
return EnablementState.WorkspaceEnabled;
}
if (this._getDisabledExtensions(StorageScope.WORKSPACE).filter(e => areSameExtensions(e, identifier))[0]) {
return EnablementState.WorkspaceDisabled;
}
}
if (this.getWorkspaceDisabledExtensions().some(d => areSameExtensions(d, identifier))) {
return false;
if (this._getDisabledExtensions(StorageScope.GLOBAL).filter(e => areSameExtensions(e, identifier))[0]) {
return EnablementState.Disabled;
}
return true;
return EnablementState.Enabled;
}
setEnablement(identifier: IExtensionIdentifier, enable: boolean, workspace: boolean = false): TPromise<boolean> {
canChangeEnablement(): boolean {
return !this.environmentService.disableExtensions;
}
setEnablement(identifier: IExtensionIdentifier, newState: EnablementState): TPromise<boolean> {
if (this.environmentService.disableExtensions) {
return TPromise.wrap(false);
}
const workspace = newState === EnablementState.WorkspaceDisabled || newState === EnablementState.WorkspaceEnabled;
if (workspace && !this.hasWorkspace) {
return TPromise.wrapError<boolean>(new Error(localize('noWorkspace', "No workspace.")));
}
if (this.environmentService.disableExtensions) {
return TPromise.wrap(false);
const currentState = this.getEnablementState(identifier);
if (currentState === newState) {
return TPromise.as(false);
}
if (enable) {
if (workspace) {
return this.enableExtension(identifier, StorageScope.WORKSPACE);
} else {
return this.enableExtension(identifier, StorageScope.GLOBAL);
}
} else {
if (workspace) {
return this.disableExtension(identifier, StorageScope.WORKSPACE);
} else {
return this.disableExtension(identifier, StorageScope.GLOBAL);
}
switch (newState) {
case EnablementState.Enabled:
this._enableExtension(identifier);
break;
case EnablementState.Disabled:
this._disableExtension(identifier);
break;
case EnablementState.WorkspaceEnabled:
this._enableExtensionInWorkspace(identifier);
break;
case EnablementState.WorkspaceDisabled:
this._disableExtensionInWorkspace(identifier);
break;
}
this._onEnablementChanged.fire(identifier);
return TPromise.as(true);
}
isEnabled(identifier: IExtensionIdentifier): boolean {
const enablementState = this.getEnablementState(identifier);
return enablementState === EnablementState.WorkspaceEnabled || enablementState === EnablementState.Enabled;
}
migrateToIdentifiers(installed: IExtensionIdentifier[]): void {
this.migrateDisabledExtensions(installed, StorageScope.GLOBAL);
this._migrateDisabledExtensions(installed, StorageScope.GLOBAL);
if (this.hasWorkspace) {
this.migrateDisabledExtensions(installed, StorageScope.WORKSPACE);
this._migrateDisabledExtensions(installed, StorageScope.WORKSPACE);
}
}
private disableExtension(identifier: IExtensionIdentifier, scope: StorageScope): TPromise<boolean> {
let disabledExtensions = this.getDisabledExtensions(scope);
private _enableExtension(identifier: IExtensionIdentifier): void {
this._removeFromDisabledExtensions(identifier, StorageScope.WORKSPACE);
this._removeFromEnabledExtensions(identifier, StorageScope.WORKSPACE);
this._removeFromDisabledExtensions(identifier, StorageScope.GLOBAL);
}
private _disableExtension(identifier: IExtensionIdentifier): void {
this._removeFromDisabledExtensions(identifier, StorageScope.WORKSPACE);
this._removeFromEnabledExtensions(identifier, StorageScope.WORKSPACE);
this._addToDisabledExtensions(identifier, StorageScope.GLOBAL);
}
private _enableExtensionInWorkspace(identifier: IExtensionIdentifier): void {
this._removeFromDisabledExtensions(identifier, StorageScope.WORKSPACE);
this._addToEnabledExtensions(identifier, StorageScope.WORKSPACE);
}
private _disableExtensionInWorkspace(identifier: IExtensionIdentifier): void {
this._addToDisabledExtensions(identifier, StorageScope.WORKSPACE);
this._removeFromEnabledExtensions(identifier, StorageScope.WORKSPACE);
}
private _addToDisabledExtensions(identifier: IExtensionIdentifier, scope: StorageScope): TPromise<boolean> {
if (scope === StorageScope.WORKSPACE && !this.hasWorkspace) {
return TPromise.wrap(false);
}
let disabledExtensions = this._getDisabledExtensions(scope);
if (disabledExtensions.every(e => !areSameExtensions(e, identifier))) {
disabledExtensions.push(identifier);
this.setDisabledExtensions(disabledExtensions, scope, identifier);
this._setDisabledExtensions(disabledExtensions, scope, identifier);
return TPromise.wrap(true);
}
return TPromise.wrap(false);
}
private enableExtension(identifier: IExtensionIdentifier, scope: StorageScope, fireEvent = true): TPromise<boolean> {
let disabledExtensions = this.getDisabledExtensions(scope);
private _removeFromDisabledExtensions(identifier: IExtensionIdentifier, scope: StorageScope): boolean {
if (scope === StorageScope.WORKSPACE && !this.hasWorkspace) {
return false;
}
let disabledExtensions = this._getDisabledExtensions(scope);
for (let index = 0; index < disabledExtensions.length; index++) {
const disabledExtension = disabledExtensions[index];
if (areSameExtensions(disabledExtension, identifier)) {
disabledExtensions.splice(index, 1);
this.setDisabledExtensions(disabledExtensions, scope, identifier, fireEvent);
return TPromise.wrap(true);
this._setDisabledExtensions(disabledExtensions, scope, identifier);
return true;
}
}
return TPromise.wrap(false);
return false;
}
private _addToEnabledExtensions(identifier: IExtensionIdentifier, scope: StorageScope): boolean {
if (scope === StorageScope.WORKSPACE && !this.hasWorkspace) {
return false;
}
let enabledExtensions = this._getEnabledExtensions(scope);
if (enabledExtensions.every(e => !areSameExtensions(e, identifier))) {
enabledExtensions.push(identifier);
this._setEnabledExtensions(enabledExtensions, scope, identifier);
return true;
}
return false;
}
private _removeFromEnabledExtensions(identifier: IExtensionIdentifier, scope: StorageScope): boolean {
if (scope === StorageScope.WORKSPACE && !this.hasWorkspace) {
return false;
}
let enabledExtensions = this._getEnabledExtensions(scope);
for (let index = 0; index < enabledExtensions.length; index++) {
const disabledExtension = enabledExtensions[index];
if (areSameExtensions(disabledExtension, identifier)) {
enabledExtensions.splice(index, 1);
this._setEnabledExtensions(enabledExtensions, scope, identifier);
return true;
}
}
return false;
}
private _getEnabledExtensions(scope: StorageScope): IExtensionIdentifier[] {
return this._getExtensions(ENABLED_EXTENSIONS_STORAGE_PATH, scope);
}
private _setEnabledExtensions(enabledExtensions: IExtensionIdentifier[], scope: StorageScope, extension: IExtensionIdentifier): void {
this._setExtensions(ENABLED_EXTENSIONS_STORAGE_PATH, enabledExtensions, scope, extension);
}
private _getDisabledExtensions(scope: StorageScope): IExtensionIdentifier[] {
return this._getExtensions(DISABLED_EXTENSIONS_STORAGE_PATH, scope);
}
private _setDisabledExtensions(disabledExtensions: IExtensionIdentifier[], scope: StorageScope, extension: IExtensionIdentifier, fireEvent = true): void {
this._setExtensions(DISABLED_EXTENSIONS_STORAGE_PATH, disabledExtensions, scope, extension, fireEvent);
}
private getDisabledExtensions(scope: StorageScope): IExtensionIdentifier[] {
private _getExtensions(storageId: string, scope: StorageScope): IExtensionIdentifier[] {
if (scope === StorageScope.WORKSPACE && !this.hasWorkspace) {
return [];
}
const value = this.storageService.get(DISABLED_EXTENSIONS_STORAGE_PATH, scope, '');
const value = this.storageService.get(storageId, scope, '');
return value ? JSON.parse(value) : [];
}
private setDisabledExtensions(disabledExtensions: IExtensionIdentifier[], scope: StorageScope, extension: IExtensionIdentifier, fireEvent = true): void {
if (disabledExtensions.length) {
this.storageService.store(DISABLED_EXTENSIONS_STORAGE_PATH, JSON.stringify(disabledExtensions.map(({ id, uuid }) => (<IExtensionIdentifier>{ id, uuid }))), scope);
private _setExtensions(storageId: string, extensions: IExtensionIdentifier[], scope: StorageScope, extension: IExtensionIdentifier, fireEvent = true): void {
if (extensions.length) {
this.storageService.store(storageId, JSON.stringify(extensions.map(({ id, uuid }) => (<IExtensionIdentifier>{ id, uuid }))), scope);
} else {
this.storageService.remove(DISABLED_EXTENSIONS_STORAGE_PATH, scope);
this.storageService.remove(storageId, scope);
}
if (fireEvent) {
this._onEnablementChanged.fire(extension);
}
}
private migrateDisabledExtensions(installedExtensions: IExtensionIdentifier[], scope: StorageScope): void {
private _migrateDisabledExtensions(installedExtensions: IExtensionIdentifier[], scope: StorageScope): void {
const oldValue = this.storageService.get('extensions/disabled', scope, '');
if (oldValue) {
const extensionIdentifiers = coalesce(distinct(oldValue.split(',')).map(id => {
......@@ -154,13 +256,14 @@ export class ExtensionEnablementService implements IExtensionEnablementService {
this.storageService.remove('extensions/disabled', scope);
}
private onDidUninstallExtension({ identifier, error }: DidUninstallExtensionEvent): void {
private _onDidUninstallExtension({ identifier, error }: DidUninstallExtensionEvent): void {
if (!error) {
const id = getIdAndVersionFromLocalExtensionId(identifier.id).id;
if (id) {
const extension = { id, uuid: identifier.uuid };
this.enableExtension(extension, StorageScope.WORKSPACE, false);
this.enableExtension(extension, StorageScope.GLOBAL, false);
this._removeFromDisabledExtensions(extension, StorageScope.WORKSPACE);
this._removeFromEnabledExtensions(extension, StorageScope.WORKSPACE);
this._removeFromDisabledExtensions(extension, StorageScope.GLOBAL);
}
}
}
......
......@@ -263,6 +263,13 @@ export interface IExtensionManagementService {
updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): TPromise<ILocalExtension>;
}
export enum EnablementState {
Disabled,
WorkspaceDisabled,
Enabled,
WorkspaceEnabled
}
export const IExtensionEnablementService = createDecorator<IExtensionEnablementService>('extensionEnablementService');
// TODO: @sandy: Merge this into IExtensionManagementService when we have a storage service available in Shared process
......@@ -275,21 +282,20 @@ export interface IExtensionEnablementService {
onEnablementChanged: Event<IExtensionIdentifier>;
/**
* Returns all globally disabled extension identifiers.
* Returns an empty array if none exist.
* Returns all disabled extension identifiers for current workspace
* Returns an empty array if none exist
*/
getGloballyDisabledExtensions(): IExtensionIdentifier[];
getDisabledExtensions(): TPromise<IExtensionIdentifier[]>;
/**
* Returns all workspace disabled extension identifiers.
* Returns an empty array if none exist or workspace does not exist.
* Returns the enablement state for the given extension
*/
getWorkspaceDisabledExtensions(): IExtensionIdentifier[];
getEnablementState(identifier: IExtensionIdentifier): EnablementState;
/**
* Returns `true` if given extension can be enabled by calling `setEnablement`, otherwise false`.
* Returns `true` if the enablement can be changed.
*/
canEnable(identifier: IExtensionIdentifier): boolean;
canChangeEnablement(): boolean;
/**
* Returns `true` if the given extension identifier is enabled.
......@@ -305,7 +311,7 @@ export interface IExtensionEnablementService {
*
* Throws error if enablement is requested for workspace and there is no workspace
*/
setEnablement(identifier: IExtensionIdentifier, enable: boolean, workspace?: boolean): TPromise<boolean>;
setEnablement(identifier: IExtensionIdentifier, state: EnablementState): TPromise<boolean>;
migrateToIdentifiers(installed: IExtensionIdentifier[]): void;
}
......
......@@ -5,8 +5,7 @@
'use strict';
import { ILocalExtension, IGalleryExtension, EXTENSION_IDENTIFIER_REGEX, IExtensionEnablementService, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import { ILocalExtension, IGalleryExtension, EXTENSION_IDENTIFIER_REGEX, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement';
export function areSameExtensions(a: IExtensionIdentifier, b: IExtensionIdentifier): boolean {
if (a.uuid && b.uuid) {
......@@ -81,23 +80,5 @@ export function getGalleryExtensionTelemetryData(extension: IGalleryExtension):
};
}
const BetterMergeCheckKey = 'extensions/bettermergecheck';
export const BetterMergeDisabledNowKey = 'extensions/bettermergedisablednow';
export const BetterMergeId = 'pprice.better-merge';
/**
* Globally disabled extensions, taking care of disabling obsolete extensions.
*/
export function getGloballyDisabledExtensions(extensionEnablementService: IExtensionEnablementService, storageService: IStorageService, installedExtensions: { id: string; }[]) {
const globallyDisabled = extensionEnablementService.getGloballyDisabledExtensions();
if (!storageService.getBoolean(BetterMergeCheckKey, StorageScope.GLOBAL, false)) {
storageService.store(BetterMergeCheckKey, true);
if (globallyDisabled.every(disabled => disabled.id !== BetterMergeId) && installedExtensions.some(d => d.id === BetterMergeId)) {
globallyDisabled.push({ id: BetterMergeId });
extensionEnablementService.setEnablement({ id: BetterMergeId }, false);
storageService.store(BetterMergeDisabledNowKey, true);
}
}
return globallyDisabled;
}
\ No newline at end of file
export const BetterMergeId = 'pprice.better-merge';
\ No newline at end of file
......@@ -17,7 +17,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions';
import { ExtensionsConfigurationInitialContent } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate';
import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IMessageService } from 'vs/platform/message/common/message';
......@@ -332,7 +332,7 @@ export class DropDownMenuActionItem extends ActionItem {
private getActions(): IAction[] {
let actions: IAction[] = [];
const menuActionGroups = this.menuActionGroups.filter(group => group.some(action => action.enabled));
const menuActionGroups = this.menuActionGroups;
for (const menuActions of menuActionGroups) {
actions = [...actions, ...menuActions, new Separator()];
}
......@@ -368,12 +368,12 @@ export class ManageExtensionAction extends Action {
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [
[
instantiationService.createInstance(EnableForWorkspaceAction, localize('enableForWorkspaceAction.label', "Enable (Workspace)")),
instantiationService.createInstance(EnableGloballyAction, localize('enableAlwaysAction.label', "Enable (Always)"))
instantiationService.createInstance(EnableForWorkspaceAction, EnableForWorkspaceAction.LABEL),
instantiationService.createInstance(EnableGloballyAction, EnableGloballyAction.LABEL)
],
[
instantiationService.createInstance(DisableForWorkspaceAction, localize('disableForWorkspaceAction.label', "Disable (Workspace)")),
instantiationService.createInstance(DisableGloballyAction, localize('disableAlwaysAction.label', "Disable (Always)"))
instantiationService.createInstance(DisableForWorkspaceAction, DisableForWorkspaceAction.LABEL),
instantiationService.createInstance(DisableGloballyAction, DisableGloballyAction.LABEL)
],
[
instantiationService.createInstance(UninstallAction)
......@@ -411,7 +411,7 @@ export class ManageExtensionAction extends Action {
export class EnableForWorkspaceAction extends Action implements IExtensionAction {
static ID = 'extensions.enableForWorkspace';
static LABEL = localize('enableForWorkspaceAction', "Workspace");
static LABEL = localize('enableForWorkspaceAction', "Enable (Workspace)");
private disposables: IDisposable[] = [];
......@@ -434,12 +434,12 @@ export class EnableForWorkspaceAction extends Action implements IExtensionAction
private update(): void {
this.enabled = false;
if (this.extension) {
this.enabled = !this.extension.disabledGlobally && this.extension.disabledForWorkspace && this.extensionEnablementService.canEnable(this.extension);
this.enabled = (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) && this.extensionEnablementService.canChangeEnablement();
}
}
run(): TPromise<any> {
return this.extensionsWorkbenchService.setEnablement(this.extension, true, true);
return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.WorkspaceEnabled);
}
dispose(): void {
......@@ -451,7 +451,7 @@ export class EnableForWorkspaceAction extends Action implements IExtensionAction
export class EnableGloballyAction extends Action implements IExtensionAction {
static ID = 'extensions.enableGlobally';
static LABEL = localize('enableGloballyAction', "Always");
static LABEL = localize('enableGloballyAction', "Enable");
private disposables: IDisposable[] = [];
......@@ -472,12 +472,12 @@ export class EnableGloballyAction extends Action implements IExtensionAction {
private update(): void {
this.enabled = false;
if (this.extension) {
this.enabled = this.extension.disabledGlobally && this.extensionEnablementService.canEnable(this.extension);
this.enabled = (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) && this.extensionEnablementService.canChangeEnablement();
}
}
run(): TPromise<any> {
return this.extensionsWorkbenchService.setEnablement(this.extension, true, false);
return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.Enabled);
}
dispose(): void {
......@@ -494,6 +494,8 @@ export class EnableAction extends Action {
private disposables: IDisposable[] = [];
private _enableActions: IExtensionAction[];
private _actionItem: DropDownMenuActionItem;
get actionItem(): IActionItem { return this._actionItem; }
......@@ -504,17 +506,15 @@ export class EnableAction extends Action {
constructor(
@IInstantiationService private instantiationService: IInstantiationService,
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService,
@IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService
) {
super(EnableAction.ID, localize('enableAction', "Enable"), EnableAction.DisabledClass, false);
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [
[
instantiationService.createInstance(EnableForWorkspaceAction, EnableForWorkspaceAction.LABEL),
instantiationService.createInstance(EnableGloballyAction, EnableGloballyAction.LABEL)
]
]);
this._enableActions = [
instantiationService.createInstance(EnableForWorkspaceAction, EnableForWorkspaceAction.LABEL),
instantiationService.createInstance(EnableGloballyAction, EnableGloballyAction.LABEL)
];
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [this._enableActions]);
this.disposables.push(this._actionItem);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
......@@ -528,7 +528,7 @@ export class EnableAction extends Action {
return;
}
this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.disabledGlobally || this.extension.disabledForWorkspace) && this.extensionEnablementService.canEnable(this.extension);
this.enabled = this.extension.state === ExtensionState.Installed && this._enableActions.some(e => e.enabled);
this.class = this.enabled ? EnableAction.EnabledClass : EnableAction.DisabledClass;
}
......@@ -547,7 +547,7 @@ export class EnableAction extends Action {
export class DisableForWorkspaceAction extends Action implements IExtensionAction {
static ID = 'extensions.disableForWorkspace';
static LABEL = localize('disableForWorkspaceAction', "Workspace");
static LABEL = localize('disableForWorkspaceAction', "Disable (Workspace)");
private disposables: IDisposable[] = [];
......@@ -569,12 +569,12 @@ export class DisableForWorkspaceAction extends Action implements IExtensionActio
private update(): void {
this.enabled = false;
if (this.extension && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
this.enabled = this.extension.type !== LocalExtensionType.System && !this.extension.disabledGlobally && !this.extension.disabledForWorkspace;
this.enabled = this.extension.type !== LocalExtensionType.System && (this.extension.enablementState === EnablementState.Enabled || this.extension.enablementState === EnablementState.WorkspaceEnabled);
}
}
run(): TPromise<any> {
return this.extensionsWorkbenchService.setEnablement(this.extension, false, true);
return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.WorkspaceDisabled);
}
dispose(): void {
......@@ -586,7 +586,7 @@ export class DisableForWorkspaceAction extends Action implements IExtensionActio
export class DisableGloballyAction extends Action implements IExtensionAction {
static ID = 'extensions.disableGlobally';
static LABEL = localize('disableGloballyAction', "Always");
static LABEL = localize('disableGloballyAction', "Disable");
private disposables: IDisposable[] = [];
......@@ -606,12 +606,12 @@ export class DisableGloballyAction extends Action implements IExtensionAction {
private update(): void {
this.enabled = false;
if (this.extension) {
this.enabled = this.extension.type !== LocalExtensionType.System && !this.extension.disabledGlobally && !this.extension.disabledForWorkspace;
this.enabled = this.extension.type !== LocalExtensionType.System && (this.extension.enablementState === EnablementState.Enabled || this.extension.enablementState === EnablementState.WorkspaceEnabled);
}
}
run(): TPromise<any> {
return this.extensionsWorkbenchService.setEnablement(this.extension, false, false);
return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.Disabled);
}
dispose(): void {
......@@ -628,6 +628,7 @@ export class DisableAction extends Action {
private static readonly DisabledClass = `${DisableAction.EnabledClass} disabled`;
private disposables: IDisposable[] = [];
private _disableActions: IExtensionAction[];
private _actionItem: DropDownMenuActionItem;
get actionItem(): IActionItem { return this._actionItem; }
......@@ -641,12 +642,11 @@ export class DisableAction extends Action {
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService,
) {
super(DisableAction.ID, localize('disableAction', "Disable"), DisableAction.DisabledClass, false);
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [
[
instantiationService.createInstance(DisableForWorkspaceAction, DisableForWorkspaceAction.LABEL),
instantiationService.createInstance(DisableGloballyAction, DisableGloballyAction.LABEL)
]
]);
this._disableActions = [
instantiationService.createInstance(DisableForWorkspaceAction, DisableForWorkspaceAction.LABEL),
instantiationService.createInstance(DisableGloballyAction, DisableGloballyAction.LABEL)
];
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [this._disableActions]);
this.disposables.push(this._actionItem);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
......@@ -660,7 +660,7 @@ export class DisableAction extends Action {
return;
}
this.enabled = this.extension.state === ExtensionState.Installed && this.extension.type !== LocalExtensionType.System && !this.extension.disabledGlobally && !this.extension.disabledForWorkspace;
this.enabled = this.extension.state === ExtensionState.Installed && this.extension.type !== LocalExtensionType.System && this._disableActions.some(a => a.enabled);
this.class = this.enabled ? DisableAction.EnabledClass : DisableAction.DisabledClass;
}
......@@ -827,7 +827,7 @@ export class ReloadAction extends Action {
private computeReloadState(runningExtensions: IExtensionDescription[]): void {
const isInstalled = this.extensionsWorkbenchService.local.some(e => e.id === this.extension.id);
const isUninstalled = this.extension.state === ExtensionState.Uninstalled;
const isDisabled = !this.extensionEnablementService.isEnabled(this.extension);
const isDisabled = !this.extensionEnablementService.isEnabled({ id: this.extension.id, uuid: this.extension.uuid });
const filteredExtensions = runningExtensions.filter(e => areSameExtensions(e, this.extension));
const isExtensionRunning = filteredExtensions.length > 0;
......@@ -1516,11 +1516,11 @@ export class DisableAllAction extends Action {
}
private update(): void {
this.enabled = this.extensionsWorkbenchService.local.some(e => e.type === LocalExtensionType.User && !e.disabledForWorkspace && !e.disabledGlobally);
this.enabled = this.extensionsWorkbenchService.local.some(e => e.type === LocalExtensionType.User && (e.enablementState === EnablementState.Enabled || e.enablementState === EnablementState.WorkspaceEnabled));
}
run(): TPromise<any> {
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, false)));
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, EnablementState.Disabled)));
}
dispose(): void {
......@@ -1548,11 +1548,11 @@ export class DisableAllWorkpsaceAction extends Action {
}
private update(): void {
this.enabled = this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY && this.extensionsWorkbenchService.local.some(e => e.type === LocalExtensionType.User && !e.disabledForWorkspace && !e.disabledGlobally);
this.enabled = this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY && this.extensionsWorkbenchService.local.some(e => e.type === LocalExtensionType.User && (e.enablementState === EnablementState.Enabled || e.enablementState === EnablementState.WorkspaceEnabled));
}
run(): TPromise<any> {
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, false, true)));
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, EnablementState.WorkspaceDisabled)));
}
dispose(): void {
......@@ -1579,11 +1579,11 @@ export class EnableAllAction extends Action {
}
private update(): void {
this.enabled = this.extensionsWorkbenchService.local.some(e => this.extensionEnablementService.canEnable(e) && e.disabledGlobally);
this.enabled = this.extensionsWorkbenchService.local.some(e => this.extensionEnablementService.canChangeEnablement() && (e.enablementState === EnablementState.Disabled || e.enablementState === EnablementState.WorkspaceDisabled));
}
run(): TPromise<any> {
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, true)));
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, EnablementState.Enabled)));
}
dispose(): void {
......@@ -1612,11 +1612,11 @@ export class EnableAllWorkpsaceAction extends Action {
}
private update(): void {
this.enabled = this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY && this.extensionsWorkbenchService.local.some(e => this.extensionEnablementService.canEnable(e) && !e.disabledGlobally && e.disabledForWorkspace);
this.enabled = this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY && this.extensionsWorkbenchService.local.some(e => this.extensionEnablementService.canChangeEnablement() && (e.enablementState === EnablementState.Disabled || e.enablementState === EnablementState.WorkspaceDisabled));
}
run(): TPromise<any> {
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, true, true)));
return TPromise.join(this.extensionsWorkbenchService.local.map(e => this.extensionsWorkbenchService.setEnablement(e, EnablementState.WorkspaceEnabled)));
}
dispose(): void {
......
......@@ -8,7 +8,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
import Event from 'vs/base/common/event';
import { TPromise } from 'vs/base/common/winjs.base';
import { IPager } from 'vs/base/common/paging';
import { IQueryOptions, IExtensionManifest, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IQueryOptions, IExtensionManifest, LocalExtensionType, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
export const VIEWLET_ID = 'workbench.view.extensions';
......@@ -44,8 +44,7 @@ export interface IExtension {
rating: number;
ratingCount: number;
outdated: boolean;
disabledGlobally: boolean;
disabledForWorkspace: boolean;
enablementState: EnablementState;
dependencies: string[];
telemetryData: any;
preview: boolean;
......@@ -76,7 +75,7 @@ export interface IExtensionsWorkbenchService {
install(vsix: string): TPromise<void>;
install(extension: IExtension, promptToInstallDependencies?: boolean): TPromise<void>;
uninstall(extension: IExtension): TPromise<void>;
setEnablement(extension: IExtension, enable: boolean, workspace?: boolean): TPromise<void>;
setEnablement(extension: IExtension, enablementState: EnablementState): TPromise<void>;
loadDependencies(extension: IExtension): TPromise<IExtensionDependencies>;
open(extension: IExtension, sideByside?: boolean): TPromise<any>;
checkForUpdates(): TPromise<void>;
......
......@@ -12,7 +12,7 @@ import { onUnexpectedError, canceled } from 'vs/base/common/errors';
import { TPromise } from 'vs/base/common/winjs.base';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IExtensionManagementService, ILocalExtension, IExtensionEnablementService, IExtensionTipsService, LocalExtensionType, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionManagementService, ILocalExtension, IExtensionEnablementService, IExtensionTipsService, LocalExtensionType, IExtensionIdentifier, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
......@@ -103,7 +103,7 @@ export class KeymapExtensions implements IWorkbenchContribution {
this.telemetryService.publicLog('disableOtherKeymaps', telemetryData);
if (confirmed) {
return TPromise.join(oldKeymaps.map(keymap => {
return this.extensionEnablementService.setEnablement(keymap.local.identifier, false);
return this.extensionEnablementService.setEnablement(keymap.local.identifier, EnablementState.Disabled);
}));
}
return undefined;
......@@ -138,14 +138,16 @@ export function getInstalledExtensions(accessor: ServicesAccessor): TPromise<IEx
const extensionService = accessor.get(IExtensionManagementService);
const extensionEnablementService = accessor.get(IExtensionEnablementService);
return extensionService.getInstalled().then(extensions => {
const globallyDisabled = extensionEnablementService.getGloballyDisabledExtensions();
return extensions.map(extension => {
return {
identifier: { id: adoptToGalleryExtensionId(extension.identifier.id), uuid: extension.identifier.uuid },
local: extension,
globallyEnabled: globallyDisabled.every(disabled => !areSameExtensions(disabled, extension.identifier))
};
});
return extensionEnablementService.getDisabledExtensions()
.then(disabledExtensions => {
return extensions.map(extension => {
return {
identifier: { id: adoptToGalleryExtensionId(extension.identifier.id), uuid: extension.identifier.uuid },
local: extension,
globallyEnabled: disabledExtensions.every(disabled => !areSameExtensions(disabled, extension.identifier))
};
});
});
});
}
......
......@@ -14,7 +14,7 @@ import { isPromiseCanceledError, create as createError } from 'vs/base/common/er
import Severity from 'vs/base/common/severity';
import { PagedModel, IPagedModel, mergePagers, IPager } from 'vs/base/common/paging';
import { IMessageService, CloseAction } from 'vs/platform/message/common/message';
import { SortBy, SortOrder, IQueryOptions, LocalExtensionType, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { SortBy, SortOrder, IQueryOptions, LocalExtensionType, IExtensionTipsService, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
......@@ -220,7 +220,7 @@ export class ExtensionsListView extends ViewsViewletPanel {
const result = local
.sort((e1, e2) => e1.displayName.localeCompare(e2.displayName))
.filter(e => e.type === LocalExtensionType.User &&
!(e.disabledForWorkspace || e.disabledGlobally) &&
(e.enablementState === EnablementState.Enabled || e.enablementState === EnablementState.WorkspaceEnabled) &&
e.name.toLowerCase().indexOf(value) > -1
);
......
......@@ -20,7 +20,7 @@ import { IPager, mapPager, singlePagePager } from 'vs/base/common/paging';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import {
IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension, IQueryOptions, IExtensionManifest,
InstallExtensionEvent, DidInstallExtensionEvent, LocalExtensionType, DidUninstallExtensionEvent, IExtensionEnablementService, IExtensionIdentifier
InstallExtensionEvent, DidInstallExtensionEvent, LocalExtensionType, DidUninstallExtensionEvent, IExtensionEnablementService, IExtensionIdentifier, EnablementState
} from 'vs/platform/extensionManagement/common/extensionManagement';
import { getGalleryExtensionIdFromLocal, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
......@@ -33,7 +33,6 @@ import { IExtension, IExtensionDependencies, ExtensionState, IExtensionsWorkbenc
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IURLService } from 'vs/platform/url/common/url';
import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import product from 'vs/platform/node/product';
interface IExtensionStateProvider {
......@@ -42,8 +41,7 @@ interface IExtensionStateProvider {
class Extension implements IExtension {
public disabledGlobally = false;
public disabledForWorkspace = false;
public enablementState: EnablementState = EnablementState.Enabled;
constructor(
private galleryService: IExtensionGalleryService,
......@@ -341,7 +339,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
@IChoiceService private choiceService: IChoiceService,
@IURLService urlService: IURLService,
@IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService,
@IWorkspaceContextService private workspaceContextService: IWorkspaceContextService,
@IWindowService private windowService: IWindowService
) {
this.stateProvider = ext => this.getExtensionState(ext);
......@@ -381,13 +378,10 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
queryLocal(): TPromise<IExtension[]> {
return this.extensionService.getInstalled().then(result => {
const installedById = index(this.installed, e => e.local.identifier.id);
const globallyDisabledExtensions = this.extensionEnablementService.getGloballyDisabledExtensions();
const workspaceDisabledExtensions = this.extensionEnablementService.getWorkspaceDisabledExtensions();
this.installed = result.map(local => {
const extension = installedById[local.identifier.id] || new Extension(this.galleryService, this.stateProvider, local, null, this.telemetryService);
extension.local = local;
extension.disabledGlobally = globallyDisabledExtensions.some(d => areSameExtensions(d, extension));
extension.disabledForWorkspace = workspaceDisabledExtensions.some(d => areSameExtensions(d, extension));
extension.enablementState = this.extensionEnablementService.getEnablementState({ id: extension.id, uuid: extension.uuid });
return extension;
});
......@@ -560,12 +554,13 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
return this.extensionService.installFromGallery(gallery);
}
setEnablement(extension: IExtension, enable: boolean, workspace: boolean = false): TPromise<void> {
setEnablement(extension: IExtension, enablementState: EnablementState): TPromise<void> {
if (extension.type === LocalExtensionType.System) {
return TPromise.wrap<void>(void 0);
}
return this.promptAndSetEnablement(extension, enable, workspace).then(reload => {
const enable = enablementState === EnablementState.Enabled || enablementState === EnablementState.WorkspaceEnabled;
return this.promptAndSetEnablement(extension, enablementState, enable).then(reload => {
/* __GDPR__
"extension:enable" : {
"${include}": [
......@@ -600,19 +595,19 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
}
private promptAndSetEnablement(extension: IExtension, enable: boolean, workspace: boolean): TPromise<any> {
const allDependencies = this.getDependenciesRecursively(extension, this.local, enable, workspace, []);
private promptAndSetEnablement(extension: IExtension, enablementState: EnablementState, enable: boolean): TPromise<any> {
const allDependencies = this.getDependenciesRecursively(extension, this.local, enablementState, []);
if (allDependencies.length > 0) {
if (enable) {
return this.promptForDependenciesAndEnable(extension, allDependencies, workspace);
return this.promptForDependenciesAndEnable(extension, allDependencies, enablementState, enable);
} else {
return this.promptForDependenciesAndDisable(extension, allDependencies, workspace);
return this.promptForDependenciesAndDisable(extension, allDependencies, enablementState, enable);
}
}
return this.checkAndSetEnablement(extension, [], enable, workspace);
return this.checkAndSetEnablement(extension, [], enablementState, enable);
}
private promptForDependenciesAndEnable(extension: IExtension, dependencies: IExtension[], workspace: boolean): TPromise<any> {
private promptForDependenciesAndEnable(extension: IExtension, dependencies: IExtension[], enablementState: EnablementState, enable: boolean): TPromise<any> {
const message = nls.localize('enableDependeciesConfirmation', "Enabling '{0}' also enable its dependencies. Would you like to continue?", extension.displayName);
const options = [
nls.localize('enable', "Yes"),
......@@ -621,13 +616,13 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
return this.choiceService.choose(Severity.Info, message, options, 1, true)
.then<void>(value => {
if (value === 0) {
return this.checkAndSetEnablement(extension, dependencies, true, workspace);
return this.checkAndSetEnablement(extension, dependencies, enablementState, enable);
}
return TPromise.as(null);
});
}
private promptForDependenciesAndDisable(extension: IExtension, dependencies: IExtension[], workspace: boolean): TPromise<void> {
private promptForDependenciesAndDisable(extension: IExtension, dependencies: IExtension[], enablementState: EnablementState, enable: boolean): TPromise<void> {
const message = nls.localize('disableDependeciesConfirmation', "Would you like to disable '{0}' only or its dependencies also?", extension.displayName);
const options = [
nls.localize('disableOnly', "Only"),
......@@ -637,26 +632,26 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
return this.choiceService.choose(Severity.Info, message, options, 2, true)
.then<void>(value => {
if (value === 0) {
return this.checkAndSetEnablement(extension, [], false, workspace);
return this.checkAndSetEnablement(extension, [], enablementState, enable);
}
if (value === 1) {
return this.checkAndSetEnablement(extension, dependencies, false, workspace);
return this.checkAndSetEnablement(extension, dependencies, enablementState, enable);
}
return TPromise.as(null);
});
}
private checkAndSetEnablement(extension: IExtension, dependencies: IExtension[], enable: boolean, workspace: boolean): TPromise<any> {
private checkAndSetEnablement(extension: IExtension, dependencies: IExtension[], enablementState: EnablementState, enable: boolean): TPromise<any> {
if (!enable) {
let dependents = this.getDependentsAfterDisablement(extension, dependencies, this.local, workspace);
let dependents = this.getDependentsAfterDisablement(extension, dependencies, this.local, enablementState);
if (dependents.length) {
return TPromise.wrapError<void>(new Error(this.getDependentsErrorMessage(extension, dependents)));
}
}
return TPromise.join([extension, ...dependencies].map(e => this.doSetEnablement(e, enable, workspace)));
return TPromise.join([extension, ...dependencies].map(e => this.doSetEnablement(e, enablementState)));
}
private getDependenciesRecursively(extension: IExtension, installed: IExtension[], enable: boolean, workspace: boolean, checked: IExtension[]): IExtension[] {
private getDependenciesRecursively(extension: IExtension, installed: IExtension[], enablementState: EnablementState, checked: IExtension[]): IExtension[] {
if (checked.indexOf(extension) !== -1) {
return [];
}
......@@ -666,19 +661,19 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
}
const dependenciesToDisable = installed.filter(i => {
// Do not include extensions which are already disabled and request is to disable
if (!enable && (workspace ? i.disabledForWorkspace : i.disabledGlobally)) {
if (i.enablementState === enablementState && (i.enablementState === EnablementState.WorkspaceDisabled || i.enablementState === EnablementState.Disabled)) {
return false;
}
return i.type === LocalExtensionType.User && extension.dependencies.indexOf(i.id) !== -1;
});
const depsOfDeps = [];
for (const dep of dependenciesToDisable) {
depsOfDeps.push(...this.getDependenciesRecursively(dep, installed, enable, workspace, checked));
depsOfDeps.push(...this.getDependenciesRecursively(dep, installed, enablementState, checked));
}
return [...dependenciesToDisable, ...depsOfDeps];
}
private getDependentsAfterDisablement(extension: IExtension, dependencies: IExtension[], installed: IExtension[], workspace: boolean): IExtension[] {
private getDependentsAfterDisablement(extension: IExtension, dependencies: IExtension[], installed: IExtension[], enablementState: EnablementState): IExtension[] {
return installed.filter(i => {
if (i.dependencies.length === 0) {
return false;
......@@ -686,8 +681,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
if (i === extension) {
return false;
}
const disabled = workspace ? i.disabledForWorkspace : i.disabledGlobally;
if (disabled) {
if (i.enablementState === EnablementState.WorkspaceDisabled || i.enablementState === EnablementState.Disabled) {
return false;
}
if (dependencies.indexOf(i) !== -1) {
......@@ -714,17 +708,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
extension.displayName, dependents[0].displayName, dependents[1].displayName);
}
private doSetEnablement(extension: IExtension, enable: boolean, workspace: boolean): TPromise<boolean> {
if (workspace) {
return this.extensionEnablementService.setEnablement(extension, enable, workspace);
}
const globalElablement = this.extensionEnablementService.setEnablement(extension, enable, false);
if (enable && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
const workspaceEnablement = this.extensionEnablementService.setEnablement(extension, enable, true);
return TPromise.join([globalElablement, workspaceEnablement]).then(values => values[0] || values[1]);
}
return globalElablement;
private doSetEnablement(extension: IExtension, enablementState: EnablementState): TPromise<boolean> {
return this.extensionEnablementService.setEnablement(extension, enablementState);
}
get allowedBadgeProviders(): string[] {
......@@ -822,11 +807,11 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
private onEnablementChanged(extensionIdentifier: IExtensionIdentifier) {
const [extension] = this.local.filter(e => areSameExtensions(e, extensionIdentifier));
if (extension) {
const globallyDisabledExtensions = this.extensionEnablementService.getGloballyDisabledExtensions();
const workspaceDisabledExtensions = this.extensionEnablementService.getWorkspaceDisabledExtensions();
extension.disabledGlobally = globallyDisabledExtensions.some(disabled => areSameExtensions(disabled, extension));
extension.disabledForWorkspace = workspaceDisabledExtensions.some(disabled => areSameExtensions(disabled, extension));
this._onChange.fire();
const enablementState = this.extensionEnablementService.getEnablementState({ id: extension.id, uuid: extension.uuid });
if (enablementState !== extension.enablementState) {
extension.enablementState = enablementState;
this._onChange.fire();
}
}
}
......
......@@ -14,7 +14,7 @@ import * as ExtensionsActions from 'vs/workbench/parts/extensions/browser/extens
import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService';
import {
IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, LocalExtensionType, IGalleryExtension,
DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier
DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, EnablementState
} from 'vs/platform/extensionManagement/common/extensionManagement';
import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { ExtensionManagementService, getLocalExtensionIdFromGallery, getLocalExtensionIdFromManifest } from 'vs/platform/extensionManagement/node/extensionManagementService';
......@@ -509,44 +509,44 @@ suite('ExtensionsActions Test', () => {
});
});
test('Test EnableForWorkspaceAction when there extension is disabled globally', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
test('Test EnableForWorkspaceAction when the extension is disabled globally', () => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
instantiationService.get(IExtensionsWorkbenchService).queryLocal().done(extensions => {
testObject.extension = extensions[0];
assert.ok(!testObject.enabled);
done();
});
return instantiationService.get(IExtensionsWorkbenchService).queryLocal()
.then(extensions => {
testObject.extension = extensions[0];
assert.ok(testObject.enabled);
});
});
test('Test EnableForWorkspaceAction when extension is disabled for workspace', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
test('Test EnableForWorkspaceAction when extension is disabled for workspace', () => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
instantiationService.get(IExtensionsWorkbenchService).queryLocal().done(extensions => {
testObject.extension = extensions[0];
assert.ok(testObject.enabled);
done();
});
return instantiationService.get(IExtensionsWorkbenchService).queryLocal()
.then(extensions => {
testObject.extension = extensions[0];
assert.ok(testObject.enabled);
});
});
test('Test EnableForWorkspaceAction when the extension is disabled in both', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
test('Test EnableForWorkspaceAction when the extension is disabled globally and workspace', () => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
instantiationService.get(IExtensionsWorkbenchService).queryLocal().done(extensions => {
testObject.extension = extensions[0];
assert.ok(!testObject.enabled);
done();
});
return instantiationService.get(IExtensionsWorkbenchService).queryLocal()
.then(extensions => {
testObject.extension = extensions[0];
assert.ok(testObject.enabled);
});
});
test('Test EnableGloballyAction when there is no extension', () => {
......@@ -568,20 +568,20 @@ suite('ExtensionsActions Test', () => {
});
test('Test EnableGloballyAction when the extension is disabled for workspace', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
instantiationService.get(IExtensionsWorkbenchService).queryLocal().done(extensions => {
testObject.extension = extensions[0];
assert.ok(!testObject.enabled);
assert.ok(testObject.enabled);
done();
});
});
test('Test EnableGloballyAction when the extension is disabled globally', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -594,8 +594,8 @@ suite('ExtensionsActions Test', () => {
});
test('Test EnableGloballyAction when the extension is disabled in both', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -626,7 +626,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test EnableAction when extension is installed and disabled globally', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.EnableAction = instantiationService.createInstance(ExtensionsActions.EnableAction);
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -639,7 +639,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test EnableAction when extension is installed and disabled for workspace', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.EnableAction = instantiationService.createInstance(ExtensionsActions.EnableAction);
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -698,7 +698,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test DisableForWorkspaceAction when the extension is disabled globally', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -711,7 +711,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test DisableForWorkspaceAction when the extension is disabled workspace', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -742,7 +742,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test DisableGloballyAction when the extension is disabled globally', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -755,7 +755,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test DisableGloballyAction when the extension is disabled for workspace', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, 'id');
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -798,7 +798,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test DisableAction when extension is installed and disabled globally', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.DisableAction = instantiationService.createInstance(ExtensionsActions.DisableAction);
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -811,7 +811,7 @@ suite('ExtensionsActions Test', () => {
});
test('Test DisableAction when extension is installed and disabled for workspace', (done) => {
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false, true);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.WorkspaceDisabled);
const testObject: ExtensionsActions.DisableAction = instantiationService.createInstance(ExtensionsActions.DisableAction);
const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
......@@ -1053,7 +1053,7 @@ suite('ExtensionsActions Test', () => {
test('Test ReloadAction when extension is updated when not running', (done) => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a', { version: '1.0.1' });
const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
......@@ -1078,7 +1078,7 @@ suite('ExtensionsActions Test', () => {
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
workbenchService.queryLocal().done(extensions => {
testObject.extension = extensions[0];
workbenchService.setEnablement(extensions[0], false);
workbenchService.setEnablement(extensions[0], EnablementState.Disabled);
assert.ok(testObject.enabled);
assert.equal('Reload to deactivate', testObject.tooltip);
......@@ -1095,8 +1095,8 @@ suite('ExtensionsActions Test', () => {
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
workbenchService.queryLocal().done(extensions => {
testObject.extension = extensions[0];
workbenchService.setEnablement(extensions[0], false);
workbenchService.setEnablement(extensions[0], true);
workbenchService.setEnablement(extensions[0], EnablementState.Disabled);
workbenchService.setEnablement(extensions[0], EnablementState.Enabled);
assert.ok(!testObject.enabled);
done();
......@@ -1105,14 +1105,14 @@ suite('ExtensionsActions Test', () => {
test('Test ReloadAction when extension is enabled when not running', (done) => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a');
const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
workbenchService.queryLocal().done(extensions => {
testObject.extension = extensions[0];
workbenchService.setEnablement(extensions[0], true);
workbenchService.setEnablement(extensions[0], EnablementState.Enabled);
assert.ok(testObject.enabled);
assert.equal('Reload to activate', testObject.tooltip);
......@@ -1123,15 +1123,15 @@ suite('ExtensionsActions Test', () => {
test('Test ReloadAction when extension enablement is toggled when not running', (done) => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a');
const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
workbenchService.queryLocal().done(extensions => {
testObject.extension = extensions[0];
workbenchService.setEnablement(extensions[0], true);
workbenchService.setEnablement(extensions[0], false);
workbenchService.setEnablement(extensions[0], EnablementState.Enabled);
workbenchService.setEnablement(extensions[0], EnablementState.Disabled);
assert.ok(!testObject.enabled);
done();
......@@ -1140,7 +1140,7 @@ suite('ExtensionsActions Test', () => {
test('Test ReloadAction when extension is updated when not running and enabled', (done) => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, false);
instantiationService.get(IExtensionEnablementService).setEnablement({ id: 'pub.a' }, EnablementState.Disabled);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a', { version: '1.0.1' });
const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
......@@ -1151,7 +1151,7 @@ suite('ExtensionsActions Test', () => {
const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.2' });
installEvent.fire({ identifier: gallery.identifier, gallery });
didInstallEvent.fire({ identifier: gallery.identifier, gallery, local: aLocalExtension('a', gallery, gallery) });
workbenchService.setEnablement(extensions[0], true);
workbenchService.setEnablement(extensions[0], EnablementState.Enabled);
assert.ok(testObject.enabled);
assert.equal('Reload to activate', testObject.tooltip);
......
......@@ -26,7 +26,7 @@ import { Schemas } from 'vs/base/common/network';
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
import { IMessageService, Severity, CloseAction } from 'vs/platform/message/common/message';
import { getInstalledExtensions, IExtensionStatus, onExtensionChanged, isKeymapExtension } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils';
import { IExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
import { used } from 'vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page';
import { ILifecycleService, StartupKind } from 'vs/platform/lifecycle/common/lifecycle';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
......@@ -424,7 +424,7 @@ class WelcomePage {
return this.extensionManagementService.installFromGallery(extension)
.then(() => {
// TODO: Do this as part of the install to avoid multiple events.
return this.extensionEnablementService.setEnablement({ id: extensionSuggestion.id }, false);
return this.extensionEnablementService.setEnablement({ id: extensionSuggestion.id }, EnablementState.Disabled);
}).then(() => {
return true;
});
......@@ -442,12 +442,12 @@ class WelcomePage {
});
TPromise.join(extensionSuggestion.isKeymap ? extensions.filter(extension => isKeymapExtension(this.tipsService, extension) && extension.globallyEnabled)
.map(extension => {
return this.extensionEnablementService.setEnablement(extension.identifier, false);
return this.extensionEnablementService.setEnablement(extension.identifier, EnablementState.Disabled);
}) : []).then(() => {
return foundAndInstalled.then(found => {
messageDelay.cancel();
if (found) {
return this.extensionEnablementService.setEnablement({ id: extensionSuggestion.id }, true)
return this.extensionEnablementService.setEnablement({ id: extensionSuggestion.id }, EnablementState.Enabled)
.then(() => {
/* __GDPR__FRAGMENT__
"WelcomePageInstalled-2" : {
......
......@@ -13,8 +13,8 @@ import * as path from 'path';
import URI from 'vs/base/common/uri';
import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry';
import { IMessage, IExtensionDescription, IExtensionsStatus, IExtensionService, ExtensionPointContribution, ActivationTimes } from 'vs/platform/extensions/common/extensions';
import { IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { areSameExtensions, getGloballyDisabledExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { IExtensionEnablementService, IExtensionIdentifier, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement';
import { areSameExtensions, BetterMergeId, BetterMergeDisabledNowKey } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { ExtensionsRegistry, ExtensionPoint, IExtensionPointUser, ExtensionMessageCollector, IExtensionPoint } from 'vs/platform/extensions/common/extensionsRegistry';
import { ExtensionScanner, ILog } from 'vs/workbench/services/extensions/electron-browser/extensionPoints';
import { IMessageService } from 'vs/platform/message/common/message';
......@@ -309,52 +309,67 @@ export class ExtensionService implements IExtensionService {
this._logOrShowMessage(severity, this._isDev ? messageWithSource2(source, message) : message);
});
ExtensionService._scanInstalledExtensions(this._environmentService, log).then((installedExtensions) => {
// Migrate enablement service to use identifiers
this._extensionEnablementService.migrateToIdentifiers(installedExtensions);
const disabledExtensions = [
...getGloballyDisabledExtensions(this._extensionEnablementService, this._storageService, installedExtensions),
...this._extensionEnablementService.getWorkspaceDisabledExtensions()
];
/* __GDPR__
"extensionsScanned" : {
"totalCount" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
"disabledCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
ExtensionService._scanInstalledExtensions(this._environmentService, log)
.then((installedExtensions) => {
// Migrate enablement service to use identifiers
this._extensionEnablementService.migrateToIdentifiers(installedExtensions);
return this._getDisabledExtensions()
.then(disabledExtensions => {
/* __GDPR__
"extensionsScanned" : {
"totalCount" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
"disabledCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
}
*/
this._telemetryService.publicLog('extensionsScanned', {
totalCount: installedExtensions.length,
disabledCount: disabledExtensions.length
});
if (disabledExtensions.length === 0) {
return installedExtensions;
}
return installedExtensions.filter(e => disabledExtensions.every(disabled => !areSameExtensions(disabled, e)));
});
}).then((extensionDescriptions) => {
this._registry = new ExtensionDescriptionRegistry(extensionDescriptions);
let availableExtensions = this._registry.getAllExtensionDescriptions();
let extensionPoints = ExtensionsRegistry.getExtensionPoints();
let messageHandler = (msg: IMessage) => this._handleExtensionPointMessage(msg);
for (let i = 0, len = extensionPoints.length; i < len; i++) {
const clock = time(`handleExtensionPoint:${extensionPoints[i].name}`);
try {
ExtensionService._handleExtensionPoint(extensionPoints[i], availableExtensions, messageHandler);
} finally {
clock.stop();
}
}
*/
this._telemetryService.publicLog('extensionsScanned', {
totalCount: installedExtensions.length,
disabledCount: disabledExtensions.length
});
if (disabledExtensions.length === 0) {
return installedExtensions;
}
return installedExtensions.filter(e => disabledExtensions.every(disabled => !areSameExtensions(disabled, e)));
}).then((extensionDescriptions) => {
this._registry = new ExtensionDescriptionRegistry(extensionDescriptions);
let availableExtensions = this._registry.getAllExtensionDescriptions();
let extensionPoints = ExtensionsRegistry.getExtensionPoints();
let messageHandler = (msg: IMessage) => this._handleExtensionPointMessage(msg);
mark('extensionHostReady');
this._installedExtensionsReady.open();
this._onDidRegisterExtensions.fire(availableExtensions);
});
}
for (let i = 0, len = extensionPoints.length; i < len; i++) {
const clock = time(`handleExtensionPoint:${extensionPoints[i].name}`);
try {
ExtensionService._handleExtensionPoint(extensionPoints[i], availableExtensions, messageHandler);
} finally {
clock.stop();
private _getDisabledExtensions(): TPromise<IExtensionIdentifier[]> {
return this._extensionEnablementService.getDisabledExtensions()
.then(disabledExtensions => {
const betterMergeExtensionIdentifier: IExtensionIdentifier = { id: BetterMergeId };
if (disabledExtensions.some(d => d.id === betterMergeExtensionIdentifier.id)) {
return disabledExtensions;
}
}
mark('extensionHostReady');
this._installedExtensionsReady.open();
this._onDidRegisterExtensions.fire(availableExtensions);
});
return this._extensionEnablementService.setEnablement(betterMergeExtensionIdentifier, EnablementState.Disabled)
.then(() => {
this._storageService.store(BetterMergeDisabledNowKey, true);
return [...disabledExtensions, betterMergeExtensionIdentifier];
});
});
}
private _handleExtensionPointMessage(msg: IMessage) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册