Merge from vscode 1ec43773e37997841c5af42b33ddb180e9735bf2

This commit is contained in:
ADS Merger
2020-03-29 01:29:32 +00:00
parent 586ec50916
commit a64304602e
316 changed files with 6524 additions and 11687 deletions

View File

@@ -24,7 +24,6 @@ import {
import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput';
import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor';
import { StatusUpdater, MaliciousExtensionChecker, ExtensionsViewletViewsContribution, ExtensionsViewPaneContainer } from 'vs/workbench/contrib/extensions/browser/extensionsViewlet';
import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen';
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry';
import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate';
@@ -32,7 +31,6 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { KeymapExtensions } from 'vs/workbench/contrib/extensions/common/extensionsUtils';
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { GalleryExtensionsHandler, ExtensionsHandler } from 'vs/workbench/contrib/extensions/browser/extensionsQuickOpen';
import { EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor';
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
import { URI, UriComponents } from 'vs/base/common/uri';
@@ -60,18 +58,6 @@ registerSingleton(IExtensionTipsService, ExtensionTipsService);
Registry.as<IOutputChannelRegistry>(OutputExtensions.OutputChannels)
.registerChannel({ id: ExtensionsChannelId, label: ExtensionsLabel, log: false });
// Quickopen
Registry.as<IQuickOpenRegistry>(QuickOpenExtensions.Quickopen).registerQuickOpenHandler(
QuickOpenHandlerDescriptor.create(
ExtensionsHandler,
ExtensionsHandler.ID,
'ext ',
undefined,
localize('extensionsCommands', "Manage Extensions"),
true
)
);
// Quick Access
Registry.as<IQuickAccessRegistry>(Extensions.Quickaccess).registerQuickAccessProvider({
ctor: ManageExtensionsQuickAccessProvider,
@@ -494,17 +480,6 @@ class ExtensionsContributions implements IWorkbenchContribution {
const canManageExtensions = extensionManagementServerService.localExtensionManagementServer || extensionManagementServerService.remoteExtensionManagementServer;
if (canManageExtensions) {
Registry.as<IQuickOpenRegistry>(QuickOpenExtensions.Quickopen).registerQuickOpenHandler(
QuickOpenHandlerDescriptor.create(
GalleryExtensionsHandler,
GalleryExtensionsHandler.ID,
'ext install ',
undefined,
localize('galleryExtensionsCommands', "Install Gallery Extensions"),
true
)
);
Registry.as<IQuickAccessRegistry>(Extensions.Quickaccess).registerQuickAccessProvider({
ctor: InstallExtensionQuickAccessProvider,
prefix: InstallExtensionQuickAccessProvider.PREFIX,

View File

@@ -682,6 +682,7 @@ export class DropDownMenuActionViewItem extends ExtensionActionViewItem {
export function getContextMenuActions(menuService: IMenuService, contextKeyService: IContextKeyService, instantiationService: IInstantiationService, extension: IExtension | undefined | null): ExtensionAction[][] {
const scopedContextKeyService = contextKeyService.createScoped();
if (extension) {
scopedContextKeyService.createKey<string>('extension', extension.identifier.id);
scopedContextKeyService.createKey<boolean>('isBuiltinExtension', extension.type === ExtensionType.System);
scopedContextKeyService.createKey<boolean>('extensionHasConfiguration', extension.local && !!extension.local.manifest.contributes && !!extension.local.manifest.contributes.configuration);
if (extension.state === ExtensionState.Installed) {

View File

@@ -3,6 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { localize } from 'vs/nls';
import { append, $, addClass, removeClass, toggleClass } from 'vs/base/browser/dom';
import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle';
import { IAction } from 'vs/base/common/actions';
@@ -19,7 +20,9 @@ import { Label, RatingsWidget, /*InstallCountWidget,*/ RecommendationWidget, Rem
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { isLanguagePackExtension } from 'vs/platform/extensions/common/extensions';
import { isLanguagePackExtension, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
import { CodiconLabel } from 'vs/base/browser/ui/codiconLabel/codiconLabel';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
export interface IExtensionsViewState {
onFocus: Event<IExtension>;
@@ -35,6 +38,7 @@ export interface ITemplateData {
//installCount: HTMLElement;
//ratings: HTMLElement;
author: HTMLElement;
syncIgnored: HTMLElement;
description: HTMLElement;
extension: IExtension | null;
disposables: IDisposable[];
@@ -57,7 +61,8 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
@INotificationService private readonly notificationService: INotificationService,
@IExtensionService private readonly extensionService: IExtensionService,
@IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService,
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,
@IConfigurationService private readonly configurationService: IConfigurationService,
) { }
get templateId() { return 'extension'; }
@@ -79,6 +84,9 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
const description = append(details, $('.description.ellipsis'));
const footer = append(details, $('.footer'));
const author = append(footer, $('.author.ellipsis'));
const syncIgnored = append(footer, $('.sync-ignored.ellipsis'));
const syncIgnoredLabel = new CodiconLabel(syncIgnored);
syncIgnoredLabel.text = '$(eye-closed) ' + localize('extensionSyncIgnoredLabel', 'Sync: Ignored');
const actionbar = new ActionBar(footer, {
animated: false,
actionViewItemProvider: (action: IAction) => {
@@ -121,8 +129,7 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
const disposables = combinedDisposable(...actions, ...widgets, actionbar, extensionContainers, extensionTooltipAction);
return {
// {{SQL CARBON EDIT}}
root, element, icon, name, /*installCount, ratings,*/ author, description, disposables: [disposables], actionbar,
root, element, icon, name, /*installCount,*/ syncIgnored, /*ratings,*/ author, description, disposables: [disposables], actionbar,
extensionDisposables: [],
set extension(extension: IExtension) {
extensionContainers.extension = extension;
@@ -202,9 +209,25 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
data.actionbar.viewItems.forEach(item => (<ExtensionActionViewItem>item).setFocus(false));
}
}, this, data.extensionDisposables);
this.updateExtensionIgnored(extension, data);
this.configurationService.onDidChangeConfiguration(e => {
if (e.affectedKeys.includes('sync.ignoredExtensions')) {
this.updateExtensionIgnored(extension, data);
}
}, data.extensionDisposables);
}
disposeTemplate(data: ITemplateData): void {
data.disposables = dispose(data.disposables);
}
private updateExtensionIgnored(extension: IExtension, data: ITemplateData): void {
data.syncIgnored.style.display = this.extensionIsIgnored(extension.identifier) ? 'block' : 'none';
}
private extensionIsIgnored(identifier: IExtensionIdentifier): boolean {
return this.configurationService.getValue<string[]>('sync.ignoredExtensions').some(id => areSameExtensions({ id }, identifier));
}
}

View File

@@ -1,139 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { IAutoFocus, Mode, IModel } from 'vs/base/parts/quickopen/common/quickOpen';
import { QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel';
import { QuickOpenHandler } from 'vs/workbench/browser/quickopen';
import { IExtensionsViewPaneContainer, VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions';
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
import { IExtensionGalleryService, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { CancellationToken } from 'vs/base/common/cancellation';
class SimpleEntry extends QuickOpenEntry {
constructor(private label: string, private action: Function) {
super();
}
getLabel(): string {
return this.label;
}
getAriaLabel(): string {
return this.label;
}
run(mode: Mode): boolean {
if (mode === Mode.PREVIEW) {
return false;
}
this.action();
return true;
}
}
export class ExtensionsHandler extends QuickOpenHandler {
public static readonly ID = 'workbench.picker.extensions';
constructor(@IViewletService private readonly viewletService: IViewletService) {
super();
}
getResults(text: string, token: CancellationToken): Promise<IModel<any>> {
const label = nls.localize('manage', "Press Enter to manage your extensions.");
const action = () => {
this.viewletService.openViewlet(VIEWLET_ID, true)
.then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer)
.then(viewlet => {
viewlet.search('');
viewlet.focus();
});
};
return Promise.resolve(new QuickOpenModel([new SimpleEntry(label, action)]));
}
getEmptyLabel(input: string): string {
return '';
}
getAutoFocus(searchValue: string): IAutoFocus {
return { autoFocusFirstEntry: true };
}
}
export class GalleryExtensionsHandler extends QuickOpenHandler {
public static readonly ID = 'workbench.picker.gallery';
constructor(
@IViewletService private readonly viewletService: IViewletService,
@IExtensionGalleryService private readonly galleryService: IExtensionGalleryService,
@IExtensionManagementService private readonly extensionsService: IExtensionManagementService,
@INotificationService private readonly notificationService: INotificationService
) {
super();
}
getResults(text: string, token: CancellationToken): Promise<IModel<any>> {
if (/\./.test(text)) {
return this.galleryService.query({ names: [text], pageSize: 1 }, token)
.then(galleryResult => {
const entries: SimpleEntry[] = [];
const galleryExtension = galleryResult.firstPage[0];
if (!galleryExtension) {
const label = nls.localize('notfound', "Extension '{0}' not found in the Marketplace.", text);
entries.push(new SimpleEntry(label, () => null));
} else {
const label = nls.localize('install', "Press Enter to install '{0}' from the Marketplace.", text);
const action = () => {
return this.viewletService.openViewlet(VIEWLET_ID, true)
.then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer)
.then(viewlet => viewlet.search(`@id:${text}`))
.then(() => this.extensionsService.installFromGallery(galleryExtension))
.then(undefined, err => this.notificationService.error(err));
};
entries.push(new SimpleEntry(label, action));
}
return new QuickOpenModel(entries);
});
}
const entries: SimpleEntry[] = [];
if (text) {
const label = nls.localize('searchFor', "Press Enter to search for '{0}' in the Marketplace.", text);
const action = () => {
this.viewletService.openViewlet(VIEWLET_ID, true)
.then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer)
.then(viewlet => {
viewlet.search(text);
viewlet.focus();
});
};
entries.push(new SimpleEntry(label, action));
}
return Promise.resolve(new QuickOpenModel(entries));
}
getEmptyLabel(input: string): string {
return nls.localize('noExtensionsToInstall', "Type an extension name");
}
getAutoFocus(searchValue: string): IAutoFocus {
return { autoFocusFirstEntry: true };
}
}

View File

@@ -10,7 +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 } from 'vs/base/common/actions';
import { IAction, Action } from 'vs/base/common/actions';
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
import { IViewlet } from 'vs/workbench/common/viewlet';
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
@@ -28,7 +28,6 @@ import { IExtensionManagementService } from 'vs/platform/extensionManagement/com
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, BuiltInExtensionsView, BuiltInThemesExtensionsView, BuiltInBasicsExtensionsView, ServerExtensionsView, DefaultRecommendedExtensionsView } from 'vs/workbench/contrib/extensions/browser/extensionsViews';
import { OpenGlobalSettingsAction } from 'vs/workbench/contrib/preferences/browser/preferencesActions';
import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import Severity from 'vs/base/common/severity';
@@ -58,6 +57,7 @@ import { RemoteNameContext } from 'vs/workbench/browser/contextkeys';
import { ILabelService } from 'vs/platform/label/common/label';
import { MementoObject } from 'vs/workbench/common/memento';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
const NonEmptyWorkspaceContext = new RawContextKey<boolean>('nonEmptyWorkspace', false);
const DefaultViewsContext = new RawContextKey<boolean>('defaultExtensionViews', true);
@@ -360,7 +360,8 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
@IContextKeyService contextKeyService: IContextKeyService,
@IContextMenuService contextMenuService: IContextMenuService,
@IExtensionService extensionService: IExtensionService,
@IViewDescriptorService viewDescriptorService: IViewDescriptorService
@IViewDescriptorService viewDescriptorService: IViewDescriptorService,
@IPreferencesService private readonly preferencesService: IPreferencesService
) {
super(VIEWLET_ID, `${VIEWLET_ID}.state`, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService, viewDescriptorService);
@@ -611,7 +612,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
if (/ECONNREFUSED/.test(message)) {
const error = createErrorWithActions(localize('suggestProxyError', "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting."), {
actions: [
this.instantiationService.createInstance(OpenGlobalSettingsAction, OpenGlobalSettingsAction.ID, OpenGlobalSettingsAction.LABEL)
new Action('open user settings', localize('open user settings', "Open User Settings"), undefined, true, () => this.preferencesService.openGlobalSettings())
]
});

View File

@@ -23,7 +23,6 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { attachBadgeStyler } from 'vs/platform/theme/common/styler';
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
import { OpenGlobalSettingsAction } from 'vs/workbench/contrib/preferences/browser/preferencesActions';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
@@ -40,7 +39,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 } from 'vs/base/common/actions';
import { IAction, Action } from 'vs/base/common/actions';
import { ExtensionType, ExtensionIdentifier, IExtensionDescription, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions';
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async';
@@ -51,6 +50,7 @@ import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
import { IMenuService } from 'vs/platform/actions/common/actions';
import { IViewDescriptorService } from 'vs/workbench/common/views';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
// Extensions that are automatically classified as Programming Language extensions, but should be Feature extensions
const FORCE_FEATURE_EXTENSIONS = ['vscode.git', 'vscode.search-result'];
@@ -113,6 +113,7 @@ export class ExtensionsListView extends ViewPane {
@IViewDescriptorService viewDescriptorService: IViewDescriptorService,
@IMenuService private readonly menuService: IMenuService,
@IOpenerService openerService: IOpenerService,
@IPreferencesService private readonly preferencesService: IPreferencesService,
) {
super({ ...(options as IViewPaneOptions), showActionsAlways: true }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
this.server = options.server;
@@ -851,7 +852,7 @@ export class ExtensionsListView extends ViewPane {
if (/ECONNREFUSED/.test(message)) {
const error = createErrorWithActions(localize('suggestProxyError', "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting."), {
actions: [
this.instantiationService.createInstance(OpenGlobalSettingsAction, OpenGlobalSettingsAction.ID, OpenGlobalSettingsAction.LABEL)
new Action('open user settings', localize('open user settings', "Open User Settings"), undefined, true, () => this.preferencesService.openGlobalSettings())
]
});
@@ -972,9 +973,10 @@ export class ServerExtensionsView extends ExtensionsListView {
@IMenuService menuService: IMenuService,
@IOpenerService openerService: IOpenerService,
@IThemeService themeService: IThemeService,
@IPreferencesService preferencesService: IPreferencesService,
) {
options.server = server;
super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, editorService, tipsService, telemetryService, configurationService, contextService, experimentService, workbenchThemeService, extensionManagementServerService, productService, contextKeyService, viewDescriptorService, menuService, openerService);
super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, editorService, tipsService, telemetryService, configurationService, contextService, experimentService, workbenchThemeService, extensionManagementServerService, productService, contextKeyService, viewDescriptorService, menuService, openerService, preferencesService);
this._register(onDidChangeTitle(title => this.updateTitle(title)));
}

View File

@@ -254,6 +254,15 @@
font-weight: 600;
}
.extensions-viewlet > .extensions .extension > .details > .footer > .sync-ignored {
font-size: 11px;
}
.extensions-viewlet > .extensions .extension > .details > .footer > .sync-ignored > .codicon {
font-size: 14px;
vertical-align: text-top;
}
.extensions-viewlet > .extensions .selected .extension > .details > .footer > .author,
.extensions-viewlet > .extensions .selected.focused .extension > .details > .footer > .author {
opacity: 1;