diff --git a/lib/browser/api/browser-window.ts b/lib/browser/api/browser-window.ts index b6ec4e60b6d5..eb0984409fe5 100644 --- a/lib/browser/api/browser-window.ts +++ b/lib/browser/api/browser-window.ts @@ -54,7 +54,7 @@ BrowserWindow.prototype._init = function (this: BWT) { this._browserViews = []; - this.on('close', () => { + this.on('closed', () => { this._browserViews.forEach(b => b.webContents?.close({ waitForBeforeUnload: true })); }); diff --git a/spec/api-browser-view-spec.ts b/spec/api-browser-view-spec.ts index 24551bfffbd7..45ed4cfa7bf5 100644 --- a/spec/api-browser-view-spec.ts +++ b/spec/api-browser-view-spec.ts @@ -25,10 +25,12 @@ describe('BrowserView module', () => { }); afterEach(async () => { - const p = once(w.webContents, 'destroyed'); - await closeWindow(w); - w = null as any; - await p; + if (!w.isDestroyed()) { + const p = once(w.webContents, 'destroyed'); + await closeWindow(w); + w = null as any; + await p; + } if (view && view.webContents) { const p = once(view.webContents, 'destroyed'); @@ -534,6 +536,53 @@ describe('BrowserView module', () => { }); describe('shutdown behavior', () => { + it('emits the destroyed event when the host BrowserWindow is closed', async () => { + view = new BrowserView(); + w.addBrowserView(view); + await view.webContents.loadURL(`data:text/html, + + +
HELLO BROWSERVIEW
+ + + `); + + const query = 'document.getElementById("bv_id").textContent'; + const contentBefore = await view.webContents.executeJavaScript(query); + expect(contentBefore).to.equal('HELLO BROWSERVIEW'); + + w.close(); + + const destroyed = once(view.webContents, 'destroyed'); + const closed = once(w, 'closed'); + await Promise.all([destroyed, closed]); + }); + + it('does not destroy its webContents if an owner BrowserWindow close event is prevented', async () => { + view = new BrowserView(); + w.addBrowserView(view); + await view.webContents.loadURL(`data:text/html, + + +
HELLO BROWSERVIEW
+ + + `); + + const query = 'document.getElementById("bv_id").textContent'; + const contentBefore = await view.webContents.executeJavaScript(query); + expect(contentBefore).to.equal('HELLO BROWSERVIEW'); + + w.once('close', (e) => { + e.preventDefault(); + }); + + w.close(); + + const contentAfter = await view.webContents.executeJavaScript(query); + expect(contentAfter).to.equal('HELLO BROWSERVIEW'); + }); + it('does not crash on exit', async () => { const rc = await startRemoteControlApp(); await rc.remotely(() => {