diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 7f57fbdbeb4..f4f8b58faee 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -54,6 +54,8 @@ export class IssueReporter extends Disposable { private telemetryService: ITelemetryService; private issueReporterModel: IssueReporterModel; private shouldQueueSearch = true; + private receivedSystemInfo = false; + private receivedPerformanceInfo = false; constructor(configuration: IssueReporterConfiguration) { super(); @@ -74,17 +76,26 @@ export class IssueReporter extends Disposable { reprosWithoutExtensions: false }); - ipcRenderer.on('issueInfoResponse', (event, info) => { + ipcRenderer.on('issuePerformanceInfoResponse', (event, info) => { this.issueReporterModel.update(info); + this.receivedPerformanceInfo = true; - this.updateAllBlocks(this.issueReporterModel.getData()); - - const submitButton = document.getElementById('github-submit-btn'); - submitButton.disabled = false; - submitButton.textContent = localize('previewOnGitHub', "Preview on GitHub"); + const state = this.issueReporterModel.getData(); + this.updateProcessInfo(state); + this.updateWorkspaceInfo(state); + this.updatePreviewButtonState(); }); - ipcRenderer.send('issueInfoRequest'); + ipcRenderer.on('issueSystemInfoResponse', (event, info) => { + this.issueReporterModel.update({ systemInfo: info }); + this.receivedSystemInfo = true; + + this.updateSystemInfo(this.issueReporterModel.getData()); + this.updatePreviewButtonState(); + }); + + ipcRenderer.send('issueSystemInfoRequest'); + ipcRenderer.send('issuePerformanceInfoRequest'); if (window.document.documentElement.lang !== 'en') { show(document.getElementById('english')); @@ -211,6 +222,7 @@ export class IssueReporter extends Disposable { private setEventHandlers(): void { document.getElementById('issue-type').addEventListener('change', (event: Event) => { this.issueReporterModel.update({ issueType: parseInt((event.target).value) }); + this.updatePreviewButtonState(); this.render(); }); @@ -269,6 +281,34 @@ export class IssueReporter extends Disposable { } } + private updatePreviewButtonState() { + const submitButton = document.getElementById('github-submit-btn'); + if (this.isPreviewEnabled()) { + submitButton.disabled = false; + submitButton.textContent = localize('previewOnGitHub', "Preview on GitHub"); + } else { + submitButton.disabled = true; + submitButton.textContent = localize('loadingData', "Loading data..."); + } + } + + private isPreviewEnabled() { + const issueType = this.issueReporterModel.getData().issueType; + if (issueType === IssueType.Bug && this.receivedSystemInfo) { + return true; + } + + if (issueType === IssueType.PerformanceIssue && this.receivedSystemInfo && this.receivedPerformanceInfo) { + return true; + } + + if (issueType === IssueType.FeatureRequest) { + return true; + } + + return false; + } + @debounce(300) private searchGitHub(event: Event): void { const title = (event.target).value; @@ -449,16 +489,6 @@ export class IssueReporter extends Disposable { return true; } - /** - * Update blocks - */ - - private updateAllBlocks(state) { - this.updateSystemInfo(state); - this.updateProcessInfo(state); - this.updateWorkspaceInfo(state); - } - private updateSystemInfo = (state) => { const target = document.querySelector('.block-system .block-info'); let tableHtml = ''; diff --git a/src/vs/code/electron-main/diagnostics.ts b/src/vs/code/electron-main/diagnostics.ts index 926ce809c15..20101529482 100644 --- a/src/vs/code/electron-main/diagnostics.ts +++ b/src/vs/code/electron-main/diagnostics.ts @@ -38,13 +38,12 @@ export interface ProcessInfo { name: string; } -export interface DiagnosticInfo { - systemInfo?: SystemInfo; +export interface PerformanceInfo { processInfo?: ProcessInfo[]; workspaceInfo?: string; } -export function buildDiagnostics(info: IMainProcessInfo): Promise { +export function getPerformanceInfo(info: IMainProcessInfo): Promise { return listProcesses(info.mainPID).then(rootProcess => { const workspaceInfoMessages = []; @@ -79,13 +78,36 @@ export function buildDiagnostics(info: IMainProcessInfo): Promise 0) { + systemInfo.CPUs = `${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`; + } + + if (!isWindows) { + systemInfo['Load (avg)'] = `${os.loadavg().map(l => Math.round(l)).join(', ')}`; + } + + + return systemInfo; +} + export function printDiagnostics(info: IMainProcessInfo): Promise { return listProcesses(info.mainPID).then(rootProcess => { @@ -186,30 +208,6 @@ function formatLaunchConfigs(configs: WorkspaceStatItem[]): string { return output.join('\n'); } -function getSystemInfo(info: IMainProcessInfo): SystemInfo { - const MB = 1024 * 1024; - const GB = 1024 * MB; - - const systemInfo: SystemInfo = { - 'Memory (System)': `${(os.totalmem() / GB).toFixed(2)}GB (${(os.freemem() / GB).toFixed(2)}GB free)`, - VM: `${Math.round((virtualMachineHint.value() * 100))}%`, - 'Screen Reader': `${app.isAccessibilitySupportEnabled() ? 'yes' : 'no'}`, - 'Process Argv': `${info.mainArguments.join(' ')}` - }; - - const cpus = os.cpus(); - if (cpus && cpus.length > 0) { - systemInfo.CPUs = `${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`; - } - - if (!isWindows) { - systemInfo['Load (avg)'] = `${os.loadavg().map(l => Math.round(l)).join(', ')}`; - } - - - return systemInfo; -} - function getProcessList(info: IMainProcessInfo, rootProcess: ProcessItem): ProcessInfo[] { const mapPidToWindowTitle = new Map(); info.windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/issueService.ts index 5ff8806d5a3..63dcd59fad7 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/issueService.ts @@ -12,7 +12,7 @@ import { parseArgs } from 'vs/platform/environment/node/argv'; import { IIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; import { BrowserWindow, ipcMain, screen } from 'electron'; import { ILaunchService } from 'vs/code/electron-main/launch'; -import { buildDiagnostics, DiagnosticInfo } from 'vs/code/electron-main/diagnostics'; +import { getPerformanceInfo, PerformanceInfo, getSystemInfo, SystemInfo } from 'vs/code/electron-main/diagnostics'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { isMacintosh } from 'vs/base/common/platform'; @@ -30,9 +30,15 @@ export class IssueService implements IIssueService { ) { } openReporter(data: IssueReporterData): TPromise { - ipcMain.on('issueInfoRequest', event => { - this.getStatusInfo().then(msg => { - event.sender.send('issueInfoResponse', msg); + ipcMain.on('issueSystemInfoRequest', event => { + this.getSystemInformation().then(msg => { + event.sender.send('issueSystemInfoResponse', msg); + }); + }); + + ipcMain.on('issuePerformanceInfoRequest', event => { + this.getPerformanceInfo().then(msg => { + event.sender.send('issuePerformanceInfoResponse', msg); }); }); @@ -100,10 +106,18 @@ export class IssueService implements IIssueService { return state; } - private getStatusInfo(): TPromise { + private getSystemInformation(): TPromise { return new Promise((resolve, reject) => { this.launchService.getMainProcessInfo().then(info => { - buildDiagnostics(info) + resolve(getSystemInfo(info)); + }); + }); + } + + private getPerformanceInfo(): TPromise { + return new Promise((resolve, reject) => { + this.launchService.getMainProcessInfo().then(info => { + getPerformanceInfo(info) .then(diagnosticInfo => { resolve(diagnosticInfo); })