fix: close attached sheet on window close (#28967)

This commit is contained in:
Shelley Vohr 2021-05-04 12:11:16 +02:00 committed by GitHub
parent 41bb3f1321
commit 3d6343ed51
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 6 deletions

View file

@ -473,6 +473,12 @@ void NativeWindowMac::Close() {
return; return;
} }
// If a sheet is attached to the window when we call
// [window_ performClose:nil], the window won't close properly
// even after the user has ended the sheet.
// Ensure it's closed before calling [window_ performClose:nil].
SetEnabled(true);
[window_ performClose:nil]; [window_ performClose:nil];
// Closing a sheet doesn't trigger windowShouldClose, // Closing a sheet doesn't trigger windowShouldClose,
@ -540,8 +546,7 @@ void NativeWindowMac::Hide() {
// If a sheet is attached to the window when we call [window_ orderOut:nil], // If a sheet is attached to the window when we call [window_ orderOut:nil],
// the sheet won't be able to show again on the same window. // the sheet won't be able to show again on the same window.
// Ensure it's closed before calling [window_ orderOut:nil]. // Ensure it's closed before calling [window_ orderOut:nil].
if ([window_ attachedSheet]) SetEnabled(true);
[window_ endSheet:[window_ attachedSheet]];
if (is_modal() && parent()) { if (is_modal() && parent()) {
[window_ orderOut:nil]; [window_ orderOut:nil];
@ -575,14 +580,14 @@ bool NativeWindowMac::IsEnabled() {
} }
void NativeWindowMac::SetEnabled(bool enable) { void NativeWindowMac::SetEnabled(bool enable) {
if (enable) { if (!enable) {
[window_ endSheet:[window_ attachedSheet]];
} else {
[window_ beginSheet:window_ [window_ beginSheet:window_
completionHandler:^(NSModalResponse returnCode) { completionHandler:^(NSModalResponse returnCode) {
NSLog(@"modal enabled"); NSLog(@"modal enabled");
return; return;
}]; }];
} else if ([window_ attachedSheet]) {
[window_ endSheet:[window_ attachedSheet]];
} }
} }

View file

@ -6,7 +6,7 @@ import * as os from 'os';
import * as qs from 'querystring'; import * as qs from 'querystring';
import * as http from 'http'; import * as http from 'http';
import { AddressInfo } from 'net'; import { AddressInfo } from 'net';
import { app, BrowserWindow, BrowserView, ipcMain, OnBeforeSendHeadersListenerDetails, protocol, screen, webContents, session, WebContents, BrowserWindowConstructorOptions } from 'electron/main'; import { app, BrowserWindow, BrowserView, dialog, ipcMain, OnBeforeSendHeadersListenerDetails, protocol, screen, webContents, session, WebContents, BrowserWindowConstructorOptions } from 'electron/main';
import { emittedOnce, emittedUntil, emittedNTimes } from './events-helpers'; import { emittedOnce, emittedUntil, emittedNTimes } from './events-helpers';
import { ifit, ifdescribe, defer, delay } from './spec-helpers'; import { ifit, ifdescribe, defer, delay } from './spec-helpers';
@ -102,6 +102,13 @@ describe('BrowserWindow module', () => {
w = null as unknown as BrowserWindow; w = null as unknown as BrowserWindow;
}); });
it('should work if called when a messageBox is showing', async () => {
const closed = emittedOnce(w, 'closed');
dialog.showMessageBox(w, { message: 'Hello Error' });
w.close();
await closed;
});
it('should emit unload handler', async () => { it('should emit unload handler', async () => {
await w.loadFile(path.join(fixtures, 'api', 'unload.html')); await w.loadFile(path.join(fixtures, 'api', 'unload.html'));
const closed = emittedOnce(w, 'closed'); const closed = emittedOnce(w, 'closed');