diff --git a/src/vs/code/electron-sandbox/issue/issueReporterMain.ts b/src/vs/code/electron-sandbox/issue/issueReporterMain.ts index f48450b2574c10f54b90d9840d7267d5ccfdc988..93317ff04f76b664989baec4ff82586d9244c6b8 100644 --- a/src/vs/code/electron-sandbox/issue/issueReporterMain.ts +++ b/src/vs/code/electron-sandbox/issue/issueReporterMain.ts @@ -150,6 +150,7 @@ export class IssueReporter extends Disposable { applyZoom(configuration.data.zoomLevel); this.applyStyles(configuration.data.styles); this.handleExtensionData(configuration.data.enabledExtensions); + this.updateExperimentsInfo(configuration.data.experiments); } render(): void { @@ -285,7 +286,7 @@ export class IssueReporter extends Disposable { this.render(); }); - (['includeSystemInfo', 'includeProcessInfo', 'includeWorkspaceInfo', 'includeExtensions', 'includeSearchedExtensions', 'includeSettingsSearchDetails'] as const).forEach(elementId => { + (['includeSystemInfo', 'includeProcessInfo', 'includeWorkspaceInfo', 'includeExtensions', 'includeSearchedExtensions', 'includeSettingsSearchDetails', 'includeExperiments'] as const).forEach(elementId => { this.addEventListener(elementId, 'click', (event: Event) => { event.stopPropagation(); this.issueReporterModel.update({ [elementId]: !this.issueReporterModel.getData()[elementId] }); @@ -695,6 +696,7 @@ export class IssueReporter extends Disposable { const extensionsBlock = document.querySelector('.block-extensions'); const searchedExtensionsBlock = document.querySelector('.block-searchedExtensions'); const settingsSearchResultsBlock = document.querySelector('.block-settingsSearchResults'); + const experimentsBlock = document.querySelector('.block-experiments'); const problemSource = this.getElementById('problem-source')!; const descriptionTitle = this.getElementById('issue-description-label')!; @@ -709,6 +711,7 @@ export class IssueReporter extends Disposable { hide(extensionsBlock); hide(searchedExtensionsBlock); hide(settingsSearchResultsBlock); + hide(experimentsBlock); hide(problemSource); hide(extensionSelector); @@ -716,6 +719,7 @@ export class IssueReporter extends Disposable { show(blockContainer); show(systemBlock); show(problemSource); + show(experimentsBlock); if (fileOnExtension) { show(extensionSelector); @@ -730,6 +734,7 @@ export class IssueReporter extends Disposable { show(processBlock); show(workspaceBlock); show(problemSource); + show(experimentsBlock); if (fileOnExtension) { show(extensionSelector); @@ -1084,6 +1089,14 @@ export class IssueReporter extends Disposable { } } + private updateExperimentsInfo(experimentInfo: string | undefined) { + this.issueReporterModel.update({ experimentInfo }); + const target = document.querySelector('.block-experiments .block-info'); + if (target) { + target.textContent = experimentInfo ? experimentInfo : localize('noCurrentExperiments', "No current experiments."); + } + } + private getExtensionTableHtml(extensions: IssueReporterExtensionData[]): HTMLTableElement { return $('table', undefined, $('tr', undefined, diff --git a/src/vs/code/electron-sandbox/issue/issueReporterModel.ts b/src/vs/code/electron-sandbox/issue/issueReporterModel.ts index f209a51259b83c17c6327f3938fbba64108cd8c6..602326f37735782f314654a48ed63268b0680fef 100644 --- a/src/vs/code/electron-sandbox/issue/issueReporterModel.ts +++ b/src/vs/code/electron-sandbox/issue/issueReporterModel.ts @@ -21,6 +21,7 @@ export interface IssueReporterData { includeExtensions: boolean; includeSearchedExtensions: boolean; includeSettingsSearchDetails: boolean; + includeExperiments: boolean; numberOfThemeExtesions?: number; allExtensions: IssueReporterExtensionData[]; @@ -31,6 +32,7 @@ export interface IssueReporterData { actualSearchResults?: ISettingSearchResult[]; query?: string; filterResultCount?: number; + experimentInfo?: string; } export class IssueReporterModel { @@ -45,6 +47,7 @@ export class IssueReporterModel { includeExtensions: true, includeSearchedExtensions: true, includeSettingsSearchDetails: true, + includeExperiments: true, allExtensions: [] }; @@ -133,6 +136,12 @@ ${this.getInfos()} } } + if (this._data.issueType === IssueType.Bug || this._data.issueType === IssueType.PerformanceIssue) { + if (this._data.includeExperiments && this._data.experimentInfo) { + info += this.generateExperimentsInfoMd(); + } + } + return info; } @@ -203,6 +212,18 @@ ${this._data.processInfo} ${this._data.workspaceInfo}; \`\`\` + +`; + } + + private generateExperimentsInfoMd(): string { + return `
+A/B Experiments + +\`\`\` +${this._data.experimentInfo} +\`\`\` +
`; } diff --git a/src/vs/code/electron-sandbox/issue/issueReporterPage.ts b/src/vs/code/electron-sandbox/issue/issueReporterPage.ts index d7be46aebfa29eb8f963f53cdef31ea0753b367e..67825478a66b019a129ccd3f4bf7b303768be296 100644 --- a/src/vs/code/electron-sandbox/issue/issueReporterPage.ts +++ b/src/vs/code/electron-sandbox/issue/issueReporterPage.ts @@ -131,5 +131,15 @@ export default (): string => ` +
+ + + +
`; diff --git a/src/vs/code/electron-sandbox/issue/test/testReporterModel.test.ts b/src/vs/code/electron-sandbox/issue/test/testReporterModel.test.ts index 2c391332fa85338d86f73614632ad2d3bfeda860..d5bad9c683b00d2bb53671396b52c0e413d252e5 100644 --- a/src/vs/code/electron-sandbox/issue/test/testReporterModel.test.ts +++ b/src/vs/code/electron-sandbox/issue/test/testReporterModel.test.ts @@ -20,6 +20,7 @@ suite('IssueReporter', () => { includeExtensions: true, includeSearchedExtensions: true, includeSettingsSearchDetails: true, + includeExperiments: true, issueType: 0 }); }); @@ -78,6 +79,58 @@ OS version: undefined |Screen Reader|no| |VM|0%| Extensions: none +`); + }); + + test('serializes experiment info when data is provided', () => { + const issueReporterModel = new IssueReporterModel({ + issueType: 0, + systemInfo: { + os: 'Darwin', + cpus: 'Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 x 2800)', + memory: '16.00GB', + vmHint: '0%', + processArgs: '', + screenReader: 'no', + remoteData: [], + gpuStatus: { + '2d_canvas': 'enabled', + 'checker_imaging': 'disabled_off' + } + }, + experimentInfo: 'vsliv695:30137379\nvsins829:30139715' + }); + assert.equal(issueReporterModel.serialize(), + ` +Issue Type: Bug + +undefined + +VS Code version: undefined +OS version: undefined + +
+System Info + +|Item|Value| +|---|---| +|CPUs|Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 x 2800)| +|GPU Status|2d_canvas: enabled
checker_imaging: disabled_off| +|Load (avg)|undefined| +|Memory (System)|16.00GB| +|Process Argv|| +|Screen Reader|no| +|VM|0%| +
Extensions: none
+A/B Experiments + +\`\`\` +vsliv695:30137379 +vsins829:30139715 +\`\`\` + +
+ `); }); diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 9cbaae7359fd2329a9b421542453ae8e60cb54ad..e981a34d5f5b6d870960e48c6446c2f7dd10fe59 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -55,6 +55,7 @@ export interface IssueReporterData extends WindowData { enabledExtensions: IssueReporterExtensionData[]; issueType?: IssueType; extensionId?: string; + experiments?: string; readonly issueTitle?: string; readonly issueBody?: string; } diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts index 592e4b990607cc17f8103b32053cf1683e7a9f51..f7beaf0f50448f4bbf911f006896cc1b51872228 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts @@ -16,6 +16,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { process } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IProductService } from 'vs/platform/product/common/productService'; +import { ITASExperimentService } from 'vs/workbench/services/experiment/common/experimentService'; export class WorkbenchIssueService implements IWorkbenchIssueService { declare readonly _serviceBrand: undefined; @@ -26,7 +27,8 @@ export class WorkbenchIssueService implements IWorkbenchIssueService { @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService, @INativeWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, - @IProductService private readonly productService: IProductService + @IProductService private readonly productService: IProductService, + @ITASExperimentService private readonly experimentService: ITASExperimentService ) { } async openReporter(dataOverrides: Partial = {}): Promise { @@ -49,11 +51,13 @@ export class WorkbenchIssueService implements IWorkbenchIssueService { isBuiltin, }; }); + const experiments = await this.experimentService.getCurrentExperiments(); const theme = this.themeService.getColorTheme(); const issueReporterData: IssueReporterData = Object.assign({ styles: getIssueReporterStyles(theme), zoomLevel: getZoomLevel(), enabledExtensions: extensionData, + experiments: experiments?.join('\n') }, dataOverrides); return this.issueService.openReporter(issueReporterData); }