mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	feat(driver): report backend state (#16477)
This commit is contained in:
		
							parent
							
								
									51076d55ad
								
							
						
					
					
						commit
						fce45210c1
					
				@ -90,6 +90,38 @@ class ProtocolHandler {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  constructor(playwright: Playwright) {
 | 
					  constructor(playwright: Playwright) {
 | 
				
			||||||
    this._playwright = playwright;
 | 
					    this._playwright = playwright;
 | 
				
			||||||
 | 
					    playwright.instrumentation.addListener({
 | 
				
			||||||
 | 
					      onPageOpen: () => this._sendSnapshot(),
 | 
				
			||||||
 | 
					      onPageNavigated: () => this._sendSnapshot(),
 | 
				
			||||||
 | 
					      onPageClose: () => this._sendSnapshot(),
 | 
				
			||||||
 | 
					    }, null);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private _sendSnapshot() {
 | 
				
			||||||
 | 
					    const browsers = [];
 | 
				
			||||||
 | 
					    for (const browser of this._playwright.allBrowsers()) {
 | 
				
			||||||
 | 
					      const b = {
 | 
				
			||||||
 | 
					        name: browser.options.name,
 | 
				
			||||||
 | 
					        guid: browser.guid,
 | 
				
			||||||
 | 
					        contexts: [] as any[]
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      browsers.push(b);
 | 
				
			||||||
 | 
					      for (const context of browser.contexts()) {
 | 
				
			||||||
 | 
					        const c = {
 | 
				
			||||||
 | 
					          guid: context.guid,
 | 
				
			||||||
 | 
					          pages: [] as any[]
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        b.contexts.push(c);
 | 
				
			||||||
 | 
					        for (const page of context.pages()) {
 | 
				
			||||||
 | 
					          const p = {
 | 
				
			||||||
 | 
					            guid: page.guid,
 | 
				
			||||||
 | 
					            url: page.mainFrame().url()
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					          c.pages.push(p);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    process.send!({ method: 'browsersChanged', params: { browsers } });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async resetForReuse() {
 | 
					  async resetForReuse() {
 | 
				
			||||||
 | 
				
			|||||||
@ -239,7 +239,7 @@ export class FrameManager {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    frame._onClearLifecycle();
 | 
					    frame._onClearLifecycle();
 | 
				
			||||||
    const navigationEvent: NavigationEvent = { url, name, newDocument: frame._currentDocument, isPublic: true };
 | 
					    const navigationEvent: NavigationEvent = { url, name, newDocument: frame._currentDocument, isPublic: true };
 | 
				
			||||||
    frame.emit(Frame.Events.InternalNavigation, navigationEvent);
 | 
					    this._fireInternalFrameNavigation(frame, navigationEvent);
 | 
				
			||||||
    if (!initial) {
 | 
					    if (!initial) {
 | 
				
			||||||
      debugLogger.log('api', `  navigated to "${url}"`);
 | 
					      debugLogger.log('api', `  navigated to "${url}"`);
 | 
				
			||||||
      this._page.frameNavigatedToNewDocument(frame);
 | 
					      this._page.frameNavigatedToNewDocument(frame);
 | 
				
			||||||
@ -254,7 +254,7 @@ export class FrameManager {
 | 
				
			|||||||
      return;
 | 
					      return;
 | 
				
			||||||
    frame._url = url;
 | 
					    frame._url = url;
 | 
				
			||||||
    const navigationEvent: NavigationEvent = { url, name: frame._name, isPublic: true };
 | 
					    const navigationEvent: NavigationEvent = { url, name: frame._name, isPublic: true };
 | 
				
			||||||
    frame.emit(Frame.Events.InternalNavigation, navigationEvent);
 | 
					    this._fireInternalFrameNavigation(frame, navigationEvent);
 | 
				
			||||||
    debugLogger.log('api', `  navigated to "${url}"`);
 | 
					    debugLogger.log('api', `  navigated to "${url}"`);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -272,7 +272,7 @@ export class FrameManager {
 | 
				
			|||||||
      isPublic: !(documentId && frame._redirectedNavigations.has(documentId)),
 | 
					      isPublic: !(documentId && frame._redirectedNavigations.has(documentId)),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    frame.setPendingDocument(undefined);
 | 
					    frame.setPendingDocument(undefined);
 | 
				
			||||||
    frame.emit(Frame.Events.InternalNavigation, navigationEvent);
 | 
					    this._fireInternalFrameNavigation(frame, navigationEvent);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  frameDetached(frameId: string) {
 | 
					  frameDetached(frameId: string) {
 | 
				
			||||||
@ -462,6 +462,12 @@ export class FrameManager {
 | 
				
			|||||||
    if (ws)
 | 
					    if (ws)
 | 
				
			||||||
      ws.error(errorMessage);
 | 
					      ws.error(errorMessage);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private _fireInternalFrameNavigation(frame: Frame, event: NavigationEvent) {
 | 
				
			||||||
 | 
					    frame.emit(Frame.Events.InternalNavigation, event);
 | 
				
			||||||
 | 
					    if (event.isPublic && !frame.parentFrame())
 | 
				
			||||||
 | 
					      frame.instrumentation.onPageNavigated(frame._page, event.url);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Frame extends SdkObject {
 | 
					export class Frame extends SdkObject {
 | 
				
			||||||
 | 
				
			|||||||
@ -63,6 +63,7 @@ export interface Instrumentation {
 | 
				
			|||||||
  onAfterCall(sdkObject: SdkObject, metadata: CallMetadata): Promise<void>;
 | 
					  onAfterCall(sdkObject: SdkObject, metadata: CallMetadata): Promise<void>;
 | 
				
			||||||
  onEvent(sdkObject: SdkObject, metadata: CallMetadata): void;
 | 
					  onEvent(sdkObject: SdkObject, metadata: CallMetadata): void;
 | 
				
			||||||
  onPageOpen(page: Page): void;
 | 
					  onPageOpen(page: Page): void;
 | 
				
			||||||
 | 
					  onPageNavigated(page: Page, url: string): void;
 | 
				
			||||||
  onPageClose(page: Page): void;
 | 
					  onPageClose(page: Page): void;
 | 
				
			||||||
  onBrowserOpen(browser: Browser): void;
 | 
					  onBrowserOpen(browser: Browser): void;
 | 
				
			||||||
  onBrowserClose(browser: Browser): void;
 | 
					  onBrowserClose(browser: Browser): void;
 | 
				
			||||||
@ -75,6 +76,7 @@ export interface InstrumentationListener {
 | 
				
			|||||||
  onAfterCall?(sdkObject: SdkObject, metadata: CallMetadata): Promise<void>;
 | 
					  onAfterCall?(sdkObject: SdkObject, metadata: CallMetadata): Promise<void>;
 | 
				
			||||||
  onEvent?(sdkObject: SdkObject, metadata: CallMetadata): void;
 | 
					  onEvent?(sdkObject: SdkObject, metadata: CallMetadata): void;
 | 
				
			||||||
  onPageOpen?(page: Page): void;
 | 
					  onPageOpen?(page: Page): void;
 | 
				
			||||||
 | 
					  onPageNavigated?(page: Page, url: string): void;
 | 
				
			||||||
  onPageClose?(page: Page): void;
 | 
					  onPageClose?(page: Page): void;
 | 
				
			||||||
  onBrowserOpen?(browser: Browser): void;
 | 
					  onBrowserOpen?(browser: Browser): void;
 | 
				
			||||||
  onBrowserClose?(browser: Browser): void;
 | 
					  onBrowserClose?(browser: Browser): void;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user