From 52ee04478700c07ec600edea6fbeab5cf15a58b4 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Thu, 23 May 2019 10:46:05 -0700 Subject: [PATCH] Show prompt in issue reporter when writing to clipboard, fixes #50659 --- .../issue/issueReporterMain.ts | 28 +++++++++++++++---- .../issue/electron-main/issueService.ts | 17 +++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 694ca374ba6..a01437487bd 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -440,11 +440,11 @@ export class IssueReporter extends Disposable { } }); - document.onkeydown = (e: KeyboardEvent) => { + document.onkeydown = async (e: KeyboardEvent) => { const cmdOrCtrlKey = platform.isMacintosh ? e.metaKey : e.ctrlKey; // Cmd/Ctrl+Enter previews issue and closes window if (cmdOrCtrlKey && e.keyCode === 13) { - if (this.createIssue()) { + if (await this.createIssue()) { ipcRenderer.send('vscode:closeIssueReporter'); } } @@ -843,7 +843,7 @@ export class IssueReporter extends Disposable { return isValid; } - private createIssue(): boolean { + private async createIssue(): Promise { if (!this.validateInputs()) { // If inputs are invalid, set focus to the first one and add listeners on them // to detect further changes @@ -887,14 +887,32 @@ export class IssueReporter extends Disposable { let url = baseUrl + `&body=${encodeURIComponent(issueBody)}`; if (url.length > MAX_URL_LENGTH) { - clipboard.writeText(issueBody); - url = baseUrl + `&body=${encodeURIComponent(localize('pasteData', "We have written the needed data into your clipboard because it was too large to send. Please paste."))}`; + try { + url = await this.writeToClipboard(baseUrl, issueBody); + } catch (_) { + return false; + } } ipcRenderer.send('vscode:openExternal', url); return true; } + private async writeToClipboard(baseUrl: string, issueBody: string): Promise { + return new Promise((resolve, reject) => { + ipcRenderer.once('vscode:issueReporterClipboardResponse', (_: unknown, shouldWrite: boolean) => { + if (shouldWrite) { + clipboard.writeText(issueBody); + resolve(baseUrl + `&body=${encodeURIComponent(localize('pasteData', "We have written the needed data into your clipboard because it was too large to send. Please paste."))}`); + } else { + reject(); + } + }); + + ipcRenderer.send('vscode:issueReporterClipboard'); + }); + } + private getExtensionGitHubUrl(): string { let repositoryUrl = ''; const bugsUrl = this.getExtensionBugsUrl(); diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/issueService.ts index 64f81abd11d..b794f8ffc8a 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/issueService.ts @@ -75,6 +75,23 @@ export class IssueService implements IIssueService { event.sender.send('vscode:listProcessesResponse', processes); }); + ipcMain.on('vscode:issueReporterClipboard', (event: Event) => { + const messageOptions = { + message: localize('issueReporterWriteToClipboard', "There is too much data to send to GitHub. Would you like to write the information to the clipboard so that it can be pasted?"), + type: 'warning', + buttons: [ + localize('yes', "Yes"), + localize('cancel', "Cancel") + ] + }; + + if (this._issueWindow) { + dialog.showMessageBox(this._issueWindow, messageOptions, response => { + event.sender.send('vscode:issueReporterClipboardResponse', response === 0); + }); + } + }); + ipcMain.on('vscode:issuePerformanceInfoRequest', (event: Event) => { this.getPerformanceInfo().then(msg => { event.sender.send('vscode:issuePerformanceInfoResponse', msg);