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
	 Dmitry Gozman
						Dmitry Gozman