diff --git a/packages/playwright-core/src/server/browserContext.ts b/packages/playwright-core/src/server/browserContext.ts index 060faa0a3461e..744f9493e7869 100644 --- a/packages/playwright-core/src/server/browserContext.ts +++ b/packages/playwright-core/src/server/browserContext.ts @@ -28,7 +28,7 @@ import { mkdirIfNeeded } from './utils/fileUtils'; import { rewriteErrorMessage } from '../utils/isomorphic/stackTrace'; import { HarRecorder } from './har/harRecorder'; import { helper } from './helper'; -import { SdkObject } from './instrumentation'; +import { EventMap, SdkObject } from './instrumentation'; import * as network from './network'; import { InitScript } from './page'; import { Page, PageBinding } from './page'; @@ -39,6 +39,7 @@ import * as rawStorageSource from '../generated/storageScriptSource'; import type { Artifact } from './artifact'; import type { Browser, BrowserOptions } from './browser'; +import type { ConsoleMessage } from './console'; import type { Download } from './download'; import type * as frames from './frames'; import type { Progress } from './progress'; @@ -47,25 +48,44 @@ import type { SerializedStorage } from '@injected/storageScript'; import type * as types from './types'; import type * as channels from '@protocol/channels'; -export abstract class BrowserContext extends SdkObject { - static Events = { - Console: 'console', - Close: 'close', - Page: 'page', - // Can't use just 'error' due to node.js special treatment of error events. - // @see https://nodejs.org/api/events.html#events_error_events - PageError: 'pageerror', - Request: 'request', - Response: 'response', - RequestFailed: 'requestfailed', - RequestFinished: 'requestfinished', - RequestAborted: 'requestaborted', - RequestFulfilled: 'requestfulfilled', - RequestContinued: 'requestcontinued', - BeforeClose: 'beforeclose', - VideoStarted: 'videostarted', - RecorderEvent: 'recorderevent', - }; +const BrowserContextEvent = { + Console: 'console', + Close: 'close', + Page: 'page', + // Can't use just 'error' due to node.js special treatment of error events. + // @see https://nodejs.org/api/events.html#events_error_events + PageError: 'pageerror', + Request: 'request', + Response: 'response', + RequestFailed: 'requestfailed', + RequestFinished: 'requestfinished', + RequestAborted: 'requestaborted', + RequestFulfilled: 'requestfulfilled', + RequestContinued: 'requestcontinued', + BeforeClose: 'beforeclose', + VideoStarted: 'videostarted', + RecorderEvent: 'recorderevent', +} as const; + +export type BrowserContextEventMap = { + [BrowserContextEvent.Console]: [message: ConsoleMessage]; + [BrowserContextEvent.Close]: []; + [BrowserContextEvent.Page]: [page: Page]; + [BrowserContextEvent.PageError]: [error: Error, page: Page]; + [BrowserContextEvent.Request]: [request: network.Request]; + [BrowserContextEvent.Response]: [response: network.Response]; + [BrowserContextEvent.RequestFailed]: [request: network.Request]; + [BrowserContextEvent.RequestFinished]: [requestAndResponse: { request: network.Request, response: network.Response | null }]; + [BrowserContextEvent.RequestAborted]: [request: network.Request]; + [BrowserContextEvent.RequestFulfilled]: [request: network.Request]; + [BrowserContextEvent.RequestContinued]: [request: network.Request]; + [BrowserContextEvent.BeforeClose]: []; + [BrowserContextEvent.VideoStarted]: [artifact: Artifact]; + [BrowserContextEvent.RecorderEvent]: [event: { event: 'actionAdded' | 'actionUpdated' | 'signalAdded', data: any, page: Page, code: string }]; +}; + +export abstract class BrowserContext extends SdkObject { + static Events = BrowserContextEvent; readonly _pageBindings = new Map(); readonly _options: types.BrowserContextOptions; diff --git a/packages/playwright-core/src/server/chromium/crBrowser.ts b/packages/playwright-core/src/server/chromium/crBrowser.ts index edb5bf3479721..5c3cc7f66af5e 100644 --- a/packages/playwright-core/src/server/chromium/crBrowser.ts +++ b/packages/playwright-core/src/server/chromium/crBrowser.ts @@ -327,10 +327,16 @@ export class CRBrowser extends Browser { } } -export class CRBrowserContext extends BrowserContext { - static CREvents = { - ServiceWorker: 'serviceworker', - }; +const CREvents = { + ServiceWorker: 'serviceworker', +} as const; + +export type CREventsMap = { + [CREvents.ServiceWorker]: [serviceWorker: CRServiceWorker]; +}; + +export class CRBrowserContext extends BrowserContext { + static CREvents = CREvents; declare readonly _browser: CRBrowser; diff --git a/packages/playwright-core/src/server/chromium/crConnection.ts b/packages/playwright-core/src/server/chromium/crConnection.ts index 0a8d3427fcc01..8df1f61347355 100644 --- a/packages/playwright-core/src/server/chromium/crConnection.ts +++ b/packages/playwright-core/src/server/chromium/crConnection.ts @@ -32,6 +32,10 @@ export const ConnectionEvents = { Disconnected: Symbol('ConnectionEvents.Disconnected') }; +export type ConnectionEventMap = { + [ConnectionEvents.Disconnected]: []; +}; + // CRPlaywright uses this special id to issue Browser.close command which we // should ignore. export const kBrowserCloseMessageId = -9999; @@ -100,7 +104,7 @@ export class CRConnection extends SdkObject { type SessionEventListener = (method: string, params?: Object) => void; -export class CRSession extends SdkObject { +export class CRSession extends SdkObject { private readonly _connection: CRConnection; private _eventListener?: SessionEventListener; private readonly _callbacks = new Map void, reject: (e: ProtocolError) => void, error: ProtocolError }>(); @@ -108,11 +112,6 @@ export class CRSession extends SdkObject { private readonly _parentSession: CRSession | null; private _crashed: boolean = false; private _closed = false; - override on: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override addListener: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override off: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override removeListener: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override once: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; constructor(connection: CRConnection, parentSession: CRSession | null, sessionId: string, eventListener?: SessionEventListener) { super(connection, 'cr-session'); @@ -121,12 +120,6 @@ export class CRSession extends SdkObject { this._parentSession = parentSession; this._sessionId = sessionId; this._eventListener = eventListener; - - this.on = super.on; - this.addListener = super.addListener; - this.off = super.removeListener; - this.removeListener = super.removeListener; - this.once = super.once; } _markAsCrashed() { @@ -172,7 +165,7 @@ export class CRSession extends SdkObject { Promise.resolve().then(() => { if (this._eventListener) this._eventListener(object.method!, object.params); - this.emit(object.method!, object.params); + (this.emit as any)(object.method as any, object.params); }); } } diff --git a/packages/playwright-core/src/server/chromium/crPage.ts b/packages/playwright-core/src/server/chromium/crPage.ts index e11d0409791d2..ce74f660275fd 100644 --- a/packages/playwright-core/src/server/chromium/crPage.ts +++ b/packages/playwright-core/src/server/chromium/crPage.ts @@ -882,7 +882,7 @@ class FrameSession { const buffer = Buffer.from(payload.data, 'base64'); this._page.emit(Page.Events.ScreencastFrame, { buffer, - frameSwapWallTime: payload.metadata.timestamp ? payload.metadata.timestamp * 1000 : undefined, + frameSwapWallTime: payload.metadata.timestamp ? payload.metadata.timestamp * 1000 : Date.now(), width: payload.metadata.deviceWidth, height: payload.metadata.deviceHeight, }); diff --git a/packages/playwright-core/src/server/chromium/protocol.d.ts b/packages/playwright-core/src/server/chromium/protocol.d.ts index 9417e0c8e1e17..1b6d71707af4a 100644 --- a/packages/playwright-core/src/server/chromium/protocol.d.ts +++ b/packages/playwright-core/src/server/chromium/protocol.d.ts @@ -21792,7 +21792,7 @@ Error was thrown. } } - export interface Events { + export type Events = { "Accessibility.loadComplete": Accessibility.loadCompletePayload; "Accessibility.nodesUpdated": Accessibility.nodesUpdatedPayload; "Animation.animationCanceled": Animation.animationCanceledPayload; @@ -22011,6 +22011,225 @@ Error was thrown. "Runtime.executionContextsCleared": Runtime.executionContextsClearedPayload; "Runtime.inspectRequested": Runtime.inspectRequestedPayload; } + export type EventMap = { + ["Accessibility.loadComplete"]: [Accessibility.loadCompletePayload]; + ["Accessibility.nodesUpdated"]: [Accessibility.nodesUpdatedPayload]; + ["Animation.animationCanceled"]: [Animation.animationCanceledPayload]; + ["Animation.animationCreated"]: [Animation.animationCreatedPayload]; + ["Animation.animationStarted"]: [Animation.animationStartedPayload]; + ["Animation.animationUpdated"]: [Animation.animationUpdatedPayload]; + ["Audits.issueAdded"]: [Audits.issueAddedPayload]; + ["Autofill.addressFormFilled"]: [Autofill.addressFormFilledPayload]; + ["BackgroundService.recordingStateChanged"]: [BackgroundService.recordingStateChangedPayload]; + ["BackgroundService.backgroundServiceEventReceived"]: [BackgroundService.backgroundServiceEventReceivedPayload]; + ["BluetoothEmulation.gattOperationReceived"]: [BluetoothEmulation.gattOperationReceivedPayload]; + ["BluetoothEmulation.characteristicOperationReceived"]: [BluetoothEmulation.characteristicOperationReceivedPayload]; + ["BluetoothEmulation.descriptorOperationReceived"]: [BluetoothEmulation.descriptorOperationReceivedPayload]; + ["Browser.downloadWillBegin"]: [Browser.downloadWillBeginPayload]; + ["Browser.downloadProgress"]: [Browser.downloadProgressPayload]; + ["CSS.fontsUpdated"]: [CSS.fontsUpdatedPayload]; + ["CSS.mediaQueryResultChanged"]: [CSS.mediaQueryResultChangedPayload]; + ["CSS.styleSheetAdded"]: [CSS.styleSheetAddedPayload]; + ["CSS.styleSheetChanged"]: [CSS.styleSheetChangedPayload]; + ["CSS.styleSheetRemoved"]: [CSS.styleSheetRemovedPayload]; + ["CSS.computedStyleUpdated"]: [CSS.computedStyleUpdatedPayload]; + ["Cast.sinksUpdated"]: [Cast.sinksUpdatedPayload]; + ["Cast.issueUpdated"]: [Cast.issueUpdatedPayload]; + ["DOM.attributeModified"]: [DOM.attributeModifiedPayload]; + ["DOM.adoptedStyleSheetsModified"]: [DOM.adoptedStyleSheetsModifiedPayload]; + ["DOM.attributeRemoved"]: [DOM.attributeRemovedPayload]; + ["DOM.characterDataModified"]: [DOM.characterDataModifiedPayload]; + ["DOM.childNodeCountUpdated"]: [DOM.childNodeCountUpdatedPayload]; + ["DOM.childNodeInserted"]: [DOM.childNodeInsertedPayload]; + ["DOM.childNodeRemoved"]: [DOM.childNodeRemovedPayload]; + ["DOM.distributedNodesUpdated"]: [DOM.distributedNodesUpdatedPayload]; + ["DOM.documentUpdated"]: [DOM.documentUpdatedPayload]; + ["DOM.inlineStyleInvalidated"]: [DOM.inlineStyleInvalidatedPayload]; + ["DOM.pseudoElementAdded"]: [DOM.pseudoElementAddedPayload]; + ["DOM.topLayerElementsUpdated"]: [DOM.topLayerElementsUpdatedPayload]; + ["DOM.scrollableFlagUpdated"]: [DOM.scrollableFlagUpdatedPayload]; + ["DOM.affectedByStartingStylesFlagUpdated"]: [DOM.affectedByStartingStylesFlagUpdatedPayload]; + ["DOM.pseudoElementRemoved"]: [DOM.pseudoElementRemovedPayload]; + ["DOM.setChildNodes"]: [DOM.setChildNodesPayload]; + ["DOM.shadowRootPopped"]: [DOM.shadowRootPoppedPayload]; + ["DOM.shadowRootPushed"]: [DOM.shadowRootPushedPayload]; + ["DOMStorage.domStorageItemAdded"]: [DOMStorage.domStorageItemAddedPayload]; + ["DOMStorage.domStorageItemRemoved"]: [DOMStorage.domStorageItemRemovedPayload]; + ["DOMStorage.domStorageItemUpdated"]: [DOMStorage.domStorageItemUpdatedPayload]; + ["DOMStorage.domStorageItemsCleared"]: [DOMStorage.domStorageItemsClearedPayload]; + ["DeviceAccess.deviceRequestPrompted"]: [DeviceAccess.deviceRequestPromptedPayload]; + ["Emulation.virtualTimeBudgetExpired"]: [Emulation.virtualTimeBudgetExpiredPayload]; + ["FedCm.dialogShown"]: [FedCm.dialogShownPayload]; + ["FedCm.dialogClosed"]: [FedCm.dialogClosedPayload]; + ["Fetch.requestPaused"]: [Fetch.requestPausedPayload]; + ["Fetch.authRequired"]: [Fetch.authRequiredPayload]; + ["Input.dragIntercepted"]: [Input.dragInterceptedPayload]; + ["Inspector.detached"]: [Inspector.detachedPayload]; + ["Inspector.targetCrashed"]: [Inspector.targetCrashedPayload]; + ["Inspector.targetReloadedAfterCrash"]: [Inspector.targetReloadedAfterCrashPayload]; + ["Inspector.workerScriptLoaded"]: [Inspector.workerScriptLoadedPayload]; + ["LayerTree.layerPainted"]: [LayerTree.layerPaintedPayload]; + ["LayerTree.layerTreeDidChange"]: [LayerTree.layerTreeDidChangePayload]; + ["Log.entryAdded"]: [Log.entryAddedPayload]; + ["Media.playerPropertiesChanged"]: [Media.playerPropertiesChangedPayload]; + ["Media.playerEventsAdded"]: [Media.playerEventsAddedPayload]; + ["Media.playerMessagesLogged"]: [Media.playerMessagesLoggedPayload]; + ["Media.playerErrorsRaised"]: [Media.playerErrorsRaisedPayload]; + ["Media.playerCreated"]: [Media.playerCreatedPayload]; + ["Network.dataReceived"]: [Network.dataReceivedPayload]; + ["Network.eventSourceMessageReceived"]: [Network.eventSourceMessageReceivedPayload]; + ["Network.loadingFailed"]: [Network.loadingFailedPayload]; + ["Network.loadingFinished"]: [Network.loadingFinishedPayload]; + ["Network.requestIntercepted"]: [Network.requestInterceptedPayload]; + ["Network.requestServedFromCache"]: [Network.requestServedFromCachePayload]; + ["Network.requestWillBeSent"]: [Network.requestWillBeSentPayload]; + ["Network.resourceChangedPriority"]: [Network.resourceChangedPriorityPayload]; + ["Network.signedExchangeReceived"]: [Network.signedExchangeReceivedPayload]; + ["Network.responseReceived"]: [Network.responseReceivedPayload]; + ["Network.webSocketClosed"]: [Network.webSocketClosedPayload]; + ["Network.webSocketCreated"]: [Network.webSocketCreatedPayload]; + ["Network.webSocketFrameError"]: [Network.webSocketFrameErrorPayload]; + ["Network.webSocketFrameReceived"]: [Network.webSocketFrameReceivedPayload]; + ["Network.webSocketFrameSent"]: [Network.webSocketFrameSentPayload]; + ["Network.webSocketHandshakeResponseReceived"]: [Network.webSocketHandshakeResponseReceivedPayload]; + ["Network.webSocketWillSendHandshakeRequest"]: [Network.webSocketWillSendHandshakeRequestPayload]; + ["Network.webTransportCreated"]: [Network.webTransportCreatedPayload]; + ["Network.webTransportConnectionEstablished"]: [Network.webTransportConnectionEstablishedPayload]; + ["Network.webTransportClosed"]: [Network.webTransportClosedPayload]; + ["Network.directTCPSocketCreated"]: [Network.directTCPSocketCreatedPayload]; + ["Network.directTCPSocketOpened"]: [Network.directTCPSocketOpenedPayload]; + ["Network.directTCPSocketAborted"]: [Network.directTCPSocketAbortedPayload]; + ["Network.directTCPSocketClosed"]: [Network.directTCPSocketClosedPayload]; + ["Network.directTCPSocketChunkSent"]: [Network.directTCPSocketChunkSentPayload]; + ["Network.directTCPSocketChunkReceived"]: [Network.directTCPSocketChunkReceivedPayload]; + ["Network.directUDPSocketJoinedMulticastGroup"]: [Network.directUDPSocketJoinedMulticastGroupPayload]; + ["Network.directUDPSocketLeftMulticastGroup"]: [Network.directUDPSocketLeftMulticastGroupPayload]; + ["Network.directUDPSocketCreated"]: [Network.directUDPSocketCreatedPayload]; + ["Network.directUDPSocketOpened"]: [Network.directUDPSocketOpenedPayload]; + ["Network.directUDPSocketAborted"]: [Network.directUDPSocketAbortedPayload]; + ["Network.directUDPSocketClosed"]: [Network.directUDPSocketClosedPayload]; + ["Network.directUDPSocketChunkSent"]: [Network.directUDPSocketChunkSentPayload]; + ["Network.directUDPSocketChunkReceived"]: [Network.directUDPSocketChunkReceivedPayload]; + ["Network.requestWillBeSentExtraInfo"]: [Network.requestWillBeSentExtraInfoPayload]; + ["Network.responseReceivedExtraInfo"]: [Network.responseReceivedExtraInfoPayload]; + ["Network.responseReceivedEarlyHints"]: [Network.responseReceivedEarlyHintsPayload]; + ["Network.trustTokenOperationDone"]: [Network.trustTokenOperationDonePayload]; + ["Network.policyUpdated"]: [Network.policyUpdatedPayload]; + ["Network.reportingApiReportAdded"]: [Network.reportingApiReportAddedPayload]; + ["Network.reportingApiReportUpdated"]: [Network.reportingApiReportUpdatedPayload]; + ["Network.reportingApiEndpointsChangedForOrigin"]: [Network.reportingApiEndpointsChangedForOriginPayload]; + ["Overlay.inspectNodeRequested"]: [Overlay.inspectNodeRequestedPayload]; + ["Overlay.nodeHighlightRequested"]: [Overlay.nodeHighlightRequestedPayload]; + ["Overlay.screenshotRequested"]: [Overlay.screenshotRequestedPayload]; + ["Overlay.inspectModeCanceled"]: [Overlay.inspectModeCanceledPayload]; + ["Page.domContentEventFired"]: [Page.domContentEventFiredPayload]; + ["Page.fileChooserOpened"]: [Page.fileChooserOpenedPayload]; + ["Page.frameAttached"]: [Page.frameAttachedPayload]; + ["Page.frameClearedScheduledNavigation"]: [Page.frameClearedScheduledNavigationPayload]; + ["Page.frameDetached"]: [Page.frameDetachedPayload]; + ["Page.frameSubtreeWillBeDetached"]: [Page.frameSubtreeWillBeDetachedPayload]; + ["Page.frameNavigated"]: [Page.frameNavigatedPayload]; + ["Page.documentOpened"]: [Page.documentOpenedPayload]; + ["Page.frameResized"]: [Page.frameResizedPayload]; + ["Page.frameStartedNavigating"]: [Page.frameStartedNavigatingPayload]; + ["Page.frameRequestedNavigation"]: [Page.frameRequestedNavigationPayload]; + ["Page.frameScheduledNavigation"]: [Page.frameScheduledNavigationPayload]; + ["Page.frameStartedLoading"]: [Page.frameStartedLoadingPayload]; + ["Page.frameStoppedLoading"]: [Page.frameStoppedLoadingPayload]; + ["Page.downloadWillBegin"]: [Page.downloadWillBeginPayload]; + ["Page.downloadProgress"]: [Page.downloadProgressPayload]; + ["Page.interstitialHidden"]: [Page.interstitialHiddenPayload]; + ["Page.interstitialShown"]: [Page.interstitialShownPayload]; + ["Page.javascriptDialogClosed"]: [Page.javascriptDialogClosedPayload]; + ["Page.javascriptDialogOpening"]: [Page.javascriptDialogOpeningPayload]; + ["Page.lifecycleEvent"]: [Page.lifecycleEventPayload]; + ["Page.backForwardCacheNotUsed"]: [Page.backForwardCacheNotUsedPayload]; + ["Page.loadEventFired"]: [Page.loadEventFiredPayload]; + ["Page.navigatedWithinDocument"]: [Page.navigatedWithinDocumentPayload]; + ["Page.screencastFrame"]: [Page.screencastFramePayload]; + ["Page.screencastVisibilityChanged"]: [Page.screencastVisibilityChangedPayload]; + ["Page.windowOpen"]: [Page.windowOpenPayload]; + ["Page.compilationCacheProduced"]: [Page.compilationCacheProducedPayload]; + ["Performance.metrics"]: [Performance.metricsPayload]; + ["PerformanceTimeline.timelineEventAdded"]: [PerformanceTimeline.timelineEventAddedPayload]; + ["Preload.ruleSetUpdated"]: [Preload.ruleSetUpdatedPayload]; + ["Preload.ruleSetRemoved"]: [Preload.ruleSetRemovedPayload]; + ["Preload.preloadEnabledStateUpdated"]: [Preload.preloadEnabledStateUpdatedPayload]; + ["Preload.prefetchStatusUpdated"]: [Preload.prefetchStatusUpdatedPayload]; + ["Preload.prerenderStatusUpdated"]: [Preload.prerenderStatusUpdatedPayload]; + ["Preload.preloadingAttemptSourcesUpdated"]: [Preload.preloadingAttemptSourcesUpdatedPayload]; + ["Security.certificateError"]: [Security.certificateErrorPayload]; + ["Security.visibleSecurityStateChanged"]: [Security.visibleSecurityStateChangedPayload]; + ["Security.securityStateChanged"]: [Security.securityStateChangedPayload]; + ["ServiceWorker.workerErrorReported"]: [ServiceWorker.workerErrorReportedPayload]; + ["ServiceWorker.workerRegistrationUpdated"]: [ServiceWorker.workerRegistrationUpdatedPayload]; + ["ServiceWorker.workerVersionUpdated"]: [ServiceWorker.workerVersionUpdatedPayload]; + ["Storage.cacheStorageContentUpdated"]: [Storage.cacheStorageContentUpdatedPayload]; + ["Storage.cacheStorageListUpdated"]: [Storage.cacheStorageListUpdatedPayload]; + ["Storage.indexedDBContentUpdated"]: [Storage.indexedDBContentUpdatedPayload]; + ["Storage.indexedDBListUpdated"]: [Storage.indexedDBListUpdatedPayload]; + ["Storage.interestGroupAccessed"]: [Storage.interestGroupAccessedPayload]; + ["Storage.interestGroupAuctionEventOccurred"]: [Storage.interestGroupAuctionEventOccurredPayload]; + ["Storage.interestGroupAuctionNetworkRequestCreated"]: [Storage.interestGroupAuctionNetworkRequestCreatedPayload]; + ["Storage.sharedStorageAccessed"]: [Storage.sharedStorageAccessedPayload]; + ["Storage.sharedStorageWorkletOperationExecutionFinished"]: [Storage.sharedStorageWorkletOperationExecutionFinishedPayload]; + ["Storage.storageBucketCreatedOrUpdated"]: [Storage.storageBucketCreatedOrUpdatedPayload]; + ["Storage.storageBucketDeleted"]: [Storage.storageBucketDeletedPayload]; + ["Storage.attributionReportingSourceRegistered"]: [Storage.attributionReportingSourceRegisteredPayload]; + ["Storage.attributionReportingTriggerRegistered"]: [Storage.attributionReportingTriggerRegisteredPayload]; + ["Storage.attributionReportingReportSent"]: [Storage.attributionReportingReportSentPayload]; + ["Storage.attributionReportingVerboseDebugReportSent"]: [Storage.attributionReportingVerboseDebugReportSentPayload]; + ["Target.attachedToTarget"]: [Target.attachedToTargetPayload]; + ["Target.detachedFromTarget"]: [Target.detachedFromTargetPayload]; + ["Target.receivedMessageFromTarget"]: [Target.receivedMessageFromTargetPayload]; + ["Target.targetCreated"]: [Target.targetCreatedPayload]; + ["Target.targetDestroyed"]: [Target.targetDestroyedPayload]; + ["Target.targetCrashed"]: [Target.targetCrashedPayload]; + ["Target.targetInfoChanged"]: [Target.targetInfoChangedPayload]; + ["Tethering.accepted"]: [Tethering.acceptedPayload]; + ["Tracing.bufferUsage"]: [Tracing.bufferUsagePayload]; + ["Tracing.dataCollected"]: [Tracing.dataCollectedPayload]; + ["Tracing.tracingComplete"]: [Tracing.tracingCompletePayload]; + ["WebAudio.contextCreated"]: [WebAudio.contextCreatedPayload]; + ["WebAudio.contextWillBeDestroyed"]: [WebAudio.contextWillBeDestroyedPayload]; + ["WebAudio.contextChanged"]: [WebAudio.contextChangedPayload]; + ["WebAudio.audioListenerCreated"]: [WebAudio.audioListenerCreatedPayload]; + ["WebAudio.audioListenerWillBeDestroyed"]: [WebAudio.audioListenerWillBeDestroyedPayload]; + ["WebAudio.audioNodeCreated"]: [WebAudio.audioNodeCreatedPayload]; + ["WebAudio.audioNodeWillBeDestroyed"]: [WebAudio.audioNodeWillBeDestroyedPayload]; + ["WebAudio.audioParamCreated"]: [WebAudio.audioParamCreatedPayload]; + ["WebAudio.audioParamWillBeDestroyed"]: [WebAudio.audioParamWillBeDestroyedPayload]; + ["WebAudio.nodesConnected"]: [WebAudio.nodesConnectedPayload]; + ["WebAudio.nodesDisconnected"]: [WebAudio.nodesDisconnectedPayload]; + ["WebAudio.nodeParamConnected"]: [WebAudio.nodeParamConnectedPayload]; + ["WebAudio.nodeParamDisconnected"]: [WebAudio.nodeParamDisconnectedPayload]; + ["WebAuthn.credentialAdded"]: [WebAuthn.credentialAddedPayload]; + ["WebAuthn.credentialDeleted"]: [WebAuthn.credentialDeletedPayload]; + ["WebAuthn.credentialUpdated"]: [WebAuthn.credentialUpdatedPayload]; + ["WebAuthn.credentialAsserted"]: [WebAuthn.credentialAssertedPayload]; + ["Console.messageAdded"]: [Console.messageAddedPayload]; + ["Debugger.breakpointResolved"]: [Debugger.breakpointResolvedPayload]; + ["Debugger.paused"]: [Debugger.pausedPayload]; + ["Debugger.resumed"]: [Debugger.resumedPayload]; + ["Debugger.scriptFailedToParse"]: [Debugger.scriptFailedToParsePayload]; + ["Debugger.scriptParsed"]: [Debugger.scriptParsedPayload]; + ["HeapProfiler.addHeapSnapshotChunk"]: [HeapProfiler.addHeapSnapshotChunkPayload]; + ["HeapProfiler.heapStatsUpdate"]: [HeapProfiler.heapStatsUpdatePayload]; + ["HeapProfiler.lastSeenObjectId"]: [HeapProfiler.lastSeenObjectIdPayload]; + ["HeapProfiler.reportHeapSnapshotProgress"]: [HeapProfiler.reportHeapSnapshotProgressPayload]; + ["HeapProfiler.resetProfiles"]: [HeapProfiler.resetProfilesPayload]; + ["Profiler.consoleProfileFinished"]: [Profiler.consoleProfileFinishedPayload]; + ["Profiler.consoleProfileStarted"]: [Profiler.consoleProfileStartedPayload]; + ["Profiler.preciseCoverageDeltaUpdate"]: [Profiler.preciseCoverageDeltaUpdatePayload]; + ["Runtime.bindingCalled"]: [Runtime.bindingCalledPayload]; + ["Runtime.consoleAPICalled"]: [Runtime.consoleAPICalledPayload]; + ["Runtime.exceptionRevoked"]: [Runtime.exceptionRevokedPayload]; + ["Runtime.exceptionThrown"]: [Runtime.exceptionThrownPayload]; + ["Runtime.executionContextCreated"]: [Runtime.executionContextCreatedPayload]; + ["Runtime.executionContextDestroyed"]: [Runtime.executionContextDestroyedPayload]; + ["Runtime.executionContextsCleared"]: [Runtime.executionContextsClearedPayload]; + ["Runtime.inspectRequested"]: [Runtime.inspectRequestedPayload]; + } export interface CommandParameters { "Accessibility.disable": Accessibility.disableParameters; "Accessibility.enable": Accessibility.enableParameters; diff --git a/packages/playwright-core/src/server/firefox/ffConnection.ts b/packages/playwright-core/src/server/firefox/ffConnection.ts index 1477ace249d81..4689e6df7260b 100644 --- a/packages/playwright-core/src/server/firefox/ffConnection.ts +++ b/packages/playwright-core/src/server/firefox/ffConnection.ts @@ -101,18 +101,13 @@ export class FFConnection extends EventEmitter { } } -export class FFSession extends EventEmitter { +export class FFSession extends EventEmitter { _connection: FFConnection; _disposed = false; private _callbacks: Map; private _sessionId: string; private _rawSend: (message: any) => void; private _crashed: boolean = false; - override on: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override addListener: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override off: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override removeListener: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override once: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; constructor(connection: FFConnection, sessionId: string, rawSend: (message: any) => void) { super(); @@ -121,12 +116,6 @@ export class FFSession extends EventEmitter { this._connection = connection; this._sessionId = sessionId; this._rawSend = rawSend; - - this.on = super.on; - this.addListener = super.addListener; - this.off = super.removeListener; - this.removeListener = super.removeListener; - this.once = super.once; } markAsCrashed() { @@ -164,7 +153,7 @@ export class FFSession extends EventEmitter { } } } else { - Promise.resolve().then(() => this.emit(object.method!, object.params)); + Promise.resolve().then(() => (this.emit as any)(object.method, object.params)); } } diff --git a/packages/playwright-core/src/server/firefox/protocol.d.ts b/packages/playwright-core/src/server/firefox/protocol.d.ts index baf3a18195d16..6511bead5eac1 100644 --- a/packages/playwright-core/src/server/firefox/protocol.d.ts +++ b/packages/playwright-core/src/server/firefox/protocol.d.ts @@ -992,46 +992,46 @@ export module Protocol { evicted?: boolean; }; } - export interface Events { - "Browser.attachedToTarget": Browser.attachedToTargetPayload; - "Browser.detachedFromTarget": Browser.detachedFromTargetPayload; - "Browser.downloadCreated": Browser.downloadCreatedPayload; - "Browser.downloadFinished": Browser.downloadFinishedPayload; - "Browser.videoRecordingFinished": Browser.videoRecordingFinishedPayload; - "Page.ready": Page.readyPayload; - "Page.crashed": Page.crashedPayload; - "Page.eventFired": Page.eventFiredPayload; - "Page.uncaughtError": Page.uncaughtErrorPayload; - "Page.frameAttached": Page.frameAttachedPayload; - "Page.frameDetached": Page.frameDetachedPayload; - "Page.navigationStarted": Page.navigationStartedPayload; - "Page.navigationCommitted": Page.navigationCommittedPayload; - "Page.navigationAborted": Page.navigationAbortedPayload; - "Page.sameDocumentNavigation": Page.sameDocumentNavigationPayload; - "Page.dialogOpened": Page.dialogOpenedPayload; - "Page.dialogClosed": Page.dialogClosedPayload; - "Page.bindingCalled": Page.bindingCalledPayload; - "Page.linkClicked": Page.linkClickedPayload; - "Page.willOpenNewWindowAsynchronously": Page.willOpenNewWindowAsynchronouslyPayload; - "Page.fileChooserOpened": Page.fileChooserOpenedPayload; - "Page.workerCreated": Page.workerCreatedPayload; - "Page.workerDestroyed": Page.workerDestroyedPayload; - "Page.dispatchMessageFromWorker": Page.dispatchMessageFromWorkerPayload; - "Page.videoRecordingStarted": Page.videoRecordingStartedPayload; - "Page.webSocketCreated": Page.webSocketCreatedPayload; - "Page.webSocketOpened": Page.webSocketOpenedPayload; - "Page.webSocketClosed": Page.webSocketClosedPayload; - "Page.webSocketFrameSent": Page.webSocketFrameSentPayload; - "Page.webSocketFrameReceived": Page.webSocketFrameReceivedPayload; - "Page.screencastFrame": Page.screencastFramePayload; - "Runtime.executionContextCreated": Runtime.executionContextCreatedPayload; - "Runtime.executionContextDestroyed": Runtime.executionContextDestroyedPayload; - "Runtime.executionContextsCleared": Runtime.executionContextsClearedPayload; - "Runtime.console": Runtime.consolePayload; - "Network.requestWillBeSent": Network.requestWillBeSentPayload; - "Network.responseReceived": Network.responseReceivedPayload; - "Network.requestFinished": Network.requestFinishedPayload; - "Network.requestFailed": Network.requestFailedPayload; + export type EventMap = { + ["Browser.attachedToTarget"]: [Browser.attachedToTargetPayload]; + ["Browser.detachedFromTarget"]: [Browser.detachedFromTargetPayload]; + ["Browser.downloadCreated"]: [Browser.downloadCreatedPayload]; + ["Browser.downloadFinished"]: [Browser.downloadFinishedPayload]; + ["Browser.videoRecordingFinished"]: [Browser.videoRecordingFinishedPayload]; + ["Page.ready"]: [Page.readyPayload]; + ["Page.crashed"]: [Page.crashedPayload]; + ["Page.eventFired"]: [Page.eventFiredPayload]; + ["Page.uncaughtError"]: [Page.uncaughtErrorPayload]; + ["Page.frameAttached"]: [Page.frameAttachedPayload]; + ["Page.frameDetached"]: [Page.frameDetachedPayload]; + ["Page.navigationStarted"]: [Page.navigationStartedPayload]; + ["Page.navigationCommitted"]: [Page.navigationCommittedPayload]; + ["Page.navigationAborted"]: [Page.navigationAbortedPayload]; + ["Page.sameDocumentNavigation"]: [Page.sameDocumentNavigationPayload]; + ["Page.dialogOpened"]: [Page.dialogOpenedPayload]; + ["Page.dialogClosed"]: [Page.dialogClosedPayload]; + ["Page.bindingCalled"]: [Page.bindingCalledPayload]; + ["Page.linkClicked"]: [Page.linkClickedPayload]; + ["Page.willOpenNewWindowAsynchronously"]: [Page.willOpenNewWindowAsynchronouslyPayload]; + ["Page.fileChooserOpened"]: [Page.fileChooserOpenedPayload]; + ["Page.workerCreated"]: [Page.workerCreatedPayload]; + ["Page.workerDestroyed"]: [Page.workerDestroyedPayload]; + ["Page.dispatchMessageFromWorker"]: [Page.dispatchMessageFromWorkerPayload]; + ["Page.videoRecordingStarted"]: [Page.videoRecordingStartedPayload]; + ["Page.webSocketCreated"]: [Page.webSocketCreatedPayload]; + ["Page.webSocketOpened"]: [Page.webSocketOpenedPayload]; + ["Page.webSocketClosed"]: [Page.webSocketClosedPayload]; + ["Page.webSocketFrameSent"]: [Page.webSocketFrameSentPayload]; + ["Page.webSocketFrameReceived"]: [Page.webSocketFrameReceivedPayload]; + ["Page.screencastFrame"]: [Page.screencastFramePayload]; + ["Runtime.executionContextCreated"]: [Runtime.executionContextCreatedPayload]; + ["Runtime.executionContextDestroyed"]: [Runtime.executionContextDestroyedPayload]; + ["Runtime.executionContextsCleared"]: [Runtime.executionContextsClearedPayload]; + ["Runtime.console"]: [Runtime.consolePayload]; + ["Network.requestWillBeSent"]: [Network.requestWillBeSentPayload]; + ["Network.responseReceived"]: [Network.responseReceivedPayload]; + ["Network.requestFinished"]: [Network.requestFinishedPayload]; + ["Network.requestFailed"]: [Network.requestFailedPayload]; } export interface CommandParameters { "Browser.enable": Browser.enableParameters; diff --git a/packages/playwright-core/src/server/frames.ts b/packages/playwright-core/src/server/frames.ts index 192b0db00e54b..d6c2285c4100a 100644 --- a/packages/playwright-core/src/server/frames.ts +++ b/packages/playwright-core/src/server/frames.ts @@ -441,12 +441,20 @@ export class FrameManager { } } -export class Frame extends SdkObject { - static Events = { - InternalNavigation: 'internalnavigation', - AddLifecycle: 'addlifecycle', - RemoveLifecycle: 'removelifecycle', - }; +const FrameEvent = { + InternalNavigation: 'internalnavigation', + AddLifecycle: 'addlifecycle', + RemoveLifecycle: 'removelifecycle', +} as const; + +export type FrameEventMap = { + [FrameEvent.InternalNavigation]: [event: NavigationEvent]; + [FrameEvent.AddLifecycle]: [event: types.LifecycleEvent]; + [FrameEvent.RemoveLifecycle]: [event: types.LifecycleEvent]; +}; + +export class Frame extends SdkObject { + static Events = FrameEvent; _id: string; readonly seq: number; diff --git a/packages/playwright-core/src/server/instrumentation.ts b/packages/playwright-core/src/server/instrumentation.ts index 7633a5f52df6e..1b675a8746e1d 100644 --- a/packages/playwright-core/src/server/instrumentation.ts +++ b/packages/playwright-core/src/server/instrumentation.ts @@ -40,7 +40,10 @@ export type Attribution = { frame?: Frame; }; -export class SdkObject extends EventEmitter { + +export type EventMap = Record; + +export class SdkObject extends EventEmitter { guid: string; attribution: Attribution; instrumentation: Instrumentation; diff --git a/packages/playwright-core/src/server/page.ts b/packages/playwright-core/src/server/page.ts index 8be5845b747e3..1759727992d74 100644 --- a/packages/playwright-core/src/server/page.ts +++ b/packages/playwright-core/src/server/page.ts @@ -37,6 +37,8 @@ import * as rawBindingsControllerSource from '../generated/bindingsControllerSou import { Screencast } from './screencast'; import type { Artifact } from './artifact'; +import type { BrowserContextEventMap } from './browserContext'; +import type { Download } from './download'; import type * as dom from './dom'; import type * as network from './network'; import type { Progress } from './progress'; @@ -117,22 +119,40 @@ type ExpectScreenshotOptions = ImageComparatorOptions & ScreenshotOptions & { }, }; -export class Page extends SdkObject { - static Events = { - Close: 'close', - Crash: 'crash', - Download: 'download', - EmulatedSizeChanged: 'emulatedsizechanged', - FileChooser: 'filechooser', - FrameAttached: 'frameattached', - FrameDetached: 'framedetached', - InternalFrameNavigatedToNewDocument: 'internalframenavigatedtonewdocument', - LocatorHandlerTriggered: 'locatorhandlertriggered', - ScreencastFrame: 'screencastframe', - Video: 'video', - WebSocket: 'websocket', - Worker: 'worker', - }; +const PageEvent = { + Close: 'close', + Crash: 'crash', + Download: 'download', + EmulatedSizeChanged: 'emulatedsizechanged', + FileChooser: 'filechooser', + FrameAttached: 'frameattached', + FrameDetached: 'framedetached', + InternalFrameNavigatedToNewDocument: 'internalframenavigatedtonewdocument', + LocatorHandlerTriggered: 'locatorhandlertriggered', + ScreencastFrame: 'screencastframe', + Video: 'video', + WebSocket: 'websocket', + Worker: 'worker', +} as const; + +export type PageEventMap = { + [PageEvent.Close]: []; + [PageEvent.Crash]: []; + [PageEvent.Download]: [download: Download]; + [PageEvent.EmulatedSizeChanged]: []; + [PageEvent.FileChooser]: [fileChooser: FileChooser]; + [PageEvent.FrameAttached]: [frame: frames.Frame]; + [PageEvent.FrameDetached]: [frame: frames.Frame]; + [PageEvent.InternalFrameNavigatedToNewDocument]: [frame: frames.Frame]; + [PageEvent.LocatorHandlerTriggered]: [uid: number]; + [PageEvent.ScreencastFrame]: [frame: types.ScreencastFrame]; + [PageEvent.Video]: [artifact: Artifact]; + [PageEvent.WebSocket]: [webSocket: network.WebSocket]; + [PageEvent.Worker]: [worker: Worker]; +}; + +export class Page extends SdkObject { + static Events = PageEvent; private _closedState: 'open' | 'closing' | 'closed' = 'open'; private _closedPromise = new ManualPromise(); @@ -233,10 +253,10 @@ export class Page extends SdkObject { return this._initializedPromise; } - emitOnContext(event: string | symbol, ...args: any[]) { + emitOnContext(event: K, ...args: BrowserContextEventMap[K]) { if (this.isStorageStatePage) return; - this.browserContext.emit(event, ...args); + this.browserContext.emit(event, ...args as any); } async resetForReuse(progress: Progress) { @@ -849,10 +869,16 @@ export class Page extends SdkObject { } } -export class Worker extends SdkObject { - static Events = { - Close: 'close', - }; +export const WorkerEvent = { + Close: 'close', +} as const; + +export type WorkerEventMap = { + [WorkerEvent.Close]: [worker: Worker]; +}; + +export class Worker extends SdkObject { + static Events = WorkerEvent; readonly url: string; private _executionContextPromise = new ManualPromise(); diff --git a/packages/playwright-core/src/server/recorder/recorderApp.ts b/packages/playwright-core/src/server/recorder/recorderApp.ts index a216dc7006aaa..23c2d4c0ebafd 100644 --- a/packages/playwright-core/src/server/recorder/recorderApp.ts +++ b/packages/playwright-core/src/server/recorder/recorderApp.ts @@ -411,6 +411,8 @@ export class ProgrammaticRecorderApp { }); recorder.on(RecorderEvent.SignalAdded, signal => { const page = findPageByGuid(inspectedContext, signal.frame.pageGuid); + if (!page) + return; inspectedContext.emit(BrowserContext.Events.RecorderEvent, { event: 'signalAdded', data: signal, page, code: '' }); }); } diff --git a/packages/playwright-core/src/server/webkit/protocol.d.ts b/packages/playwright-core/src/server/webkit/protocol.d.ts index aa791b3e9227e..360561f8938dc 100644 --- a/packages/playwright-core/src/server/webkit/protocol.d.ts +++ b/packages/playwright-core/src/server/webkit/protocol.d.ts @@ -8936,7 +8936,7 @@ the top of the viewport and Y increases as it proceeds towards the bottom of the } } - export interface Events { + export type Events = { "Animation.animationCreated": Animation.animationCreatedPayload; "Animation.nameChanged": Animation.nameChangedPayload; "Animation.effectChanged": Animation.effectChangedPayload; @@ -9064,6 +9064,134 @@ the top of the viewport and Y increases as it proceeds towards the bottom of the "Worker.workerTerminated": Worker.workerTerminatedPayload; "Worker.dispatchMessageFromWorker": Worker.dispatchMessageFromWorkerPayload; } + export type EventMap = { + ["Animation.animationCreated"]: [Animation.animationCreatedPayload]; + ["Animation.nameChanged"]: [Animation.nameChangedPayload]; + ["Animation.effectChanged"]: [Animation.effectChangedPayload]; + ["Animation.targetChanged"]: [Animation.targetChangedPayload]; + ["Animation.animationDestroyed"]: [Animation.animationDestroyedPayload]; + ["Animation.trackingStart"]: [Animation.trackingStartPayload]; + ["Animation.trackingUpdate"]: [Animation.trackingUpdatePayload]; + ["Animation.trackingComplete"]: [Animation.trackingCompletePayload]; + ["Browser.extensionsEnabled"]: [Browser.extensionsEnabledPayload]; + ["Browser.extensionsDisabled"]: [Browser.extensionsDisabledPayload]; + ["CPUProfiler.trackingStart"]: [CPUProfiler.trackingStartPayload]; + ["CPUProfiler.trackingUpdate"]: [CPUProfiler.trackingUpdatePayload]; + ["CPUProfiler.trackingComplete"]: [CPUProfiler.trackingCompletePayload]; + ["CSS.mediaQueryResultChanged"]: [CSS.mediaQueryResultChangedPayload]; + ["CSS.styleSheetChanged"]: [CSS.styleSheetChangedPayload]; + ["CSS.styleSheetAdded"]: [CSS.styleSheetAddedPayload]; + ["CSS.styleSheetRemoved"]: [CSS.styleSheetRemovedPayload]; + ["CSS.nodeLayoutFlagsChanged"]: [CSS.nodeLayoutFlagsChangedPayload]; + ["Canvas.canvasAdded"]: [Canvas.canvasAddedPayload]; + ["Canvas.canvasRemoved"]: [Canvas.canvasRemovedPayload]; + ["Canvas.canvasSizeChanged"]: [Canvas.canvasSizeChangedPayload]; + ["Canvas.canvasMemoryChanged"]: [Canvas.canvasMemoryChangedPayload]; + ["Canvas.extensionEnabled"]: [Canvas.extensionEnabledPayload]; + ["Canvas.clientNodesChanged"]: [Canvas.clientNodesChangedPayload]; + ["Canvas.recordingStarted"]: [Canvas.recordingStartedPayload]; + ["Canvas.recordingProgress"]: [Canvas.recordingProgressPayload]; + ["Canvas.recordingFinished"]: [Canvas.recordingFinishedPayload]; + ["Canvas.programCreated"]: [Canvas.programCreatedPayload]; + ["Canvas.programDeleted"]: [Canvas.programDeletedPayload]; + ["Console.messageAdded"]: [Console.messageAddedPayload]; + ["Console.messageRepeatCountUpdated"]: [Console.messageRepeatCountUpdatedPayload]; + ["Console.messagesCleared"]: [Console.messagesClearedPayload]; + ["Console.heapSnapshot"]: [Console.heapSnapshotPayload]; + ["DOM.documentUpdated"]: [DOM.documentUpdatedPayload]; + ["DOM.inspect"]: [DOM.inspectPayload]; + ["DOM.setChildNodes"]: [DOM.setChildNodesPayload]; + ["DOM.attributeModified"]: [DOM.attributeModifiedPayload]; + ["DOM.attributeRemoved"]: [DOM.attributeRemovedPayload]; + ["DOM.inlineStyleInvalidated"]: [DOM.inlineStyleInvalidatedPayload]; + ["DOM.characterDataModified"]: [DOM.characterDataModifiedPayload]; + ["DOM.childNodeCountUpdated"]: [DOM.childNodeCountUpdatedPayload]; + ["DOM.childNodeInserted"]: [DOM.childNodeInsertedPayload]; + ["DOM.childNodeRemoved"]: [DOM.childNodeRemovedPayload]; + ["DOM.willDestroyDOMNode"]: [DOM.willDestroyDOMNodePayload]; + ["DOM.shadowRootPushed"]: [DOM.shadowRootPushedPayload]; + ["DOM.shadowRootPopped"]: [DOM.shadowRootPoppedPayload]; + ["DOM.customElementStateChanged"]: [DOM.customElementStateChangedPayload]; + ["DOM.pseudoElementAdded"]: [DOM.pseudoElementAddedPayload]; + ["DOM.pseudoElementRemoved"]: [DOM.pseudoElementRemovedPayload]; + ["DOM.didAddEventListener"]: [DOM.didAddEventListenerPayload]; + ["DOM.willRemoveEventListener"]: [DOM.willRemoveEventListenerPayload]; + ["DOM.didFireEvent"]: [DOM.didFireEventPayload]; + ["DOM.powerEfficientPlaybackStateChanged"]: [DOM.powerEfficientPlaybackStateChangedPayload]; + ["DOMStorage.domStorageItemsCleared"]: [DOMStorage.domStorageItemsClearedPayload]; + ["DOMStorage.domStorageItemRemoved"]: [DOMStorage.domStorageItemRemovedPayload]; + ["DOMStorage.domStorageItemAdded"]: [DOMStorage.domStorageItemAddedPayload]; + ["DOMStorage.domStorageItemUpdated"]: [DOMStorage.domStorageItemUpdatedPayload]; + ["Debugger.globalObjectCleared"]: [Debugger.globalObjectClearedPayload]; + ["Debugger.scriptParsed"]: [Debugger.scriptParsedPayload]; + ["Debugger.scriptFailedToParse"]: [Debugger.scriptFailedToParsePayload]; + ["Debugger.breakpointResolved"]: [Debugger.breakpointResolvedPayload]; + ["Debugger.paused"]: [Debugger.pausedPayload]; + ["Debugger.resumed"]: [Debugger.resumedPayload]; + ["Debugger.didSampleProbe"]: [Debugger.didSampleProbePayload]; + ["Debugger.playBreakpointActionSound"]: [Debugger.playBreakpointActionSoundPayload]; + ["Dialog.javascriptDialogOpening"]: [Dialog.javascriptDialogOpeningPayload]; + ["Heap.garbageCollected"]: [Heap.garbageCollectedPayload]; + ["Heap.trackingStart"]: [Heap.trackingStartPayload]; + ["Heap.trackingComplete"]: [Heap.trackingCompletePayload]; + ["Inspector.evaluateForTestInFrontend"]: [Inspector.evaluateForTestInFrontendPayload]; + ["Inspector.inspect"]: [Inspector.inspectPayload]; + ["LayerTree.layerTreeDidChange"]: [LayerTree.layerTreeDidChangePayload]; + ["Memory.memoryPressure"]: [Memory.memoryPressurePayload]; + ["Memory.trackingStart"]: [Memory.trackingStartPayload]; + ["Memory.trackingUpdate"]: [Memory.trackingUpdatePayload]; + ["Memory.trackingComplete"]: [Memory.trackingCompletePayload]; + ["Network.requestWillBeSent"]: [Network.requestWillBeSentPayload]; + ["Network.responseReceived"]: [Network.responseReceivedPayload]; + ["Network.dataReceived"]: [Network.dataReceivedPayload]; + ["Network.loadingFinished"]: [Network.loadingFinishedPayload]; + ["Network.loadingFailed"]: [Network.loadingFailedPayload]; + ["Network.requestServedFromMemoryCache"]: [Network.requestServedFromMemoryCachePayload]; + ["Network.requestIntercepted"]: [Network.requestInterceptedPayload]; + ["Network.responseIntercepted"]: [Network.responseInterceptedPayload]; + ["Network.webSocketWillSendHandshakeRequest"]: [Network.webSocketWillSendHandshakeRequestPayload]; + ["Network.webSocketHandshakeResponseReceived"]: [Network.webSocketHandshakeResponseReceivedPayload]; + ["Network.webSocketCreated"]: [Network.webSocketCreatedPayload]; + ["Network.webSocketClosed"]: [Network.webSocketClosedPayload]; + ["Network.webSocketFrameReceived"]: [Network.webSocketFrameReceivedPayload]; + ["Network.webSocketFrameError"]: [Network.webSocketFrameErrorPayload]; + ["Network.webSocketFrameSent"]: [Network.webSocketFrameSentPayload]; + ["Page.domContentEventFired"]: [Page.domContentEventFiredPayload]; + ["Page.loadEventFired"]: [Page.loadEventFiredPayload]; + ["Page.frameNavigated"]: [Page.frameNavigatedPayload]; + ["Page.frameAttached"]: [Page.frameAttachedPayload]; + ["Page.frameDetached"]: [Page.frameDetachedPayload]; + ["Page.navigatedWithinDocument"]: [Page.navigatedWithinDocumentPayload]; + ["Page.defaultUserPreferencesDidChange"]: [Page.defaultUserPreferencesDidChangePayload]; + ["Page.willCheckNavigationPolicy"]: [Page.willCheckNavigationPolicyPayload]; + ["Page.didCheckNavigationPolicy"]: [Page.didCheckNavigationPolicyPayload]; + ["Page.fileChooserOpened"]: [Page.fileChooserOpenedPayload]; + ["Playwright.pageProxyCreated"]: [Playwright.pageProxyCreatedPayload]; + ["Playwright.pageProxyDestroyed"]: [Playwright.pageProxyDestroyedPayload]; + ["Playwright.provisionalLoadFailed"]: [Playwright.provisionalLoadFailedPayload]; + ["Playwright.windowOpen"]: [Playwright.windowOpenPayload]; + ["Playwright.downloadCreated"]: [Playwright.downloadCreatedPayload]; + ["Playwright.downloadFilenameSuggested"]: [Playwright.downloadFilenameSuggestedPayload]; + ["Playwright.downloadFinished"]: [Playwright.downloadFinishedPayload]; + ["Playwright.screencastFinished"]: [Playwright.screencastFinishedPayload]; + ["Runtime.executionContextCreated"]: [Runtime.executionContextCreatedPayload]; + ["Runtime.bindingCalled"]: [Runtime.bindingCalledPayload]; + ["Screencast.screencastFrame"]: [Screencast.screencastFramePayload]; + ["ScriptProfiler.trackingStart"]: [ScriptProfiler.trackingStartPayload]; + ["ScriptProfiler.trackingUpdate"]: [ScriptProfiler.trackingUpdatePayload]; + ["ScriptProfiler.trackingComplete"]: [ScriptProfiler.trackingCompletePayload]; + ["Target.targetCreated"]: [Target.targetCreatedPayload]; + ["Target.targetDestroyed"]: [Target.targetDestroyedPayload]; + ["Target.didCommitProvisionalTarget"]: [Target.didCommitProvisionalTargetPayload]; + ["Target.dispatchMessageFromTarget"]: [Target.dispatchMessageFromTargetPayload]; + ["Timeline.eventRecorded"]: [Timeline.eventRecordedPayload]; + ["Timeline.recordingStarted"]: [Timeline.recordingStartedPayload]; + ["Timeline.recordingStopped"]: [Timeline.recordingStoppedPayload]; + ["Timeline.autoCaptureStarted"]: [Timeline.autoCaptureStartedPayload]; + ["Worker.workerCreated"]: [Worker.workerCreatedPayload]; + ["Worker.workerTerminated"]: [Worker.workerTerminatedPayload]; + ["Worker.dispatchMessageFromWorker"]: [Worker.dispatchMessageFromWorkerPayload]; + } export interface CommandParameters { "Animation.enable": Animation.enableParameters; "Animation.disable": Animation.disableParameters; diff --git a/packages/playwright-core/src/server/webkit/wkConnection.ts b/packages/playwright-core/src/server/webkit/wkConnection.ts index ada50a413b1ba..5b0163a7cfd4d 100644 --- a/packages/playwright-core/src/server/webkit/wkConnection.ts +++ b/packages/playwright-core/src/server/webkit/wkConnection.ts @@ -100,7 +100,7 @@ export class WKConnection { } } -export class WKSession extends EventEmitter { +export class WKSession extends EventEmitter { connection: WKConnection; readonly sessionId: string; @@ -109,24 +109,12 @@ export class WKSession extends EventEmitter { private readonly _callbacks = new Map void, reject: (e: ProtocolError) => void, error: ProtocolError }>(); private _crashed: boolean = false; - override on: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override addListener: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override off: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override removeListener: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - override once: (event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this; - constructor(connection: WKConnection, sessionId: string, rawSend: (message: any) => void) { super(); this.setMaxListeners(0); this.connection = connection; this.sessionId = sessionId; this._rawSend = rawSend; - - this.on = super.on; - this.off = super.removeListener; - this.addListener = super.addListener; - this.removeListener = super.removeListener; - this.once = super.once; } async send( diff --git a/packages/playwright-core/types/protocol.d.ts b/packages/playwright-core/types/protocol.d.ts index 9417e0c8e1e17..1b6d71707af4a 100644 --- a/packages/playwright-core/types/protocol.d.ts +++ b/packages/playwright-core/types/protocol.d.ts @@ -21792,7 +21792,7 @@ Error was thrown. } } - export interface Events { + export type Events = { "Accessibility.loadComplete": Accessibility.loadCompletePayload; "Accessibility.nodesUpdated": Accessibility.nodesUpdatedPayload; "Animation.animationCanceled": Animation.animationCanceledPayload; @@ -22011,6 +22011,225 @@ Error was thrown. "Runtime.executionContextsCleared": Runtime.executionContextsClearedPayload; "Runtime.inspectRequested": Runtime.inspectRequestedPayload; } + export type EventMap = { + ["Accessibility.loadComplete"]: [Accessibility.loadCompletePayload]; + ["Accessibility.nodesUpdated"]: [Accessibility.nodesUpdatedPayload]; + ["Animation.animationCanceled"]: [Animation.animationCanceledPayload]; + ["Animation.animationCreated"]: [Animation.animationCreatedPayload]; + ["Animation.animationStarted"]: [Animation.animationStartedPayload]; + ["Animation.animationUpdated"]: [Animation.animationUpdatedPayload]; + ["Audits.issueAdded"]: [Audits.issueAddedPayload]; + ["Autofill.addressFormFilled"]: [Autofill.addressFormFilledPayload]; + ["BackgroundService.recordingStateChanged"]: [BackgroundService.recordingStateChangedPayload]; + ["BackgroundService.backgroundServiceEventReceived"]: [BackgroundService.backgroundServiceEventReceivedPayload]; + ["BluetoothEmulation.gattOperationReceived"]: [BluetoothEmulation.gattOperationReceivedPayload]; + ["BluetoothEmulation.characteristicOperationReceived"]: [BluetoothEmulation.characteristicOperationReceivedPayload]; + ["BluetoothEmulation.descriptorOperationReceived"]: [BluetoothEmulation.descriptorOperationReceivedPayload]; + ["Browser.downloadWillBegin"]: [Browser.downloadWillBeginPayload]; + ["Browser.downloadProgress"]: [Browser.downloadProgressPayload]; + ["CSS.fontsUpdated"]: [CSS.fontsUpdatedPayload]; + ["CSS.mediaQueryResultChanged"]: [CSS.mediaQueryResultChangedPayload]; + ["CSS.styleSheetAdded"]: [CSS.styleSheetAddedPayload]; + ["CSS.styleSheetChanged"]: [CSS.styleSheetChangedPayload]; + ["CSS.styleSheetRemoved"]: [CSS.styleSheetRemovedPayload]; + ["CSS.computedStyleUpdated"]: [CSS.computedStyleUpdatedPayload]; + ["Cast.sinksUpdated"]: [Cast.sinksUpdatedPayload]; + ["Cast.issueUpdated"]: [Cast.issueUpdatedPayload]; + ["DOM.attributeModified"]: [DOM.attributeModifiedPayload]; + ["DOM.adoptedStyleSheetsModified"]: [DOM.adoptedStyleSheetsModifiedPayload]; + ["DOM.attributeRemoved"]: [DOM.attributeRemovedPayload]; + ["DOM.characterDataModified"]: [DOM.characterDataModifiedPayload]; + ["DOM.childNodeCountUpdated"]: [DOM.childNodeCountUpdatedPayload]; + ["DOM.childNodeInserted"]: [DOM.childNodeInsertedPayload]; + ["DOM.childNodeRemoved"]: [DOM.childNodeRemovedPayload]; + ["DOM.distributedNodesUpdated"]: [DOM.distributedNodesUpdatedPayload]; + ["DOM.documentUpdated"]: [DOM.documentUpdatedPayload]; + ["DOM.inlineStyleInvalidated"]: [DOM.inlineStyleInvalidatedPayload]; + ["DOM.pseudoElementAdded"]: [DOM.pseudoElementAddedPayload]; + ["DOM.topLayerElementsUpdated"]: [DOM.topLayerElementsUpdatedPayload]; + ["DOM.scrollableFlagUpdated"]: [DOM.scrollableFlagUpdatedPayload]; + ["DOM.affectedByStartingStylesFlagUpdated"]: [DOM.affectedByStartingStylesFlagUpdatedPayload]; + ["DOM.pseudoElementRemoved"]: [DOM.pseudoElementRemovedPayload]; + ["DOM.setChildNodes"]: [DOM.setChildNodesPayload]; + ["DOM.shadowRootPopped"]: [DOM.shadowRootPoppedPayload]; + ["DOM.shadowRootPushed"]: [DOM.shadowRootPushedPayload]; + ["DOMStorage.domStorageItemAdded"]: [DOMStorage.domStorageItemAddedPayload]; + ["DOMStorage.domStorageItemRemoved"]: [DOMStorage.domStorageItemRemovedPayload]; + ["DOMStorage.domStorageItemUpdated"]: [DOMStorage.domStorageItemUpdatedPayload]; + ["DOMStorage.domStorageItemsCleared"]: [DOMStorage.domStorageItemsClearedPayload]; + ["DeviceAccess.deviceRequestPrompted"]: [DeviceAccess.deviceRequestPromptedPayload]; + ["Emulation.virtualTimeBudgetExpired"]: [Emulation.virtualTimeBudgetExpiredPayload]; + ["FedCm.dialogShown"]: [FedCm.dialogShownPayload]; + ["FedCm.dialogClosed"]: [FedCm.dialogClosedPayload]; + ["Fetch.requestPaused"]: [Fetch.requestPausedPayload]; + ["Fetch.authRequired"]: [Fetch.authRequiredPayload]; + ["Input.dragIntercepted"]: [Input.dragInterceptedPayload]; + ["Inspector.detached"]: [Inspector.detachedPayload]; + ["Inspector.targetCrashed"]: [Inspector.targetCrashedPayload]; + ["Inspector.targetReloadedAfterCrash"]: [Inspector.targetReloadedAfterCrashPayload]; + ["Inspector.workerScriptLoaded"]: [Inspector.workerScriptLoadedPayload]; + ["LayerTree.layerPainted"]: [LayerTree.layerPaintedPayload]; + ["LayerTree.layerTreeDidChange"]: [LayerTree.layerTreeDidChangePayload]; + ["Log.entryAdded"]: [Log.entryAddedPayload]; + ["Media.playerPropertiesChanged"]: [Media.playerPropertiesChangedPayload]; + ["Media.playerEventsAdded"]: [Media.playerEventsAddedPayload]; + ["Media.playerMessagesLogged"]: [Media.playerMessagesLoggedPayload]; + ["Media.playerErrorsRaised"]: [Media.playerErrorsRaisedPayload]; + ["Media.playerCreated"]: [Media.playerCreatedPayload]; + ["Network.dataReceived"]: [Network.dataReceivedPayload]; + ["Network.eventSourceMessageReceived"]: [Network.eventSourceMessageReceivedPayload]; + ["Network.loadingFailed"]: [Network.loadingFailedPayload]; + ["Network.loadingFinished"]: [Network.loadingFinishedPayload]; + ["Network.requestIntercepted"]: [Network.requestInterceptedPayload]; + ["Network.requestServedFromCache"]: [Network.requestServedFromCachePayload]; + ["Network.requestWillBeSent"]: [Network.requestWillBeSentPayload]; + ["Network.resourceChangedPriority"]: [Network.resourceChangedPriorityPayload]; + ["Network.signedExchangeReceived"]: [Network.signedExchangeReceivedPayload]; + ["Network.responseReceived"]: [Network.responseReceivedPayload]; + ["Network.webSocketClosed"]: [Network.webSocketClosedPayload]; + ["Network.webSocketCreated"]: [Network.webSocketCreatedPayload]; + ["Network.webSocketFrameError"]: [Network.webSocketFrameErrorPayload]; + ["Network.webSocketFrameReceived"]: [Network.webSocketFrameReceivedPayload]; + ["Network.webSocketFrameSent"]: [Network.webSocketFrameSentPayload]; + ["Network.webSocketHandshakeResponseReceived"]: [Network.webSocketHandshakeResponseReceivedPayload]; + ["Network.webSocketWillSendHandshakeRequest"]: [Network.webSocketWillSendHandshakeRequestPayload]; + ["Network.webTransportCreated"]: [Network.webTransportCreatedPayload]; + ["Network.webTransportConnectionEstablished"]: [Network.webTransportConnectionEstablishedPayload]; + ["Network.webTransportClosed"]: [Network.webTransportClosedPayload]; + ["Network.directTCPSocketCreated"]: [Network.directTCPSocketCreatedPayload]; + ["Network.directTCPSocketOpened"]: [Network.directTCPSocketOpenedPayload]; + ["Network.directTCPSocketAborted"]: [Network.directTCPSocketAbortedPayload]; + ["Network.directTCPSocketClosed"]: [Network.directTCPSocketClosedPayload]; + ["Network.directTCPSocketChunkSent"]: [Network.directTCPSocketChunkSentPayload]; + ["Network.directTCPSocketChunkReceived"]: [Network.directTCPSocketChunkReceivedPayload]; + ["Network.directUDPSocketJoinedMulticastGroup"]: [Network.directUDPSocketJoinedMulticastGroupPayload]; + ["Network.directUDPSocketLeftMulticastGroup"]: [Network.directUDPSocketLeftMulticastGroupPayload]; + ["Network.directUDPSocketCreated"]: [Network.directUDPSocketCreatedPayload]; + ["Network.directUDPSocketOpened"]: [Network.directUDPSocketOpenedPayload]; + ["Network.directUDPSocketAborted"]: [Network.directUDPSocketAbortedPayload]; + ["Network.directUDPSocketClosed"]: [Network.directUDPSocketClosedPayload]; + ["Network.directUDPSocketChunkSent"]: [Network.directUDPSocketChunkSentPayload]; + ["Network.directUDPSocketChunkReceived"]: [Network.directUDPSocketChunkReceivedPayload]; + ["Network.requestWillBeSentExtraInfo"]: [Network.requestWillBeSentExtraInfoPayload]; + ["Network.responseReceivedExtraInfo"]: [Network.responseReceivedExtraInfoPayload]; + ["Network.responseReceivedEarlyHints"]: [Network.responseReceivedEarlyHintsPayload]; + ["Network.trustTokenOperationDone"]: [Network.trustTokenOperationDonePayload]; + ["Network.policyUpdated"]: [Network.policyUpdatedPayload]; + ["Network.reportingApiReportAdded"]: [Network.reportingApiReportAddedPayload]; + ["Network.reportingApiReportUpdated"]: [Network.reportingApiReportUpdatedPayload]; + ["Network.reportingApiEndpointsChangedForOrigin"]: [Network.reportingApiEndpointsChangedForOriginPayload]; + ["Overlay.inspectNodeRequested"]: [Overlay.inspectNodeRequestedPayload]; + ["Overlay.nodeHighlightRequested"]: [Overlay.nodeHighlightRequestedPayload]; + ["Overlay.screenshotRequested"]: [Overlay.screenshotRequestedPayload]; + ["Overlay.inspectModeCanceled"]: [Overlay.inspectModeCanceledPayload]; + ["Page.domContentEventFired"]: [Page.domContentEventFiredPayload]; + ["Page.fileChooserOpened"]: [Page.fileChooserOpenedPayload]; + ["Page.frameAttached"]: [Page.frameAttachedPayload]; + ["Page.frameClearedScheduledNavigation"]: [Page.frameClearedScheduledNavigationPayload]; + ["Page.frameDetached"]: [Page.frameDetachedPayload]; + ["Page.frameSubtreeWillBeDetached"]: [Page.frameSubtreeWillBeDetachedPayload]; + ["Page.frameNavigated"]: [Page.frameNavigatedPayload]; + ["Page.documentOpened"]: [Page.documentOpenedPayload]; + ["Page.frameResized"]: [Page.frameResizedPayload]; + ["Page.frameStartedNavigating"]: [Page.frameStartedNavigatingPayload]; + ["Page.frameRequestedNavigation"]: [Page.frameRequestedNavigationPayload]; + ["Page.frameScheduledNavigation"]: [Page.frameScheduledNavigationPayload]; + ["Page.frameStartedLoading"]: [Page.frameStartedLoadingPayload]; + ["Page.frameStoppedLoading"]: [Page.frameStoppedLoadingPayload]; + ["Page.downloadWillBegin"]: [Page.downloadWillBeginPayload]; + ["Page.downloadProgress"]: [Page.downloadProgressPayload]; + ["Page.interstitialHidden"]: [Page.interstitialHiddenPayload]; + ["Page.interstitialShown"]: [Page.interstitialShownPayload]; + ["Page.javascriptDialogClosed"]: [Page.javascriptDialogClosedPayload]; + ["Page.javascriptDialogOpening"]: [Page.javascriptDialogOpeningPayload]; + ["Page.lifecycleEvent"]: [Page.lifecycleEventPayload]; + ["Page.backForwardCacheNotUsed"]: [Page.backForwardCacheNotUsedPayload]; + ["Page.loadEventFired"]: [Page.loadEventFiredPayload]; + ["Page.navigatedWithinDocument"]: [Page.navigatedWithinDocumentPayload]; + ["Page.screencastFrame"]: [Page.screencastFramePayload]; + ["Page.screencastVisibilityChanged"]: [Page.screencastVisibilityChangedPayload]; + ["Page.windowOpen"]: [Page.windowOpenPayload]; + ["Page.compilationCacheProduced"]: [Page.compilationCacheProducedPayload]; + ["Performance.metrics"]: [Performance.metricsPayload]; + ["PerformanceTimeline.timelineEventAdded"]: [PerformanceTimeline.timelineEventAddedPayload]; + ["Preload.ruleSetUpdated"]: [Preload.ruleSetUpdatedPayload]; + ["Preload.ruleSetRemoved"]: [Preload.ruleSetRemovedPayload]; + ["Preload.preloadEnabledStateUpdated"]: [Preload.preloadEnabledStateUpdatedPayload]; + ["Preload.prefetchStatusUpdated"]: [Preload.prefetchStatusUpdatedPayload]; + ["Preload.prerenderStatusUpdated"]: [Preload.prerenderStatusUpdatedPayload]; + ["Preload.preloadingAttemptSourcesUpdated"]: [Preload.preloadingAttemptSourcesUpdatedPayload]; + ["Security.certificateError"]: [Security.certificateErrorPayload]; + ["Security.visibleSecurityStateChanged"]: [Security.visibleSecurityStateChangedPayload]; + ["Security.securityStateChanged"]: [Security.securityStateChangedPayload]; + ["ServiceWorker.workerErrorReported"]: [ServiceWorker.workerErrorReportedPayload]; + ["ServiceWorker.workerRegistrationUpdated"]: [ServiceWorker.workerRegistrationUpdatedPayload]; + ["ServiceWorker.workerVersionUpdated"]: [ServiceWorker.workerVersionUpdatedPayload]; + ["Storage.cacheStorageContentUpdated"]: [Storage.cacheStorageContentUpdatedPayload]; + ["Storage.cacheStorageListUpdated"]: [Storage.cacheStorageListUpdatedPayload]; + ["Storage.indexedDBContentUpdated"]: [Storage.indexedDBContentUpdatedPayload]; + ["Storage.indexedDBListUpdated"]: [Storage.indexedDBListUpdatedPayload]; + ["Storage.interestGroupAccessed"]: [Storage.interestGroupAccessedPayload]; + ["Storage.interestGroupAuctionEventOccurred"]: [Storage.interestGroupAuctionEventOccurredPayload]; + ["Storage.interestGroupAuctionNetworkRequestCreated"]: [Storage.interestGroupAuctionNetworkRequestCreatedPayload]; + ["Storage.sharedStorageAccessed"]: [Storage.sharedStorageAccessedPayload]; + ["Storage.sharedStorageWorkletOperationExecutionFinished"]: [Storage.sharedStorageWorkletOperationExecutionFinishedPayload]; + ["Storage.storageBucketCreatedOrUpdated"]: [Storage.storageBucketCreatedOrUpdatedPayload]; + ["Storage.storageBucketDeleted"]: [Storage.storageBucketDeletedPayload]; + ["Storage.attributionReportingSourceRegistered"]: [Storage.attributionReportingSourceRegisteredPayload]; + ["Storage.attributionReportingTriggerRegistered"]: [Storage.attributionReportingTriggerRegisteredPayload]; + ["Storage.attributionReportingReportSent"]: [Storage.attributionReportingReportSentPayload]; + ["Storage.attributionReportingVerboseDebugReportSent"]: [Storage.attributionReportingVerboseDebugReportSentPayload]; + ["Target.attachedToTarget"]: [Target.attachedToTargetPayload]; + ["Target.detachedFromTarget"]: [Target.detachedFromTargetPayload]; + ["Target.receivedMessageFromTarget"]: [Target.receivedMessageFromTargetPayload]; + ["Target.targetCreated"]: [Target.targetCreatedPayload]; + ["Target.targetDestroyed"]: [Target.targetDestroyedPayload]; + ["Target.targetCrashed"]: [Target.targetCrashedPayload]; + ["Target.targetInfoChanged"]: [Target.targetInfoChangedPayload]; + ["Tethering.accepted"]: [Tethering.acceptedPayload]; + ["Tracing.bufferUsage"]: [Tracing.bufferUsagePayload]; + ["Tracing.dataCollected"]: [Tracing.dataCollectedPayload]; + ["Tracing.tracingComplete"]: [Tracing.tracingCompletePayload]; + ["WebAudio.contextCreated"]: [WebAudio.contextCreatedPayload]; + ["WebAudio.contextWillBeDestroyed"]: [WebAudio.contextWillBeDestroyedPayload]; + ["WebAudio.contextChanged"]: [WebAudio.contextChangedPayload]; + ["WebAudio.audioListenerCreated"]: [WebAudio.audioListenerCreatedPayload]; + ["WebAudio.audioListenerWillBeDestroyed"]: [WebAudio.audioListenerWillBeDestroyedPayload]; + ["WebAudio.audioNodeCreated"]: [WebAudio.audioNodeCreatedPayload]; + ["WebAudio.audioNodeWillBeDestroyed"]: [WebAudio.audioNodeWillBeDestroyedPayload]; + ["WebAudio.audioParamCreated"]: [WebAudio.audioParamCreatedPayload]; + ["WebAudio.audioParamWillBeDestroyed"]: [WebAudio.audioParamWillBeDestroyedPayload]; + ["WebAudio.nodesConnected"]: [WebAudio.nodesConnectedPayload]; + ["WebAudio.nodesDisconnected"]: [WebAudio.nodesDisconnectedPayload]; + ["WebAudio.nodeParamConnected"]: [WebAudio.nodeParamConnectedPayload]; + ["WebAudio.nodeParamDisconnected"]: [WebAudio.nodeParamDisconnectedPayload]; + ["WebAuthn.credentialAdded"]: [WebAuthn.credentialAddedPayload]; + ["WebAuthn.credentialDeleted"]: [WebAuthn.credentialDeletedPayload]; + ["WebAuthn.credentialUpdated"]: [WebAuthn.credentialUpdatedPayload]; + ["WebAuthn.credentialAsserted"]: [WebAuthn.credentialAssertedPayload]; + ["Console.messageAdded"]: [Console.messageAddedPayload]; + ["Debugger.breakpointResolved"]: [Debugger.breakpointResolvedPayload]; + ["Debugger.paused"]: [Debugger.pausedPayload]; + ["Debugger.resumed"]: [Debugger.resumedPayload]; + ["Debugger.scriptFailedToParse"]: [Debugger.scriptFailedToParsePayload]; + ["Debugger.scriptParsed"]: [Debugger.scriptParsedPayload]; + ["HeapProfiler.addHeapSnapshotChunk"]: [HeapProfiler.addHeapSnapshotChunkPayload]; + ["HeapProfiler.heapStatsUpdate"]: [HeapProfiler.heapStatsUpdatePayload]; + ["HeapProfiler.lastSeenObjectId"]: [HeapProfiler.lastSeenObjectIdPayload]; + ["HeapProfiler.reportHeapSnapshotProgress"]: [HeapProfiler.reportHeapSnapshotProgressPayload]; + ["HeapProfiler.resetProfiles"]: [HeapProfiler.resetProfilesPayload]; + ["Profiler.consoleProfileFinished"]: [Profiler.consoleProfileFinishedPayload]; + ["Profiler.consoleProfileStarted"]: [Profiler.consoleProfileStartedPayload]; + ["Profiler.preciseCoverageDeltaUpdate"]: [Profiler.preciseCoverageDeltaUpdatePayload]; + ["Runtime.bindingCalled"]: [Runtime.bindingCalledPayload]; + ["Runtime.consoleAPICalled"]: [Runtime.consoleAPICalledPayload]; + ["Runtime.exceptionRevoked"]: [Runtime.exceptionRevokedPayload]; + ["Runtime.exceptionThrown"]: [Runtime.exceptionThrownPayload]; + ["Runtime.executionContextCreated"]: [Runtime.executionContextCreatedPayload]; + ["Runtime.executionContextDestroyed"]: [Runtime.executionContextDestroyedPayload]; + ["Runtime.executionContextsCleared"]: [Runtime.executionContextsClearedPayload]; + ["Runtime.inspectRequested"]: [Runtime.inspectRequestedPayload]; + } export interface CommandParameters { "Accessibility.disable": Accessibility.disableParameters; "Accessibility.enable": Accessibility.enableParameters; diff --git a/utils/protocol-types-generator/index.js b/utils/protocol-types-generator/index.js index 373ffc2b43ca5..7686cb3b92845 100644 --- a/utils/protocol-types-generator/index.js +++ b/utils/protocol-types-generator/index.js @@ -84,9 +84,12 @@ export module Protocol {${json.domains.map(domain => `${domain.description ? ` }`).join('')} } `).join('')} - export interface Events {${json.domains.map(domain => (domain.events || []).map(event => ` + export type Events = {${json.domains.map(domain => (domain.events || []).map(event => ` "${domain.domain}.${event.name}": ${domain.domain}.${event.name}Payload;`).join('')).join('')} } + export type EventMap = {${json.domains.map(domain => (domain.events || []).map(event => ` + ["${domain.domain}.${event.name}"]: [${domain.domain}.${event.name}Payload];`).join('')).join('')} + } export interface CommandParameters {${json.domains.map(domain => (domain.commands || []).filter(conditionFilter).map(command => ` "${domain.domain}.${command.name}": ${domain.domain}.${command.name}Parameters;`).join('')).join('')} } @@ -185,8 +188,8 @@ ${domains.map(([domainName, domain]) => ` export type ${commandName}Parameters = ${firefoxTypeToString(command.params)}; export type ${commandName}ReturnValue = ${firefoxTypeToString(command.returns)};`).join('')} }`).join('')} - export interface Events {${domains.map(([domainName, domain]) => Object.keys(domain.events).map(eventName => ` - "${domainName}.${eventName}": ${domainName}.${eventName}Payload;`).join('')).join('')} + export type EventMap = {${domains.map(([domainName, domain]) => Object.keys(domain.events).map(eventName => ` + ["${domainName}.${eventName}"]: [${domainName}.${eventName}Payload];`).join('')).join('')} } export interface CommandParameters {${domains.map(([domainName, domain]) => Object.keys(domain.methods).map(commandName => ` "${domainName}.${commandName}": ${domainName}.${commandName}Parameters;`).join('')).join('')}