提交 9c3522ec 编写于 作者: R Rachel Macfarlane

Include experiment info in issue reporter data

上级 274bf78d
......@@ -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<HTMLElement>('.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,
......
......@@ -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};
\`\`\`
</details>
`;
}
private generateExperimentsInfoMd(): string {
return `<details>
<summary>A/B Experiments</summary>
\`\`\`
${this._data.experimentInfo}
\`\`\`
</details>
`;
}
......
......@@ -131,5 +131,15 @@ export default (): string => `
<!-- To be dynamically filled -->
</div>
</div>
<div class="block block-experiments">
<input class="sendData" type="checkbox" id="includeExperiments" checked/>
<label class="caption" for="includeExperiments">${escape(localize({
key: 'sendExperiments',
comment: ['{0} is either "show" or "hide" and is a button to toggle the visibility of the current experiment information']
}, "Include A/B experiment info ({0})")).replace('{0}', `<a href="#" class="showInfo">${escape(localize('show', "show"))}</a>`)}</label>
<pre class="block-info hidden">
<!-- To be dynamically filled -->
</pre>
</div>
</div>
</div>`;
......@@ -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%|
</details>Extensions: none
<!-- generated by issue reporter -->`);
});
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: <b>Bug</b>
undefined
VS Code version: undefined
OS version: undefined
<details>
<summary>System Info</summary>
|Item|Value|
|---|---|
|CPUs|Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 x 2800)|
|GPU Status|2d_canvas: enabled<br>checker_imaging: disabled_off|
|Load (avg)|undefined|
|Memory (System)|16.00GB|
|Process Argv||
|Screen Reader|no|
|VM|0%|
</details>Extensions: none<details>
<summary>A/B Experiments</summary>
\`\`\`
vsliv695:30137379
vsins829:30139715
\`\`\`
</details>
<!-- generated by issue reporter -->`);
});
......
......@@ -55,6 +55,7 @@ export interface IssueReporterData extends WindowData {
enabledExtensions: IssueReporterExtensionData[];
issueType?: IssueType;
extensionId?: string;
experiments?: string;
readonly issueTitle?: string;
readonly issueBody?: string;
}
......
......@@ -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<IssueReporterData> = {}): Promise<void> {
......@@ -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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册