@@ -102,21 +102,19 @@ export class CRBrowser extends platform.EventEmitter implements Browser {
102
102
return createPageInNewContext ( this , options ) ;
103
103
}
104
104
105
- async _onAttachedToTarget ( event : Protocol . Target . attachedToTargetPayload ) {
106
- if ( ! CRTarget . isPageType ( event . targetInfo . type ) )
105
+ async _onAttachedToTarget ( { targetInfo, sessionId, waitingForDebugger} : Protocol . Target . attachedToTargetPayload ) {
106
+ const session = this . _connection . session ( sessionId ) ! ;
107
+ if ( ! CRTarget . isPageType ( targetInfo . type ) ) {
108
+ assert ( targetInfo . type === 'service_worker' || targetInfo . type === 'browser' || targetInfo . type === 'other' ) ;
109
+ if ( waitingForDebugger ) {
110
+ // Ideally, detaching should resume any target, but there is a bug in the backend.
111
+ session . send ( 'Runtime.runIfWaitingForDebugger' ) . catch ( debugError ) . then ( ( ) => {
112
+ this . _session . send ( 'Target.detachFromTarget' , { sessionId } ) . catch ( debugError ) ;
113
+ } ) ;
114
+ }
107
115
return ;
108
- const target = this . _targets . get ( event . targetInfo . targetId ) ;
109
- const session = this . _connection . session ( event . sessionId ) ! ;
110
- await target ! . initializePageSession ( session ) . catch ( debugError ) ;
111
- }
112
-
113
- async _targetCreated ( { targetInfo} : Protocol . Target . targetCreatedPayload ) {
114
- const { browserContextId} = targetInfo ;
115
- const context = ( browserContextId && this . _contexts . has ( browserContextId ) ) ? this . _contexts . get ( browserContextId ) ! : this . _defaultContext ;
116
- const target = new CRTarget ( this , targetInfo , context , ( ) => this . _connection . createSession ( targetInfo ) ) ;
117
- assert ( ! this . _targets . has ( targetInfo . targetId ) , 'Target should not exist before targetCreated' ) ;
118
- this . _targets . set ( targetInfo . targetId , target ) ;
119
-
116
+ }
117
+ const { context, target } = this . _createTarget ( targetInfo , session ) ;
120
118
try {
121
119
switch ( targetInfo . type ) {
122
120
case 'page' : {
@@ -135,27 +133,42 @@ export class CRBrowser extends platform.EventEmitter implements Browser {
135
133
context . emit ( Events . CRBrowserContext . BackgroundPage , event ) ;
136
134
break ;
137
135
}
138
- case 'service_worker' : {
139
- const serviceWorker = await target . serviceWorker ( ) ;
140
- context . emit ( Events . CRBrowserContext . ServiceWorker , serviceWorker ) ;
141
- break ;
142
- }
143
136
}
144
137
} catch ( e ) {
145
138
// Do not dispatch the event if initialization failed.
146
139
debugError ( e ) ;
147
140
}
148
141
}
149
142
143
+ async _targetCreated ( { targetInfo} : Protocol . Target . targetCreatedPayload ) {
144
+ if ( targetInfo . type !== 'service_worker' )
145
+ return ;
146
+ const { context, target } = this . _createTarget ( targetInfo , null ) ;
147
+ const serviceWorker = await target . serviceWorker ( ) ;
148
+ context . emit ( Events . CRBrowserContext . ServiceWorker , serviceWorker ) ;
149
+ }
150
+
151
+ private _createTarget ( targetInfo : Protocol . Target . TargetInfo , session : CRSession | null ) {
152
+ const { browserContextId} = targetInfo ;
153
+ const context = ( browserContextId && this . _contexts . has ( browserContextId ) ) ? this . _contexts . get ( browserContextId ) ! : this . _defaultContext ;
154
+ const target = new CRTarget ( this , targetInfo , context , session , ( ) => this . _connection . createSession ( targetInfo ) ) ;
155
+ assert ( ! this . _targets . has ( targetInfo . targetId ) , 'Target should not exist before targetCreated' ) ;
156
+ this . _targets . set ( targetInfo . targetId , target ) ;
157
+ return { context, target } ;
158
+ }
159
+
150
160
async _targetDestroyed ( event : { targetId : string ; } ) {
151
161
const target = this . _targets . get ( event . targetId ) ! ;
162
+ if ( ! target )
163
+ return ;
152
164
this . _targets . delete ( event . targetId ) ;
153
165
target . _didClose ( ) ;
154
166
}
155
167
156
168
_targetInfoChanged ( event : Protocol . Target . targetInfoChangedPayload ) {
157
169
const target = this . _targets . get ( event . targetInfo . targetId ) ! ;
158
- assert ( target , 'target should exist before targetInfoChanged' ) ;
170
+ if ( ! target )
171
+ return ;
159
172
target . _targetInfoChanged ( event . targetInfo ) ;
160
173
}
161
174
0 commit comments