diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 5207de4f4d8..859bde9d0b6 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -137,7 +137,8 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { private registerCustomViewContainers(containers: IUserFriendlyViewsContainerDescriptor[], extension: IExtensionDescription) { containers.forEach((descriptor, index) => { const cssClass = `extensionViewlet-${descriptor.id}`; - const icon = join(extension.extensionFolderPath, descriptor.icon); + // TODO@extensionLocation + const icon = join(extension.extensionLocation.fsPath, descriptor.icon); this.registerCustomViewlet({ id: descriptor.id, title: descriptor.title, icon }, TEST_VIEW_CONTAINER_ORDER + index + 1, cssClass); }); } diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 4139bbcab43..0c54d7ce1fb 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as map from 'vs/base/common/map'; -import URI from 'vs/base/common/uri'; +import URI, { UriComponents } from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { localize } from 'vs/nls'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -71,9 +71,9 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv title: string, showOptions: { viewColumn: Position, preserveFocus: boolean }, options: WebviewInputOptions, - extensionFolderPath: string + extensionLocation: UriComponents ): void { - const webview = this._webviewService.createWebview(MainThreadWebviews.viewType, title, showOptions, options, extensionFolderPath, this.createWebviewEventDelegate(handle)); + const webview = this._webviewService.createWebview(MainThreadWebviews.viewType, title, showOptions, options, URI.revive(extensionLocation), this.createWebviewEventDelegate(handle)); webview.state = { viewType: viewType, state: undefined diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 0c25f777797..6824090cecb 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -415,7 +415,7 @@ export function createApiFactory( return extHostOutputService.createOutputChannel(name); }, createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { - return extHostWebviews.createWebview(viewType, title, showOptions, options, extension.extensionFolderPath); + return extHostWebviews.createWebview(viewType, title, showOptions, options, extension.extensionLocation); }, createTerminal(nameOrOptions: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { if (typeof nameOrOptions === 'object') { @@ -725,7 +725,7 @@ class Extension implements vscode.Extension { constructor(extensionService: ExtHostExtensionService, description: IExtensionDescription) { this._extensionService = extensionService; this.id = description.id; - this.extensionPath = paths.normalize(description.extensionFolderPath, true); + this.extensionPath = paths.normalize(description.extensionLocation.fsPath, true); this.packageJSON = description; } @@ -788,6 +788,7 @@ const nullExtensionDescription: IExtensionDescription = { engines: undefined, extensionDependencies: undefined, extensionFolderPath: undefined, + extensionLocation: undefined, isBuiltin: false, main: undefined, version: undefined diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index ed29c4320ed..b2404b7eb2c 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -355,7 +355,7 @@ export interface MainThreadTelemetryShape extends IDisposable { export type WebviewPanelHandle = string; export interface MainThreadWebviewsShape extends IDisposable { - $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, viewOptions: { viewColumn: EditorPosition, preserveFocus: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionFolderPath: string): void; + $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, viewOptions: { viewColumn: EditorPosition, preserveFocus: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionLocation: UriComponents): void; $disposeWebview(handle: WebviewPanelHandle): void; $reveal(handle: WebviewPanelHandle, viewColumn: EditorPosition | null, preserveFocus: boolean): void; $setTitle(handle: WebviewPanelHandle, value: string): void; diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 8d3d62d08fb..a274837583e 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -243,8 +243,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { if (!ext.main) { return undefined; } - return realpath(ext.extensionFolderPath).then(value => tree.set(value, ext)); - + return realpath(ext.extensionLocation.fsPath).then(value => tree.set(value, ext)); }); this._extensionPathIndex = TPromise.join(extensions).then(() => tree); } @@ -359,9 +358,9 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { globalState, workspaceState, subscriptions: [], - get extensionPath() { return extensionDescription.extensionFolderPath; }, + get extensionPath() { return extensionDescription.extensionLocation.fsPath; }, storagePath: this._storagePath.value(extensionDescription), - asAbsolutePath: (relativePath: string) => { return join(extensionDescription.extensionFolderPath, relativePath); }, + asAbsolutePath: (relativePath: string) => { return join(extensionDescription.extensionLocation.fsPath, relativePath); }, get logger() { checkProposedApiEnabled(extensionDescription); return that._extHostLogService.getExtLogger(extensionDescription.id); diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 8cb632d7a9f..e757a0f2b14 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -10,6 +10,7 @@ import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; import { Position } from 'vs/platform/editor/common/editor'; import { TPromise } from 'vs/base/common/winjs.base'; import { Disposable } from './extHostTypes'; +import URI from 'vs/base/common/uri'; export class ExtHostWebview implements vscode.Webview { private readonly _handle: WebviewPanelHandle; @@ -204,7 +205,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: (vscode.WebviewPanelOptions & vscode.WebviewOptions) | undefined, - extensionFolderPath: string + extensionLocation: URI ): vscode.WebviewPanel { options = options || {}; @@ -215,7 +216,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { }; const handle = ExtHostWebviews.webviewHandlePool++ + ''; - this._proxy.$createWebviewPanel(handle, viewType, title, webviewShowOptions, options, extensionFolderPath); + this._proxy.$createWebviewPanel(handle, viewType, title, webviewShowOptions, options, extensionLocation); const webview = new ExtHostWebview(handle, this._proxy, options); const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, title, viewColumn, options, webview); diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 8e82578a9b2..aa840a1f173 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -365,7 +365,8 @@ export class DebugAdapter extends StreamDebugAdapter { if (debuggers && debuggers.length > 0) { debuggers.filter(dbg => strings.equalsIgnoreCase(dbg.type, debugType)).forEach(dbg => { // extract relevant attributes and make then absolute where needed - const extractedDbg = DebugAdapter.extract(dbg, ed.extensionFolderPath); + // TODO@extensionLocation + const extractedDbg = DebugAdapter.extract(dbg, ed.extensionLocation.fsPath); // merge objects.mixin(result, extractedDbg, ed.isBuiltin); diff --git a/src/vs/workbench/parts/debug/test/node/debugger.test.ts b/src/vs/workbench/parts/debug/test/node/debugger.test.ts index 760727457dd..de1fb231987 100644 --- a/src/vs/workbench/parts/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugger.test.ts @@ -9,7 +9,7 @@ import * as platform from 'vs/base/common/platform'; import { IAdapterExecutable, IConfigurationManager } from 'vs/workbench/parts/debug/common/debug'; import { Debugger } from 'vs/workbench/parts/debug/node/debugger'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import uri from 'vs/base/common/uri'; +import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { DebugAdapter } from 'vs/workbench/parts/debug/node/debugAdapter'; @@ -17,7 +17,7 @@ import { DebugAdapter } from 'vs/workbench/parts/debug/node/debugAdapter'; suite('Debug - Debugger', () => { let _debugger: Debugger; - const extensionFolderPath = 'a/b/c/'; + const extensionFolderPath = '/a/b/c/'; const debuggerContribution = { type: 'mock', label: 'Mock Debug', @@ -53,6 +53,7 @@ suite('Debug - Debugger', () => { version: '1.0.0', publisher: 'vscode', extensionFolderPath: extensionFolderPath, + extensionLocation: URI.file(extensionFolderPath), isBuiltin: false, engines: null, contributes: { @@ -68,6 +69,7 @@ suite('Debug - Debugger', () => { version: '1.0.0', publisher: 'vscode', extensionFolderPath: '/e1/b/c/', + extensionLocation: URI.file('/e1/b/c/'), isBuiltin: false, engines: null, contributes: { @@ -89,6 +91,7 @@ suite('Debug - Debugger', () => { version: '1.0.0', publisher: 'vscode', extensionFolderPath: '/e2/b/c/', + extensionLocation: URI.file('/e2/b/c/'), isBuiltin: false, engines: null, contributes: { @@ -114,7 +117,7 @@ suite('Debug - Debugger', () => { const configurationManager = { - debugAdapterExecutable(folderUri: uri | undefined, type: string): TPromise { + debugAdapterExecutable(folderUri: URI | undefined, type: string): TPromise { return TPromise.as(undefined); } }; diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts index 0b3558d81ee..7222ae708a2 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts @@ -61,12 +61,13 @@ namespace schema { return false; } else { - const normalizedAbsolutePath = join(extension.description.extensionFolderPath, snippet.path); - if (normalizedAbsolutePath.indexOf(extension.description.extensionFolderPath) !== 0) { + // TODO@extensionLocation + const normalizedAbsolutePath = join(extension.description.extensionLocation.fsPath, snippet.path); + if (normalizedAbsolutePath.indexOf(extension.description.extensionLocation.fsPath) !== 0) { extension.collector.error(localize( 'invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", - extension.description.name, normalizedAbsolutePath, extension.description.extensionFolderPath + extension.description.name, normalizedAbsolutePath, extension.description.extensionLocation.fsPath )); return false; } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts index 885c2291d0a..8a2bce37230 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts @@ -171,8 +171,8 @@ export class WebviewEditor extends BaseWebviewEditor { private getDefaultLocalResourceRoots(): URI[] { const rootPaths = this._contextService.getWorkspace().folders.map(x => x.uri); - if ((this.input as WebviewEditorInput).extensionFolderPath) { - rootPaths.push((this.input as WebviewEditorInput).extensionFolderPath); + if ((this.input as WebviewEditorInput).extensionLocation) { + rootPaths.push((this.input as WebviewEditorInput).extensionLocation); } return rootPaths; } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts index 7854dae18c2..29ea5220e4d 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts @@ -34,7 +34,7 @@ export class WebviewEditorInput extends EditorInput { private _revived: boolean = false; - public readonly extensionFolderPath: URI | undefined; + public readonly extensionLocation: URI | undefined; constructor( public readonly viewType: string, @@ -42,7 +42,7 @@ export class WebviewEditorInput extends EditorInput { options: WebviewInputOptions, state: any, events: WebviewEvents, - extensionFolderPath: string | undefined, + extensionLocation: URI | undefined, public readonly reviver: WebviewReviver | undefined, @IPartService private readonly _partService: IPartService, ) { @@ -51,10 +51,7 @@ export class WebviewEditorInput extends EditorInput { this._options = options; this._events = events; this._state = state; - - if (extensionFolderPath) { - this.extensionFolderPath = URI.file(extensionFolderPath); - } + this.extensionLocation = extensionLocation; } public getTypeId(): string { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts index 476db7789b1..094c71d62a2 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts @@ -7,12 +7,17 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IEditorInputFactory } from 'vs/workbench/common/editor'; import { WebviewEditorInput } from './webviewEditorInput'; import { IWebviewEditorService, WebviewInputOptions } from './webviewEditorService'; +import URI from 'vs/base/common/uri'; interface SerializedWebview { readonly viewType: string; readonly title: string; readonly options: WebviewInputOptions; - readonly extensionFolderPath: string; + /** + * compatibility with previous versions + */ + readonly extensionFolderPath?: string; + readonly extensionLocation: string; readonly state: any; } @@ -41,7 +46,7 @@ export class WebviewEditorInputFactory implements IEditorInputFactory { viewType: input.viewType, title: input.getName(), options: input.options, - extensionFolderPath: input.extensionFolderPath.fsPath, + extensionLocation: input.extensionLocation.toString(), state: input.state }; return JSON.stringify(data); @@ -52,6 +57,14 @@ export class WebviewEditorInputFactory implements IEditorInputFactory { serializedEditorInput: string ): WebviewEditorInput { const data: SerializedWebview = JSON.parse(serializedEditorInput); - return this._webviewService.reviveWebview(data.viewType, data.title, data.state, data.options, data.extensionFolderPath); + let extensionLocation: URI; + if (typeof data.extensionLocation === 'string') { + extensionLocation = URI.parse(data.extensionLocation); + } + if (typeof data.extensionFolderPath === 'string') { + // compatibility with previous versions + extensionLocation = URI.file(data.extensionFolderPath); + } + return this._webviewService.reviveWebview(data.viewType, data.title, data.state, data.options, extensionLocation); } } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts index 06ac8bd0760..58b1dbe19ec 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts @@ -23,7 +23,7 @@ export interface IWebviewEditorService { title: string, showOptions: { viewColumn: Position, preserveFocus: boolean }, options: WebviewInputOptions, - extensionFolderPath: string, + extensionLocation: URI, events: WebviewEvents ): WebviewEditorInput; @@ -32,7 +32,7 @@ export interface IWebviewEditorService { title: string, state: any, options: WebviewInputOptions, - extensionFolderPath: string + extensionLocation: URI ): WebviewEditorInput; revealWebview( @@ -89,10 +89,10 @@ export class WebviewEditorService implements IWebviewEditorService { title: string, showOptions: { viewColumn: Position, preserveFocus: boolean }, options: vscode.WebviewOptions, - extensionFolderPath: string, + extensionLocation: URI, events: WebviewEvents ): WebviewEditorInput { - const webviewInput = this._instantiationService.createInstance(WebviewEditorInput, viewType, title, options, {}, events, extensionFolderPath, undefined); + const webviewInput = this._instantiationService.createInstance(WebviewEditorInput, viewType, title, options, {}, events, extensionLocation, undefined); this._editorService.openEditor(webviewInput, { pinned: true, preserveFocus: showOptions.preserveFocus }, showOptions.viewColumn); return webviewInput; } @@ -114,9 +114,9 @@ export class WebviewEditorService implements IWebviewEditorService { title: string, state: any, options: WebviewInputOptions, - extensionFolderPath: string + extensionLocation: URI ): WebviewEditorInput { - const webviewInput = this._instantiationService.createInstance(WebviewEditorInput, viewType, title, options, state, {}, extensionFolderPath, { + const webviewInput = this._instantiationService.createInstance(WebviewEditorInput, viewType, title, options, state, {}, extensionLocation, { canRevive: (webview) => { return true; }, diff --git a/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.ts b/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.ts index eefb2acae71..ee1edcccdb9 100644 --- a/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.ts @@ -288,12 +288,13 @@ ExtensionsRegistry.registerExtensionPointextensions[i].value; const collector = extensions[i].collector; - const extensionPath = extensions[i].description.extensionFolderPath; + const extensionLocation = extensions[i].description.extensionLocation; if (!extensionValue || !Array.isArray(extensionValue)) { collector.error(nls.localize('invalid.jsonValidation', "'configuration.jsonValidation' must be a array")); @@ -60,7 +60,8 @@ export class JSONValidationExtensionPoint { } if (strings.startsWith(uri, './')) { try { - uri = URI.file(paths.normalize(paths.join(extensionPath, uri))).toString(); + //TODO@extensionLocation + uri = URI.file(paths.normalize(paths.join(extensionLocation.fsPath, uri))).toString(); } catch (e) { collector.error(nls.localize('invalid.url.fileschema', "'configuration.jsonValidation.url' is an invalid relative URL: {0}", e.message)); } diff --git a/src/vs/workbench/services/mode/common/workbenchModeService.ts b/src/vs/workbench/services/mode/common/workbenchModeService.ts index e164b951ec1..9b2fa23f592 100644 --- a/src/vs/workbench/services/mode/common/workbenchModeService.ts +++ b/src/vs/workbench/services/mode/common/workbenchModeService.ts @@ -106,7 +106,8 @@ export class WorkbenchModeServiceImpl extends ModeServiceImpl { for (let j = 0, lenJ = extension.value.length; j < lenJ; j++) { let ext = extension.value[j]; if (isValidLanguageExtensionPoint(ext, extension.collector)) { - let configuration = (ext.configuration ? paths.join(extension.description.extensionFolderPath, ext.configuration) : ext.configuration); + // TODO@extensionLocation + let configuration = (ext.configuration ? paths.join(extension.description.extensionLocation.fsPath, ext.configuration) : ext.configuration); allValidLanguages.push({ id: ext.id, extensions: ext.extensions, diff --git a/src/vs/workbench/services/textMate/electron-browser/TMSyntax.ts b/src/vs/workbench/services/textMate/electron-browser/TMSyntax.ts index 1fabe22e28d..59013467db6 100644 --- a/src/vs/workbench/services/textMate/electron-browser/TMSyntax.ts +++ b/src/vs/workbench/services/textMate/electron-browser/TMSyntax.ts @@ -22,6 +22,7 @@ import { TokenizationResult, TokenizationResult2 } from 'vs/editor/common/core/t import { nullTokenize2 } from 'vs/editor/common/modes/nullMode'; import { generateTokensCSSForColorMap } from 'vs/editor/common/modes/supports/tokenization'; import { Color } from 'vs/base/common/color'; +import URI from 'vs/base/common/uri'; export class TMScopeRegistry { @@ -166,7 +167,7 @@ export class TextMateService implements ITextMateService { for (let i = 0; i < extensions.length; i++) { let grammars = extensions[i].value; for (let j = 0; j < grammars.length; j++) { - this._handleGrammarExtensionPointUser(extensions[i].description.extensionFolderPath, grammars[j], extensions[i].collector); + this._handleGrammarExtensionPointUser(extensions[i].description.extensionLocation, grammars[j], extensions[i].collector); } } }); @@ -262,7 +263,7 @@ export class TextMateService implements ITextMateService { } - private _handleGrammarExtensionPointUser(extensionFolderPath: string, syntax: ITMSyntaxExtensionPoint, collector: ExtensionMessageCollector): void { + private _handleGrammarExtensionPointUser(extensionLocation: URI, syntax: ITMSyntaxExtensionPoint, collector: ExtensionMessageCollector): void { if (syntax.language && ((typeof syntax.language !== 'string') || !this._modeService.isRegisteredMode(syntax.language))) { collector.error(nls.localize('invalid.language', "Unknown language in `contributes.{0}.language`. Provided value: {1}", grammarsExtPoint.name, String(syntax.language))); return; @@ -289,10 +290,11 @@ export class TextMateService implements ITextMateService { return; } - let normalizedAbsolutePath = normalize(join(extensionFolderPath, syntax.path)); + //TODO@extensionLocation + let normalizedAbsolutePath = normalize(join(extensionLocation.fsPath, syntax.path)); - if (normalizedAbsolutePath.indexOf(extensionFolderPath) !== 0) { - collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", grammarsExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); + if (normalizedAbsolutePath.indexOf(extensionLocation.fsPath) !== 0) { + collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", grammarsExtPoint.name, normalizedAbsolutePath, extensionLocation.fsPath)); } this._scopeRegistry.register(syntax.scopeName, normalizedAbsolutePath, syntax.embeddedLanguages, syntax.tokenTypes); diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts index 200f7673d9c..8e31e971fcd 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts @@ -14,6 +14,7 @@ import { ColorThemeData } from 'vs/workbench/services/themes/electron-browser/co import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { TPromise } from 'vs/base/common/winjs.base'; import { Event, Emitter } from 'vs/base/common/event'; +import URI from 'vs/base/common/uri'; let themesExtPoint = ExtensionsRegistry.registerExtensionPoint('themes', [], { @@ -67,13 +68,13 @@ export class ColorThemeStore { extensionName: ext.description.name, extensionIsBuiltin: ext.description.isBuiltin }; - this.onThemes(ext.description.extensionFolderPath, extensionData, ext.value, ext.collector); + this.onThemes(ext.description.extensionLocation, extensionData, ext.value, ext.collector); } this.onDidChangeEmitter.fire(this.extensionsColorThemes); }); } - private onThemes(extensionFolderPath: string, extensionData: ExtensionData, themes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { + private onThemes(extensionLocation: URI, extensionData: ExtensionData, themes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { if (!Array.isArray(themes)) { collector.error(nls.localize( 'reqarray', @@ -92,10 +93,11 @@ export class ColorThemeStore { )); return; } - let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionFolderPath, theme.path)); + // TODO@extensionLocation + let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionLocation.fsPath, theme.path)); - if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionFolderPath)) !== 0) { - collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", themesExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); + if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionLocation.fsPath)) !== 0) { + collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", themesExtPoint.name, normalizedAbsolutePath, extensionLocation.fsPath)); } let themeData = ColorThemeData.fromExtensionTheme(theme, normalizedAbsolutePath, extensionData); if (themeData.id === this.extensionsColorThemes[0].id) { diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts index 319a0e2ed41..7ab3a5bbe62 100644 --- a/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts @@ -14,6 +14,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { TPromise } from 'vs/base/common/winjs.base'; import { Event, Emitter } from 'vs/base/common/event'; import { FileIconThemeData } from 'vs/workbench/services/themes/electron-browser/fileIconThemeData'; +import URI from 'vs/base/common/uri'; let iconThemeExtPoint = ExtensionsRegistry.registerExtensionPoint('iconThemes', [], { description: nls.localize('vscode.extension.contributes.iconThemes', 'Contributes file icon themes.'), @@ -60,13 +61,13 @@ export class FileIconThemeStore { extensionName: ext.description.name, extensionIsBuiltin: ext.description.isBuiltin }; - this.onIconThemes(ext.description.extensionFolderPath, extensionData, ext.value, ext.collector); + this.onIconThemes(ext.description.extensionLocation, extensionData, ext.value, ext.collector); } this.onDidChangeEmitter.fire(this.knownIconThemes); }); } - private onIconThemes(extensionFolderPath: string, extensionData: ExtensionData, iconThemes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { + private onIconThemes(extensionLocation: URI, extensionData: ExtensionData, iconThemes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { if (!Array.isArray(iconThemes)) { collector.error(nls.localize( 'reqarray', @@ -94,10 +95,11 @@ export class FileIconThemeStore { )); return; } - let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionFolderPath, iconTheme.path)); + // TODO@extensionLocation + let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionLocation.fsPath, iconTheme.path)); - if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionFolderPath)) !== 0) { - collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", iconThemeExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); + if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionLocation.fsPath)) !== 0) { + collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", iconThemeExtPoint.name, normalizedAbsolutePath, extensionLocation.fsPath)); } let themeData = FileIconThemeData.fromExtensionTheme(iconTheme, normalizedAbsolutePath, extensionData); diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts index 60a21cb75eb..e90a9d70a88 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts @@ -34,6 +34,7 @@ suite('ExtHostDocumentSaveParticipant', () => { enableProposedApi: false, engines: undefined, extensionFolderPath: undefined, + extensionLocation: undefined, isBuiltin: false, version: undefined }; diff --git a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts index f7e20513723..b8c31cbab3b 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts @@ -25,6 +25,7 @@ suite('ExtHostWorkspace', function () { enableProposedApi: false, engines: undefined, extensionFolderPath: undefined, + extensionLocation: undefined, isBuiltin: false, version: undefined };