diff --git a/docs/api.md b/docs/api.md index f65f991a7e5a8..7007e676679c1 100644 --- a/docs/api.md +++ b/docs/api.md @@ -39,6 +39,7 @@ * [browser.version()](#browserversion) * [browser.wsEndpoint()](#browserwsendpoint) - [class: Page](#class-page) + * [event: 'close'](#event-close) * [event: 'console'](#event-console) * [event: 'dialog'](#event-dialog) * [event: 'domcontentloaded'](#event-domcontentloaded) @@ -520,6 +521,10 @@ page.on('request', logRequest); page.removeListener('request', logRequest); ``` +#### event: 'close' + +Emitted when the page closes. + #### event: 'console' - <[ConsoleMessage]> diff --git a/lib/Page.js b/lib/Page.js index 0b5efb68dc70f..56554f160ea06 100644 --- a/lib/Page.js +++ b/lib/Page.js @@ -103,6 +103,8 @@ class Page extends EventEmitter { client.on('Security.certificateError', event => this._onCertificateError(event)); client.on('Inspector.targetCrashed', event => this._onTargetCrashed()); client.on('Performance.metrics', event => this._emitMetrics(event)); + + this._target._isClosedPromise.then(() => this.emit(Page.Events.Close)); } /** @@ -968,6 +970,7 @@ function convertPrintParameterToInches(parameter) { } Page.Events = { + Close: 'close', Console: 'console', Dialog: 'dialog', DOMContentLoaded: 'domcontentloaded', diff --git a/test/page.spec.js b/test/page.spec.js index 7b2c345707e57..d40fedc7adea4 100644 --- a/test/page.spec.js +++ b/test/page.spec.js @@ -2397,5 +2397,21 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p }); }); }); + describe('Page.Events.Close', function() { + it('should work with window.close', async function({ page, browser, server }) { + const newPagePromise = new Promise(fulfill => browser.once('targetcreated', target => fulfill(target.page()))); + await page.evaluate(() => window['newPage'] = window.open('about:blank')); + const newPage = await newPagePromise; + const closedPromise = new Promise(x => newPage.on('close', x)); + await page.evaluate(() => window['newPage'].close()); + await closedPromise; + }); + it('should work with page.close', async function({ page, browser, server }) { + const newPage = await browser.newPage(); + const closedPromise = new Promise(x => newPage.on('close', x)); + await newPage.close(); + await closedPromise; + }); + }); }); };