Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 5 additions & 11 deletions packages/playwright-core/src/server/firefox/ffPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,23 +159,17 @@ export class FFPage implements PageDelegate {
}

_onWebSocketOpened(event: Protocol.Page.webSocketOpenedPayload) {
const socketId = webSocketId(event.frameId, event.wsid);
const request = this._webSocketRequests.get(event.requestId);
assert(request);

const response = this._webSocketResponses.get(event.requestId);
// A `WebSocket` opened inside a worker is reported here, but its upgrade request is
// never seen by the network stack, so there is no handshake metadata to attach.
// TODO: Remove this workaround and make `requestData` required in `FrameManager.onWebSocketRequest`
// once Playwright's bundled Firefox includes https://phabricator.services.mozilla.com/D310690.
if (!request || !response) {
this._page.frameManager.onWebSocketRequest(socketId);
return;
}
assert(response);

this._webSocketRequests.delete(event.requestId);
this._webSocketResponses.delete(event.requestId);

this._page.frameManager.onWebSocketRequest(socketId, request);
this._page.frameManager.onWebSocketResponse(socketId, response);
this._page.frameManager.onWebSocketRequest(webSocketId(event.frameId, event.wsid), request);
this._page.frameManager.onWebSocketResponse(webSocketId(event.frameId, event.wsid), response);
}

_onWebSocketClosed(event: Protocol.Page.webSocketClosedPayload) {
Expand Down
7 changes: 3 additions & 4 deletions packages/playwright-core/src/server/frames.ts
Original file line number Diff line number Diff line change
Expand Up @@ -433,20 +433,19 @@ export class FrameManager {
this._webSockets.set(requestId, ws);
}

onWebSocketRequest(requestId: string, requestData?: { headers: types.HeadersArray, wallTimeMs?: number }) {
onWebSocketRequest(requestId: string, requestData: { headers: types.HeadersArray, wallTimeMs?: number }) {
const ws = this._webSockets.get(requestId);
if (!ws)
return;

ws.setWallTimeMs(requestData?.wallTimeMs);
ws.setWallTimeMs(requestData.wallTimeMs);

if (ws.markAsNotified()) {
this._page.emit(Page.Events.WebSocket, ws);
this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws, this._page);
}

if (requestData)
ws.requestSent(requestData.headers);
ws.requestSent(requestData.headers);
}

onWebSocketResponse(requestId: string, responseData: { status: number, statusText: string, headers: types.HeadersArray }) {
Expand Down
6 changes: 2 additions & 4 deletions tests/library/browsercontext-locale.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,7 @@ it('should send user Accept-Language header', {

it('should send Accept-Language header on WebSocket handshake', {
annotation: [{ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/23732' }],
}, async ({ browser, server, browserName, browserMajorVersion, isBidi }) => {
it.fixme(browserName === 'firefox' && !isBidi, 'Firefox/Juggler does not send Accept-Language on WebSocket handshake');
}, async ({ browser, server, browserName, browserMajorVersion }) => {
it.fixme(browserName === 'chromium' && browserMajorVersion < 151, 'Chromium before 151 sends the browser Accept-Language instead of the emulated locale on WebSocket handshake');

const context = await browser.newContext({ locale: 'en-GB' });
Expand All @@ -241,8 +240,7 @@ it('should send Accept-Language header on WebSocket handshake', {

it('should send Accept-Language header on WebSocket handshake from a worker', {
annotation: [{ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/13919' }],
}, async ({ browser, server, browserName, browserMajorVersion, isBidi }) => {
it.fixme(browserName === 'firefox' && !isBidi, 'Firefox/Juggler does not associate a WebSocket opened inside a worker with its browsing context');
}, async ({ browser, server, browserName, browserMajorVersion }) => {
it.fixme(browserName === 'chromium' && browserMajorVersion < 151, 'Chromium before 151 sends the browser Accept-Language instead of the emulated locale on WebSocket handshake');

const context = await browser.newContext({ locale: 'en-GB' });
Expand Down
3 changes: 1 addition & 2 deletions tests/library/web-socket.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -259,9 +259,8 @@ it('should send extra HTTP headers on WebSocket handshake', {

it('should send extra HTTP headers on WebSocket handshake from a worker', {
annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/28948' },
}, async ({ page, server, browserName, browserMajorVersion, isBidi }) => {
}, async ({ page, server, browserName, browserMajorVersion }) => {
it.fixme(browserName === 'chromium' && browserMajorVersion < 151, 'Chromium before 151 does not send extra HTTP headers on WebSocket handshake');
it.fixme(browserName === 'firefox' && !isBidi, 'Firefox/Juggler does not associate a WebSocket opened inside a worker with its browsing context');

await page.setExtraHTTPHeaders({ foo: 'bar' });
await page.goto(server.EMPTY_PAGE);
Expand Down
Loading