diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 1e63205795e..1d46130f930 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -31,9 +31,8 @@ import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProper import { WindowsChannelClient } from 'vs/platform/windows/node/windowsIpc'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IssueReporterModel } from 'vs/code/electron-browser/issue/issueReporterModel'; -import { IssueReporterData, IssueReporterStyles, IssueType, ISettingsSearchIssueReporterData, IssueReporterFeatures } from 'vs/platform/issue/common/issue'; +import { IssueReporterData, IssueReporterStyles, IssueType, ISettingsSearchIssueReporterData, IssueReporterFeatures, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; import BaseHtml from 'vs/code/electron-browser/issue/issueReporterPage'; -import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import { LogLevelSetterChannelClient, FollowerLogService } from 'vs/platform/log/node/logIpc'; import { ILogService, getLogLevel } from 'vs/platform/log/common/log'; @@ -211,11 +210,9 @@ export class IssueReporter extends Disposable { document.body.style.color = styles.color; } - private handleExtensionData(extensions: ILocalExtension[]) { + private handleExtensionData(extensions: IssueReporterExtensionData[]) { const { nonThemes, themes } = collections.groupBy(extensions, ext => { - const manifestKeys = ext.manifest.contributes ? Object.keys(ext.manifest.contributes) : []; - const onlyTheme = !ext.manifest.activationEvents && manifestKeys.length === 1 && manifestKeys[0] === 'themes'; - return onlyTheme ? 'themes' : 'nonThemes'; + return ext.isTheme ? 'themes' : 'nonThemes'; }); const numberOfThemeExtesions = themes && themes.length; @@ -457,12 +454,12 @@ export class IssueReporter extends Disposable { private getExtensionRepositoryUrl(): string { const selectedExtension = this.issueReporterModel.getData().selectedExtension; - return selectedExtension && selectedExtension.manifest && selectedExtension.manifest.repository && selectedExtension.manifest.repository.url; + return selectedExtension && selectedExtension.repositoryUrl; } private getExtensionBugsUrl(): string { const selectedExtension = this.issueReporterModel.getData().selectedExtension; - return selectedExtension && selectedExtension.manifest && selectedExtension.manifest.bugs && selectedExtension.manifest.bugs.url; + return selectedExtension && selectedExtension.bugsUrl; } private searchVSCodeIssues(title: string, issueDescription: string): void { @@ -830,7 +827,7 @@ export class IssueReporter extends Disposable { target.innerHTML = `${tableHtml}
`; } - private updateExtensionSelector(extensions: ILocalExtension[]): void { + private updateExtensionSelector(extensions: IssueReporterExtensionData[]): void { interface IOption { name: string; id: string; @@ -838,8 +835,8 @@ export class IssueReporter extends Disposable { const extensionOptions: IOption[] = extensions.map(extension => { return { - name: extension.manifest.displayName || extension.manifest.name || '', - id: extension.identifier.id + name: extension.displayName || extension.name || '', + id: extension.id }; }); @@ -865,7 +862,7 @@ export class IssueReporter extends Disposable { this.addEventListener('extension-selector', 'change', (e: Event) => { const selectedExtensionId = (e.target).value; const extensions = this.issueReporterModel.getData().allExtensions; - const matches = extensions.filter(extension => extension.identifier.id === selectedExtensionId); + const matches = extensions.filter(extension => extension.id === selectedExtensionId); if (matches.length) { this.issueReporterModel.update({ selectedExtension: matches[0] }); @@ -887,7 +884,7 @@ export class IssueReporter extends Disposable { document.querySelector('.block-workspace .block-info code').textContent = '\n' + state.workspaceInfo; } - private updateExtensionTable(extensions: ILocalExtension[], numThemeExtensions: number): void { + private updateExtensionTable(extensions: IssueReporterExtensionData[], numThemeExtensions: number): void { const target = document.querySelector('.block-extensions .block-info'); if (this.environmentService.disableExtensions) { @@ -907,7 +904,7 @@ export class IssueReporter extends Disposable { target.innerHTML = `${table}
${themeExclusionStr}`; } - private updateSearchedExtensionTable(extensions: ILocalExtension[]): void { + private updateSearchedExtensionTable(extensions: IssueReporterExtensionData[]): void { const target = document.querySelector('.block-searchedExtensions .block-info'); if (!extensions.length) { @@ -919,7 +916,7 @@ export class IssueReporter extends Disposable { target.innerHTML = `${table}
`; } - private getExtensionTableHtml(extensions: ILocalExtension[]): string { + private getExtensionTableHtml(extensions: IssueReporterExtensionData[]): string { let table = ` Extension @@ -930,9 +927,9 @@ export class IssueReporter extends Disposable { table += extensions.map(extension => { return ` - ${extension.manifest.name} - ${extension.manifest.publisher.substr(0, 3)} - ${extension.manifest.version} + ${extension.name} + ${extension.publisher.substr(0, 3)} + ${extension.version} `; }).join(''); diff --git a/src/vs/code/electron-browser/issue/issueReporterModel.ts b/src/vs/code/electron-browser/issue/issueReporterModel.ts index afd544ed005..2ef6e5f8e0c 100644 --- a/src/vs/code/electron-browser/issue/issueReporterModel.ts +++ b/src/vs/code/electron-browser/issue/issueReporterModel.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { assign } from 'vs/base/common/objects'; -import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IssueType, ISettingSearchResult } from 'vs/platform/issue/common/issue'; +import { IssueType, ISettingSearchResult, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; export interface IssueReporterData { issueType?: IssueType; @@ -24,11 +23,11 @@ export interface IssueReporterData { includeSettingsSearchDetails?: boolean; numberOfThemeExtesions?: number; - allExtensions?: ILocalExtension[]; - enabledNonThemeExtesions?: ILocalExtension[]; + allExtensions?: IssueReporterExtensionData[]; + enabledNonThemeExtesions?: IssueReporterExtensionData[]; extensionsDisabled?: boolean; fileOnExtension?: boolean; - selectedExtension?: ILocalExtension; + selectedExtension?: IssueReporterExtensionData; actualSearchResults?: ISettingSearchResult[]; query?: string; filterResultCount?: number; @@ -81,7 +80,7 @@ ${this.getInfos()} private getExtensionVersion(): string { if (this.fileOnExtension() && this._data.selectedExtension) { - return `\nExtension version: ${this._data.selectedExtension.manifest.version}`; + return `\nExtension version: ${this._data.selectedExtension.version}`; } else { return ''; } @@ -198,7 +197,7 @@ ${this._data.workspaceInfo}; let tableHeader = `Extension|Author (truncated)|Version ---|---|---`; const table = this._data.enabledNonThemeExtesions.map(e => { - return `${e.manifest.name}|${e.manifest.publisher.substr(0, 3)}|${e.manifest.version}`; + return `${e.name}|${e.publisher.substr(0, 3)}|${e.version}`; }).join('\n'); return `
Extensions (${this._data.enabledNonThemeExtesions.length}) diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 62734a94f86..2e50281b21f 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -5,7 +5,6 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; export const IIssueService = createDecorator('issueService'); @@ -43,9 +42,20 @@ export interface IssueReporterStyles extends WindowStyles { sliderActiveColor: string; } +export interface IssueReporterExtensionData { + name: string; + publisher: string; + version: string; + id: string; + isTheme: boolean; + displayName: string | undefined; + repositoryUrl: string | undefined; + bugsUrl: string | undefined; +} + export interface IssueReporterData extends WindowData { styles: IssueReporterStyles; - enabledExtensions: ILocalExtension[]; + enabledExtensions: IssueReporterExtensionData[]; issueType?: IssueType; } diff --git a/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts b/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts index a4105f15307..1c4f6eb96d3 100644 --- a/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts +++ b/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IssueReporterStyles, IIssueService, IssueReporterData, ProcessExplorerData } from 'vs/platform/issue/common/issue'; +import { IssueReporterStyles, IIssueService, IssueReporterData, ProcessExplorerData, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; import { TPromise } from 'vs/base/common/winjs.base'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, editorBackground, editorForeground, listHoverBackground, listHoverForeground, listHighlightForeground, textLinkActiveForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -29,12 +29,28 @@ export class WorkbenchIssueService implements IWorkbenchIssueService { openReporter(dataOverrides: Partial = {}): TPromise { return this.extensionManagementService.getInstalled(LocalExtensionType.User).then(extensions => { const enabledExtensions = extensions.filter(extension => this.extensionEnablementService.isEnabled(extension)); + const extensionData: IssueReporterExtensionData[] = enabledExtensions.map(extension => { + const { manifest } = extension; + const manifestKeys = manifest.contributes ? Object.keys(manifest.contributes) : []; + const isTheme = !manifest.activationEvents && manifestKeys.length === 1 && manifestKeys[0] === 'themes'; + + return { + name: manifest.name, + publisher: manifest.publisher, + version: manifest.version, + repositoryUrl: manifest.repository && manifest.repository.url, + bugsUrl: manifest.bugs && manifest.bugs.url, + displayName: manifest.displayName, + id: extension.identifier.id, + isTheme: isTheme + }; + }); const theme = this.themeService.getTheme(); const issueReporterData: IssueReporterData = assign( { styles: getIssueReporterStyles(theme), zoomLevel: webFrame.getZoomLevel(), - enabledExtensions + enabledExtensions: extensionData }, dataOverrides);