diff --git a/spec/main-process/atom-application.test.js b/spec/main-process/atom-application.test.js index 16aef8e27..c49e36b5d 100644 --- a/spec/main-process/atom-application.test.js +++ b/spec/main-process/atom-application.test.js @@ -606,6 +606,8 @@ describe('AtomApplication', function () { assert(!electron.app.didQuit()) await Promise.all([window1.lastPrepareToUnloadPromise, window2.lastPrepareToUnloadPromise]) + assert(!electron.app.didQuit()) + await atomApplication.lastBeforeQuitPromise await new Promise(process.nextTick) assert(electron.app.didQuit()) }) @@ -634,6 +636,29 @@ describe('AtomApplication', function () { assert(electron.app.didQuit()) }) + it('closes successfully unloaded windows when quitting', async () => { + const atomApplication = buildAtomApplication() + const [window1] = await atomApplication.launch(parseCommandLine([])) + const [window2] = await atomApplication.launch(parseCommandLine([])) + await Promise.all([window1.loadedPromise, window2.loadedPromise]) + await evalInWebContents(window1.browserWindow.webContents, sendBackToMainProcess => { + atom.workspace.getActiveTextEditor().insertText('unsaved text') + sendBackToMainProcess() + }) + + // Choosing "Cancel" + mockElectronShowMessageBox({response: 1}) + electron.app.quit() + await atomApplication.lastBeforeQuitPromise + assert(atomApplication.getAllWindows().length === 1) + + // Choosing "Don't save" + mockElectronShowMessageBox({response: 2}) + electron.app.quit() + await atomApplication.lastBeforeQuitPromise + assert(atomApplication.getAllWindows().length === 0) + }) + function buildAtomApplication (params = {}) { const atomApplication = new AtomApplication(Object.assign({ resourcePath: ATOM_RESOURCE_PATH, diff --git a/src/main-process/atom-application.js b/src/main-process/atom-application.js index 8a6d03733..c10895650 100644 --- a/src/main-process/atom-application.js +++ b/src/main-process/atom-application.js @@ -437,7 +437,14 @@ class AtomApplication extends EventEmitter { if (!this.quitting) { this.quitting = true event.preventDefault() - const windowUnloadPromises = this.getAllWindows().map(window => window.prepareToUnload()) + const windowUnloadPromises = this.getAllWindows().map(async window => { + const unloaded = await window.prepareToUnload() + if (unloaded) { + window.close() + await window.closedPromise + } + return unloaded + }) const windowUnloadedResults = await Promise.all(windowUnloadPromises) if (windowUnloadedResults.every(Boolean)) { app.quit()