Skip to content

Commit c83ac44

Browse files
authored
api(websocket): do not send websocket frames without a listener (#4361)
Once user adds 'websocket' listener, we start sending the frames for all websockets on the page.
1 parent d74988e commit c83ac44

File tree

7 files changed

+42
-8
lines changed

7 files changed

+42
-8
lines changed

src/client/page.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -577,19 +577,19 @@ export class Page extends ChannelOwner<channels.PageChannel, channels.PageInitia
577577
}
578578

579579
on(event: string | symbol, listener: Listener): this {
580-
if (event === Events.Page.FileChooser) {
581-
if (!this.listenerCount(event))
582-
this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
583-
}
580+
if (event === Events.Page.FileChooser && !this.listenerCount(event))
581+
this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
582+
if (event === Events.Page.WebSocket && !this.listenerCount(event))
583+
this._channel.setWebSocketFramesReportingEnabledNoReply({ enabled: true });
584584
super.on(event, listener);
585585
return this;
586586
}
587587

588588
addListener(event: string | symbol, listener: Listener): this {
589-
if (event === Events.Page.FileChooser) {
590-
if (!this.listenerCount(event))
591-
this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
592-
}
589+
if (event === Events.Page.FileChooser && !this.listenerCount(event))
590+
this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
591+
if (event === Events.Page.WebSocket && !this.listenerCount(event))
592+
this._channel.setWebSocketFramesReportingEnabledNoReply({ enabled: true });
593593
super.addListener(event, listener);
594594
return this;
595595
}
@@ -598,13 +598,19 @@ export class Page extends ChannelOwner<channels.PageChannel, channels.PageInitia
598598
super.off(event, listener);
599599
if (event === Events.Page.FileChooser && !this.listenerCount(event))
600600
this._channel.setFileChooserInterceptedNoReply({ intercepted: false });
601+
// Note: we do not stop reporting web socket frames, since
602+
// user might not listen to 'websocket' anymore, but still have
603+
// a functioning WebSocket object.
601604
return this;
602605
}
603606

604607
removeListener(event: string | symbol, listener: Listener): this {
605608
super.removeListener(event, listener);
606609
if (event === Events.Page.FileChooser && !this.listenerCount(event))
607610
this._channel.setFileChooserInterceptedNoReply({ intercepted: false });
611+
// Note: we do not stop reporting web socket frames, since
612+
// user might not listen to 'websocket' anymore, but still have
613+
// a functioning WebSocket object.
608614
return this;
609615
}
610616

src/dispatchers/pageDispatcher.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ export class PageDispatcher extends Dispatcher<Page, channels.PageInitializer> i
158158
await this._page._setFileChooserIntercepted(params.intercepted);
159159
}
160160

161+
async setWebSocketFramesReportingEnabledNoReply(params: channels.PageSetWebSocketFramesReportingEnabledNoReplyParams): Promise<void> {
162+
this._page._setWebSocketFramesReportingEnabled(params.enabled);
163+
}
164+
161165
async keyboardDown(params: channels.PageKeyboardDownParams): Promise<void> {
162166
await this._page.keyboard.down(params.key);
163167
}

src/protocol/channels.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,7 @@ export interface PageChannel extends Channel {
727727
setDefaultNavigationTimeoutNoReply(params: PageSetDefaultNavigationTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultNavigationTimeoutNoReplyResult>;
728728
setDefaultTimeoutNoReply(params: PageSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultTimeoutNoReplyResult>;
729729
setFileChooserInterceptedNoReply(params: PageSetFileChooserInterceptedNoReplyParams, metadata?: Metadata): Promise<PageSetFileChooserInterceptedNoReplyResult>;
730+
setWebSocketFramesReportingEnabledNoReply(params: PageSetWebSocketFramesReportingEnabledNoReplyParams, metadata?: Metadata): Promise<PageSetWebSocketFramesReportingEnabledNoReplyResult>;
730731
addInitScript(params: PageAddInitScriptParams, metadata?: Metadata): Promise<PageAddInitScriptResult>;
731732
close(params: PageCloseParams, metadata?: Metadata): Promise<PageCloseResult>;
732733
emulateMedia(params: PageEmulateMediaParams, metadata?: Metadata): Promise<PageEmulateMediaResult>;
@@ -838,6 +839,13 @@ export type PageSetFileChooserInterceptedNoReplyOptions = {
838839

839840
};
840841
export type PageSetFileChooserInterceptedNoReplyResult = void;
842+
export type PageSetWebSocketFramesReportingEnabledNoReplyParams = {
843+
enabled: boolean,
844+
};
845+
export type PageSetWebSocketFramesReportingEnabledNoReplyOptions = {
846+
847+
};
848+
export type PageSetWebSocketFramesReportingEnabledNoReplyResult = void;
841849
export type PageAddInitScriptParams = {
842850
source: string,
843851
};

src/protocol/protocol.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,10 @@ Page:
624624
parameters:
625625
intercepted: boolean
626626

627+
setWebSocketFramesReportingEnabledNoReply:
628+
parameters:
629+
enabled: boolean
630+
627631
addInitScript:
628632
parameters:
629633
source: string

src/protocol/validator.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,9 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
330330
scheme.PageSetFileChooserInterceptedNoReplyParams = tObject({
331331
intercepted: tBoolean,
332332
});
333+
scheme.PageSetWebSocketFramesReportingEnabledNoReplyParams = tObject({
334+
enabled: tBoolean,
335+
});
333336
scheme.PageAddInitScriptParams = tObject({
334337
source: tString,
335338
});

src/server/frames.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,16 @@ export class FrameManager {
359359
}
360360

361361
onWebSocketFrameSent(requestId: string, opcode: number, data: string) {
362+
if (!this._page._webSocketFramesReportingEnabled)
363+
return;
362364
const ws = this._webSockets.get(requestId);
363365
if (ws)
364366
ws.frameSent(opcode, data);
365367
}
366368

367369
webSocketFrameReceived(requestId: string, opcode: number, data: string) {
370+
if (!this._page._webSocketFramesReportingEnabled)
371+
return;
368372
const ws = this._webSockets.get(requestId);
369373
if (ws)
370374
ws.frameReceived(opcode, data);

src/server/page.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ export class Page extends EventEmitter {
145145
_ownedContext: BrowserContext | undefined;
146146
readonly selectors: Selectors;
147147
_video: Video | null = null;
148+
_webSocketFramesReportingEnabled = false;
148149

149150
constructor(delegate: PageDelegate, browserContext: BrowserContext) {
150151
super();
@@ -419,6 +420,10 @@ export class Page extends EventEmitter {
419420
await this._delegate.setFileChooserIntercepted(enabled);
420421
}
421422

423+
_setWebSocketFramesReportingEnabled(enabled: boolean) {
424+
this._webSocketFramesReportingEnabled = enabled;
425+
}
426+
422427
videoStarted(video: Video) {
423428
this._video = video;
424429
this.emit(Page.Events.VideoStarted, video);

0 commit comments

Comments
 (0)