mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									d74988e9d0
								
							
						
					
					
						commit
						c83ac444b4
					
				@ -577,19 +577,19 @@ export class Page extends ChannelOwner<channels.PageChannel, channels.PageInitia
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  on(event: string | symbol, listener: Listener): this {
 | 
					  on(event: string | symbol, listener: Listener): this {
 | 
				
			||||||
    if (event === Events.Page.FileChooser) {
 | 
					    if (event === Events.Page.FileChooser && !this.listenerCount(event))
 | 
				
			||||||
      if (!this.listenerCount(event))
 | 
					 | 
				
			||||||
      this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
 | 
					      this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
 | 
				
			||||||
    }
 | 
					    if (event === Events.Page.WebSocket && !this.listenerCount(event))
 | 
				
			||||||
 | 
					      this._channel.setWebSocketFramesReportingEnabledNoReply({ enabled: true });
 | 
				
			||||||
    super.on(event, listener);
 | 
					    super.on(event, listener);
 | 
				
			||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  addListener(event: string | symbol, listener: Listener): this {
 | 
					  addListener(event: string | symbol, listener: Listener): this {
 | 
				
			||||||
    if (event === Events.Page.FileChooser) {
 | 
					    if (event === Events.Page.FileChooser && !this.listenerCount(event))
 | 
				
			||||||
      if (!this.listenerCount(event))
 | 
					 | 
				
			||||||
      this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
 | 
					      this._channel.setFileChooserInterceptedNoReply({ intercepted: true });
 | 
				
			||||||
    }
 | 
					    if (event === Events.Page.WebSocket && !this.listenerCount(event))
 | 
				
			||||||
 | 
					      this._channel.setWebSocketFramesReportingEnabledNoReply({ enabled: true });
 | 
				
			||||||
    super.addListener(event, listener);
 | 
					    super.addListener(event, listener);
 | 
				
			||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -598,6 +598,9 @@ export class Page extends ChannelOwner<channels.PageChannel, channels.PageInitia
 | 
				
			|||||||
    super.off(event, listener);
 | 
					    super.off(event, listener);
 | 
				
			||||||
    if (event === Events.Page.FileChooser && !this.listenerCount(event))
 | 
					    if (event === Events.Page.FileChooser && !this.listenerCount(event))
 | 
				
			||||||
      this._channel.setFileChooserInterceptedNoReply({ intercepted: false });
 | 
					      this._channel.setFileChooserInterceptedNoReply({ intercepted: false });
 | 
				
			||||||
 | 
					    // Note: we do not stop reporting web socket frames, since
 | 
				
			||||||
 | 
					    // user might not listen to 'websocket' anymore, but still have
 | 
				
			||||||
 | 
					    // a functioning WebSocket object.
 | 
				
			||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -605,6 +608,9 @@ export class Page extends ChannelOwner<channels.PageChannel, channels.PageInitia
 | 
				
			|||||||
    super.removeListener(event, listener);
 | 
					    super.removeListener(event, listener);
 | 
				
			||||||
    if (event === Events.Page.FileChooser && !this.listenerCount(event))
 | 
					    if (event === Events.Page.FileChooser && !this.listenerCount(event))
 | 
				
			||||||
      this._channel.setFileChooserInterceptedNoReply({ intercepted: false });
 | 
					      this._channel.setFileChooserInterceptedNoReply({ intercepted: false });
 | 
				
			||||||
 | 
					    // Note: we do not stop reporting web socket frames, since
 | 
				
			||||||
 | 
					    // user might not listen to 'websocket' anymore, but still have
 | 
				
			||||||
 | 
					    // a functioning WebSocket object.
 | 
				
			||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -158,6 +158,10 @@ export class PageDispatcher extends Dispatcher<Page, channels.PageInitializer> i
 | 
				
			|||||||
    await this._page._setFileChooserIntercepted(params.intercepted);
 | 
					    await this._page._setFileChooserIntercepted(params.intercepted);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async setWebSocketFramesReportingEnabledNoReply(params: channels.PageSetWebSocketFramesReportingEnabledNoReplyParams): Promise<void> {
 | 
				
			||||||
 | 
					    this._page._setWebSocketFramesReportingEnabled(params.enabled);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async keyboardDown(params: channels.PageKeyboardDownParams): Promise<void> {
 | 
					  async keyboardDown(params: channels.PageKeyboardDownParams): Promise<void> {
 | 
				
			||||||
    await this._page.keyboard.down(params.key);
 | 
					    await this._page.keyboard.down(params.key);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -727,6 +727,7 @@ export interface PageChannel extends Channel {
 | 
				
			|||||||
  setDefaultNavigationTimeoutNoReply(params: PageSetDefaultNavigationTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultNavigationTimeoutNoReplyResult>;
 | 
					  setDefaultNavigationTimeoutNoReply(params: PageSetDefaultNavigationTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultNavigationTimeoutNoReplyResult>;
 | 
				
			||||||
  setDefaultTimeoutNoReply(params: PageSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultTimeoutNoReplyResult>;
 | 
					  setDefaultTimeoutNoReply(params: PageSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultTimeoutNoReplyResult>;
 | 
				
			||||||
  setFileChooserInterceptedNoReply(params: PageSetFileChooserInterceptedNoReplyParams, metadata?: Metadata): Promise<PageSetFileChooserInterceptedNoReplyResult>;
 | 
					  setFileChooserInterceptedNoReply(params: PageSetFileChooserInterceptedNoReplyParams, metadata?: Metadata): Promise<PageSetFileChooserInterceptedNoReplyResult>;
 | 
				
			||||||
 | 
					  setWebSocketFramesReportingEnabledNoReply(params: PageSetWebSocketFramesReportingEnabledNoReplyParams, metadata?: Metadata): Promise<PageSetWebSocketFramesReportingEnabledNoReplyResult>;
 | 
				
			||||||
  addInitScript(params: PageAddInitScriptParams, metadata?: Metadata): Promise<PageAddInitScriptResult>;
 | 
					  addInitScript(params: PageAddInitScriptParams, metadata?: Metadata): Promise<PageAddInitScriptResult>;
 | 
				
			||||||
  close(params: PageCloseParams, metadata?: Metadata): Promise<PageCloseResult>;
 | 
					  close(params: PageCloseParams, metadata?: Metadata): Promise<PageCloseResult>;
 | 
				
			||||||
  emulateMedia(params: PageEmulateMediaParams, metadata?: Metadata): Promise<PageEmulateMediaResult>;
 | 
					  emulateMedia(params: PageEmulateMediaParams, metadata?: Metadata): Promise<PageEmulateMediaResult>;
 | 
				
			||||||
@ -838,6 +839,13 @@ export type PageSetFileChooserInterceptedNoReplyOptions = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
export type PageSetFileChooserInterceptedNoReplyResult = void;
 | 
					export type PageSetFileChooserInterceptedNoReplyResult = void;
 | 
				
			||||||
 | 
					export type PageSetWebSocketFramesReportingEnabledNoReplyParams = {
 | 
				
			||||||
 | 
					  enabled: boolean,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export type PageSetWebSocketFramesReportingEnabledNoReplyOptions = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export type PageSetWebSocketFramesReportingEnabledNoReplyResult = void;
 | 
				
			||||||
export type PageAddInitScriptParams = {
 | 
					export type PageAddInitScriptParams = {
 | 
				
			||||||
  source: string,
 | 
					  source: string,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -624,6 +624,10 @@ Page:
 | 
				
			|||||||
      parameters:
 | 
					      parameters:
 | 
				
			||||||
        intercepted: boolean
 | 
					        intercepted: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    setWebSocketFramesReportingEnabledNoReply:
 | 
				
			||||||
 | 
					      parameters:
 | 
				
			||||||
 | 
					        enabled: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addInitScript:
 | 
					    addInitScript:
 | 
				
			||||||
      parameters:
 | 
					      parameters:
 | 
				
			||||||
        source: string
 | 
					        source: string
 | 
				
			||||||
 | 
				
			|||||||
@ -330,6 +330,9 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
 | 
				
			|||||||
  scheme.PageSetFileChooserInterceptedNoReplyParams = tObject({
 | 
					  scheme.PageSetFileChooserInterceptedNoReplyParams = tObject({
 | 
				
			||||||
    intercepted: tBoolean,
 | 
					    intercepted: tBoolean,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					  scheme.PageSetWebSocketFramesReportingEnabledNoReplyParams = tObject({
 | 
				
			||||||
 | 
					    enabled: tBoolean,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
  scheme.PageAddInitScriptParams = tObject({
 | 
					  scheme.PageAddInitScriptParams = tObject({
 | 
				
			||||||
    source: tString,
 | 
					    source: tString,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
				
			|||||||
@ -359,12 +359,16 @@ export class FrameManager {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onWebSocketFrameSent(requestId: string, opcode: number, data: string) {
 | 
					  onWebSocketFrameSent(requestId: string, opcode: number, data: string) {
 | 
				
			||||||
 | 
					    if (!this._page._webSocketFramesReportingEnabled)
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
    const ws = this._webSockets.get(requestId);
 | 
					    const ws = this._webSockets.get(requestId);
 | 
				
			||||||
    if (ws)
 | 
					    if (ws)
 | 
				
			||||||
      ws.frameSent(opcode, data);
 | 
					      ws.frameSent(opcode, data);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  webSocketFrameReceived(requestId: string, opcode: number, data: string) {
 | 
					  webSocketFrameReceived(requestId: string, opcode: number, data: string) {
 | 
				
			||||||
 | 
					    if (!this._page._webSocketFramesReportingEnabled)
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
    const ws = this._webSockets.get(requestId);
 | 
					    const ws = this._webSockets.get(requestId);
 | 
				
			||||||
    if (ws)
 | 
					    if (ws)
 | 
				
			||||||
      ws.frameReceived(opcode, data);
 | 
					      ws.frameReceived(opcode, data);
 | 
				
			||||||
 | 
				
			|||||||
@ -145,6 +145,7 @@ export class Page extends EventEmitter {
 | 
				
			|||||||
  _ownedContext: BrowserContext | undefined;
 | 
					  _ownedContext: BrowserContext | undefined;
 | 
				
			||||||
  readonly selectors: Selectors;
 | 
					  readonly selectors: Selectors;
 | 
				
			||||||
  _video: Video | null = null;
 | 
					  _video: Video | null = null;
 | 
				
			||||||
 | 
					  _webSocketFramesReportingEnabled = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(delegate: PageDelegate, browserContext: BrowserContext) {
 | 
					  constructor(delegate: PageDelegate, browserContext: BrowserContext) {
 | 
				
			||||||
    super();
 | 
					    super();
 | 
				
			||||||
@ -419,6 +420,10 @@ export class Page extends EventEmitter {
 | 
				
			|||||||
    await this._delegate.setFileChooserIntercepted(enabled);
 | 
					    await this._delegate.setFileChooserIntercepted(enabled);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _setWebSocketFramesReportingEnabled(enabled: boolean) {
 | 
				
			||||||
 | 
					    this._webSocketFramesReportingEnabled = enabled;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  videoStarted(video: Video) {
 | 
					  videoStarted(video: Video) {
 | 
				
			||||||
    this._video = video;
 | 
					    this._video = video;
 | 
				
			||||||
    this.emit(Page.Events.VideoStarted, video);
 | 
					    this.emit(Page.Events.VideoStarted, video);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user