fix: do not call close on sheets themselves (#22410)

This commit is contained in:
Shelley Vohr 2020-02-28 23:10:21 +00:00 committed by GitHub
parent ed33a72c23
commit 2c974915a3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 7 deletions

View file

@ -588,7 +588,14 @@ void NativeWindowMac::SetContentView(views::View* view) {
void NativeWindowMac::Close() {
// When this is a sheet showing, performClose won't work.
if (is_modal() && parent() && IsVisible()) {
[parent()->GetNativeWindow().GetNativeNSWindow() endSheet:window_];
NSWindow* window = parent()->GetNativeWindow().GetNativeNSWindow();
if (NSWindow* sheetParent = [window sheetParent]) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(base::RetainBlock(^{
[sheetParent endSheet:window];
})));
}
// Manually emit close event (not triggered from close fn)
NotifyWindowCloseButtonClicked();
CloseImmediately();

View file

@ -3105,16 +3105,53 @@ describe('BrowserWindow module', () => {
})
})
// The isEnabled API is not reliable on macOS.
ifdescribe(process.platform !== 'darwin')('modal option', () => {
it('disables parent window', () => {
describe('modal option', () => {
it('does not freeze or crash', async () => {
const parentWindow = new BrowserWindow()
const createTwo = async () => {
const two = new BrowserWindow({
width: 300,
height: 200,
parent: parentWindow,
modal: true,
show: false
})
const twoShown = emittedOnce(two, 'show')
two.show()
await twoShown
setTimeout(() => two.close(), 500)
await emittedOnce(two, 'closed')
}
const one = new BrowserWindow({
width: 600,
height: 400,
parent: parentWindow,
modal: true,
show: false
})
const oneShown = emittedOnce(one, 'show')
one.show()
await oneShown
setTimeout(() => one.destroy(), 500)
await emittedOnce(one, 'closed')
await createTwo()
})
ifit(process.platform !== 'darwin')('disables parent window', () => {
const w = new BrowserWindow({ show: false })
const c = new BrowserWindow({ show: false, parent: w, modal: true })
expect(w.isEnabled()).to.be.true('w.isEnabled')
c.show()
expect(w.isEnabled()).to.be.false('w.isEnabled')
})
it('re-enables an enabled parent window when closed', (done) => {
ifit(process.platform !== 'darwin')('re-enables an enabled parent window when closed', (done) => {
const w = new BrowserWindow({ show: false })
const c = new BrowserWindow({ show: false, parent: w, modal: true })
c.once('closed', () => {
@ -3124,7 +3161,8 @@ describe('BrowserWindow module', () => {
c.show()
c.close()
})
it('does not re-enable a disabled parent window when closed', (done) => {
ifit(process.platform !== 'darwin')('does not re-enable a disabled parent window when closed', (done) => {
const w = new BrowserWindow({ show: false })
const c = new BrowserWindow({ show: false, parent: w, modal: true })
c.once('closed', () => {
@ -3135,7 +3173,8 @@ describe('BrowserWindow module', () => {
c.show()
c.close()
})
it('disables parent window recursively', () => {
ifit(process.platform !== 'darwin')('disables parent window recursively', () => {
const w = new BrowserWindow({ show: false })
const c = new BrowserWindow({ show: false, parent: w, modal: true })
const c2 = new BrowserWindow({ show: false, parent: w, modal: true })