diff --git a/package.json b/package.json index bab104e316..b1cf09ebf8 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "playwright": { "chromium_revision": "724623", "firefox_revision": "1009", - "webkit_revision": "1059" + "webkit_revision": "1060" }, "scripts": { "unit": "node test/test.js", diff --git a/src/chromium/crPage.ts b/src/chromium/crPage.ts index b0be76f9bf..aad5481c4d 100644 --- a/src/chromium/crPage.ts +++ b/src/chromium/crPage.ts @@ -268,7 +268,7 @@ export class CRPage implements PageDelegate { } _onTargetCrashed() { - this._page.emit('error', new Error('Page crashed!')); + this._page._didCrash(); } _onLogEntryAdded(event: Protocol.Log.entryAddedPayload) { diff --git a/src/page.ts b/src/page.ts index 55c2ec00d9..a1b11029cd 100644 --- a/src/page.ts +++ b/src/page.ts @@ -131,6 +131,12 @@ export class Page extends EventEmitter { this._closedCallback(); } + _didCrash() { + const error = new Error('Page crashed!'); + error.stack = ''; + this.emit('error', error); + } + _didDisconnect() { assert(!this._disconnected, 'Page disconnected twice'); this._disconnected = true; diff --git a/src/webkit/wkBrowser.ts b/src/webkit/wkBrowser.ts index c89daf6016..9a58b2328b 100644 --- a/src/webkit/wkBrowser.ts +++ b/src/webkit/wkBrowser.ts @@ -135,10 +135,10 @@ export class WKBrowser extends browser.Browser { this._connection.send('Target.resume', { targetId: targetInfo.targetId }).catch(debugError); } - _onTargetDestroyed({targetId}) { + _onTargetDestroyed({targetId, crashed}) { const target = this._targets.get(targetId); this._targets.delete(targetId); - target._didClose(); + target._didClose(crashed); } _closePage(targetId: string, runBeforeUnload: boolean) { diff --git a/src/webkit/wkConnection.ts b/src/webkit/wkConnection.ts index 3bfec31d98..c96e0a435c 100644 --- a/src/webkit/wkConnection.ts +++ b/src/webkit/wkConnection.ts @@ -96,7 +96,7 @@ export class WKConnection extends EventEmitter { session._onClosed(); this._sessions.delete(object.params.targetId); } - Promise.resolve().then(() => this.emit(WKConnectionEvents.TargetDestroyed, { targetId: object.params.targetId })); + Promise.resolve().then(() => this.emit(WKConnectionEvents.TargetDestroyed, { targetId: object.params.targetId, crashed: object.params.crashed })); } else if (object.method === 'Target.dispatchMessageFromTarget') { const {targetId, message} = object.params as Protocol.Target.dispatchMessageFromTargetPayload; const session = this._sessions.get(targetId); diff --git a/src/webkit/wkPage.ts b/src/webkit/wkPage.ts index 8a0b4de5ee..bd36097db8 100644 --- a/src/webkit/wkPage.ts +++ b/src/webkit/wkPage.ts @@ -113,11 +113,14 @@ export class WKPage implements PageDelegate { await this._page.evaluate(JSON_SAVE_SCRIPT); } - didClose() { + didClose(crashed: boolean) { helper.removeEventListeners(this._sessionListeners); this._networkManager.dispose(); this.disconnectFromTarget(); - this._page._didClose(); + if (crashed) + this._page._didCrash(); + else + this._page._didClose(); } _addSessionListeners() { diff --git a/src/webkit/wkTarget.ts b/src/webkit/wkTarget.ts index 29aa400b14..27706154e1 100644 --- a/src/webkit/wkTarget.ts +++ b/src/webkit/wkTarget.ts @@ -42,9 +42,9 @@ export class WKTarget { this._pagePromise = null; } - _didClose() { + _didClose(crashed: boolean) { if (this._wkPage) - this._wkPage.didClose(); + this._wkPage.didClose(crashed); } async _initializeSession(session: WKTargetSession) { diff --git a/test/page.spec.js b/test/page.spec.js index 64c39b8a90..d40534fd46 100644 --- a/test/page.spec.js +++ b/test/page.spec.js @@ -109,11 +109,14 @@ module.exports.describe = function({testRunner, expect, headless, playwright, FF }); }); - describe.skip(FFOX || WEBKIT)('Page.Events.error', function() { + describe.skip(FFOX)('Page.Events.error', function() { it('should throw when page crashes', async({page}) => { let error = null; page.on('error', err => error = err); - page.goto('chrome://crash').catch(e => {}); + if (CHROME) + page.goto('chrome://crash').catch(e => {}); + else if (WEBKIT) + page._delegate._session.send('Page.crash', {}).catch(e => {}); await waitEvent(page, 'error'); expect(error.message).toBe('Page crashed!'); });