From b8b6c7a220942562d197712df9b4ef6498c99e60 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Wed, 24 Nov 2021 10:46:32 -0800 Subject: [PATCH] fix(chromium): websocket handshake comes twice (#10518) Sometimes we get "Network.webSocketWillSendHandshakeRequest" in Chromium. Perhaps websocket is restarted because of chrome.webRequest extensions api? Or maybe the handshake response was a redirect? This reports websocket twice and triggers an assert. --- packages/playwright-core/src/server/frames.ts | 2 +- packages/playwright-core/src/server/network.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/server/frames.ts b/packages/playwright-core/src/server/frames.ts index df8af491ba..1613356b56 100644 --- a/packages/playwright-core/src/server/frames.ts +++ b/packages/playwright-core/src/server/frames.ts @@ -377,7 +377,7 @@ export class FrameManager { onWebSocketRequest(requestId: string) { const ws = this._webSockets.get(requestId); - if (ws) + if (ws && ws.markAsNotified()) this._page.emit(Page.Events.WebSocket, ws); } diff --git a/packages/playwright-core/src/server/network.ts b/packages/playwright-core/src/server/network.ts index 8b23078093..6120b4a025 100644 --- a/packages/playwright-core/src/server/network.ts +++ b/packages/playwright-core/src/server/network.ts @@ -476,6 +476,7 @@ export class Response extends SdkObject { export class WebSocket extends SdkObject { private _url: string; + private _notified = false; static Events = { Close: 'close', @@ -489,6 +490,16 @@ export class WebSocket extends SdkObject { this._url = url; } + markAsNotified() { + // Sometimes we get "onWebSocketRequest" twice, at least in Chromium. + // Perhaps websocket is restarted because of chrome.webRequest extensions api? + // Or maybe the handshake response was a redirect? + if (this._notified) + return false; + this._notified = true; + return true; + } + url(): string { return this._url; }