提交 13f2dad4 编写于 作者: P Pine Wu

Validate user provided viewletId

上级 1cdbe70c
......@@ -16,11 +16,14 @@ import { ITreeExplorerViewletService, TreeExplorerViewletService } from 'vs/work
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet';
import { ITreeExplorer } from 'vs/platform/extensionManagement/common/extensionManagement';
import { toCustomViewletId, toCustomViewletCSSClass } from 'vs/workbench/parts/explorers/common/treeExplorer';
import { toCustomViewletId, toCustomViewletCSSClass, isValidViewletId } from 'vs/workbench/parts/explorers/common/treeExplorer';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
import { IMessageService, Severity } from 'vs/platform/message/common/message';
registerSingleton(ITreeExplorerViewletService, TreeExplorerViewletService);
const explorerContribtion: IJSONSchema = {
const explorerSchema: IJSONSchema = {
description: localize('vscode.extension.contributes.explorer', "Contributes custom tree explorer viewlet to the sidebar"),
type: 'object',
properties: {
......@@ -29,7 +32,7 @@ const explorerContribtion: IJSONSchema = {
type: 'string'
},
treeLabel: {
description: localize('vscode.extension.contributes.explorer.treeLabel', 'Human readable string used to render the custom tree viewlet'),
description: localize('vscode.extension.contributes.explorer.treeLabel', 'Human readable string used to render the custom tree explorer'),
type: 'string'
},
icon: {
......@@ -39,10 +42,27 @@ const explorerContribtion: IJSONSchema = {
}
};
ExtensionsRegistry.registerExtensionPoint<ITreeExplorer>('explorer', [], explorerContribtion).setHandler(extensions => {
export class ExplorerContribtion implements IWorkbenchContribution {
constructor(
@IMessageService private messageService: IMessageService
) {
this.init();
}
public getId(): string {
return 'vs.explorer';
}
private init() {
ExtensionsRegistry.registerExtensionPoint<ITreeExplorer>('explorer', [], explorerSchema).setHandler(extensions => {
for (let extension of extensions) {
const { treeExplorerNodeProviderId, treeLabel, icon } = extension.value;
if (!isValidViewletId(treeExplorerNodeProviderId)) {
return this.messageService.show(Severity.Error, localize('customExplorer.invalidId', 'Tree Explorer extension {0} has invalid id and failed to activate.', treeLabel));
}
const getIconRule = (iconPath) => { return `background-image: url('${iconPath}')`; };
if (icon) {
const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${toCustomViewletCSSClass(treeExplorerNodeProviderId)}`;
......@@ -60,4 +80,8 @@ ExtensionsRegistry.registerExtensionPoint<ITreeExplorer>('explorer', [], explore
true
));
}
});
\ No newline at end of file
});
}
}
(<IWorkbenchContributionsRegistry>Registry.as(WorkbenchExtensions.Workbench)).registerWorkbenchContribution(ExplorerContribtion);
\ No newline at end of file
......@@ -15,3 +15,8 @@ export function toCustomViewletActionId(viewletId: string): string {
export function toCustomViewletCSSClass(viewletId: string): string {
return 'customExplorer-' + viewletId;
}
export function isValidViewletId(viewletId: string): boolean {
// Only allow alphanumeric letters, `_` and `-`.
return /^[a-z0-9_-]+$/i.test(viewletId);
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册