@@ -29,17 +29,19 @@ import { headersArray } from './ffNetworkManager';
29
29
import { FFPage } from './ffPage' ;
30
30
import { Protocol } from './protocol' ;
31
31
32
+ const kAttachedToTarget = Symbol ( 'kAttachedToTarget' ) ;
33
+
32
34
export class FFBrowser extends platform . EventEmitter implements Browser {
33
35
_connection : FFConnection ;
34
36
_targets : Map < string , Target > ;
35
37
readonly _defaultContext : FFBrowserContext ;
36
38
readonly _contexts : Map < string , FFBrowserContext > ;
37
39
private _eventListeners : RegisteredListener [ ] ;
38
40
39
- static async connect ( transport : ConnectionTransport , slowMo ?: number ) : Promise < FFBrowser > {
41
+ static async connect ( transport : ConnectionTransport , attachToDefaultContext : boolean , slowMo ?: number ) : Promise < FFBrowser > {
40
42
const connection = new FFConnection ( SlowMoTransport . wrap ( transport , slowMo ) ) ;
41
43
const browser = new FFBrowser ( connection ) ;
42
- await connection . send ( 'Target .enable' ) ;
44
+ await connection . send ( 'Browser .enable' , { attachToDefaultContext } ) ;
43
45
return browser ;
44
46
}
45
47
@@ -56,10 +58,8 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
56
58
this . emit ( Events . Browser . Disconnected ) ;
57
59
} ) ;
58
60
this . _eventListeners = [
59
- helper . addEventListener ( this . _connection , 'Target.targetCreated' , this . _onTargetCreated . bind ( this ) ) ,
60
- helper . addEventListener ( this . _connection , 'Target.targetDestroyed' , this . _onTargetDestroyed . bind ( this ) ) ,
61
- helper . addEventListener ( this . _connection , 'Target.targetInfoChanged' , this . _onTargetInfoChanged . bind ( this ) ) ,
62
- helper . addEventListener ( this . _connection , 'Target.attachedToTarget' , this . _onAttachedToTarget . bind ( this ) ) ,
61
+ helper . addEventListener ( this . _connection , 'Browser.attachedToTarget' , this . _onAttachedToTarget . bind ( this ) ) ,
62
+ helper . addEventListener ( this . _connection , 'Browser.detachedFromTarget' , this . _onDetachedFromTarget . bind ( this ) ) ,
63
63
] ;
64
64
}
65
65
@@ -88,7 +88,7 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
88
88
hasTouch : false ,
89
89
} ;
90
90
}
91
- const { browserContextId } = await this . _connection . send ( 'Target .createBrowserContext' , {
91
+ const { browserContextId } = await this . _connection . send ( 'Browser .createBrowserContext' , {
92
92
userAgent : options . userAgent ,
93
93
bypassCSP : options . bypassCSP ,
94
94
javaScriptDisabled : options . javaScriptEnabled === false ? true : undefined ,
@@ -121,13 +121,13 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
121
121
return existingTarget ;
122
122
let resolve : ( t : Target ) => void ;
123
123
const targetPromise = new Promise < Target > ( x => resolve = x ) ;
124
- this . on ( 'targetchanged' , check ) ;
124
+ this . on ( kAttachedToTarget , check ) ;
125
125
try {
126
126
if ( ! timeout )
127
127
return await targetPromise ;
128
128
return await helper . waitWithTimeout ( targetPromise , 'target' , timeout ) ;
129
129
} finally {
130
- this . removeListener ( 'targetchanged' , check ) ;
130
+ this . removeListener ( kAttachedToTarget , check ) ;
131
131
}
132
132
133
133
function check ( target : Target ) {
@@ -140,33 +140,23 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
140
140
return Array . from ( this . _targets . values ( ) ) ;
141
141
}
142
142
143
- async _onTargetCreated ( payload : Protocol . Target . targetCreatedPayload ) {
144
- const { targetId, url, browserContextId, openerId, type} = payload ;
145
- const context = browserContextId ? this . _contexts . get ( browserContextId ) ! : this . _defaultContext ;
146
- const target = new Target ( this . _connection , this , context , targetId , type , url , openerId ) ;
147
- this . _targets . set ( targetId , target ) ;
148
- }
149
-
150
- _onTargetDestroyed ( payload : Protocol . Target . targetDestroyedPayload ) {
143
+ _onDetachedFromTarget ( payload : Protocol . Browser . detachedFromTargetPayload ) {
151
144
const { targetId} = payload ;
152
145
const target = this . _targets . get ( targetId ) ! ;
153
146
this . _targets . delete ( targetId ) ;
154
147
target . _didClose ( ) ;
155
148
}
156
149
157
- _onTargetInfoChanged ( payload : Protocol . Target . targetInfoChangedPayload ) {
158
- const { targetId, url} = payload ;
159
- const target = this . _targets . get ( targetId ) ! ;
160
- target . _url = url ;
161
- }
162
-
163
- async _onAttachedToTarget ( payload : Protocol . Target . attachedToTargetPayload ) {
164
- const { targetId} = payload . targetInfo ;
165
- const target = this . _targets . get ( targetId ) ! ;
166
- target . _initPagePromise ( this . _connection . getSession ( payload . sessionId ) ! ) ;
150
+ async _onAttachedToTarget ( payload : Protocol . Browser . attachedToTargetPayload ) {
151
+ const { targetId, browserContextId, openerId, type} = payload . targetInfo ;
152
+ const context = browserContextId ? this . _contexts . get ( browserContextId ) ! : this . _defaultContext ;
153
+ const target = new Target ( this , context , type , '' , openerId ) ;
154
+ this . _targets . set ( targetId , target ) ;
155
+ target . _initPagePromise ( this . _connection . createSession ( payload . sessionId , type ) ) ;
167
156
168
157
const pageEvent = new PageEvent ( target . pageOrError ( ) ) ;
169
158
target . context ( ) . emit ( Events . BrowserContext . Page , pageEvent ) ;
159
+ this . emit ( kAttachedToTarget , target ) ;
170
160
171
161
const opener = target . opener ( ) ;
172
162
if ( ! opener )
@@ -194,23 +184,22 @@ class Target {
194
184
_ffPage : FFPage | null = null ;
195
185
private readonly _browser : FFBrowser ;
196
186
private readonly _context : FFBrowserContext ;
197
- private readonly _connection : FFConnection ;
198
- private readonly _targetId : string ;
199
187
private readonly _type : 'page' | 'browser' ;
200
188
_url : string ;
201
189
private readonly _openerId : string | undefined ;
190
+ private _session ?: FFSession ;
202
191
203
- constructor ( connection : any , browser : FFBrowser , context : FFBrowserContext , targetId : string , type : 'page' | 'browser' , url : string , openerId : string | undefined ) {
192
+ constructor ( browser : FFBrowser , context : FFBrowserContext , type : 'page' | 'browser' , url : string , openerId : string | undefined ) {
204
193
this . _browser = browser ;
205
194
this . _context = context ;
206
- this . _connection = connection ;
207
- this . _targetId = targetId ;
208
195
this . _type = type ;
209
196
this . _url = url ;
210
197
this . _openerId = openerId ;
211
198
}
212
199
213
200
_didClose ( ) {
201
+ if ( this . _session )
202
+ this . _session . dispose ( ) ;
214
203
if ( this . _ffPage )
215
204
this . _ffPage . didClose ( ) ;
216
205
}
@@ -234,12 +223,11 @@ class Target {
234
223
async pageOrError ( ) : Promise < Page | Error > {
235
224
if ( this . _type !== 'page' )
236
225
throw new Error ( `Cannot create page for "${ this . _type } " target` ) ;
237
- if ( ! this . _pagePromise )
238
- await this . _connection . send ( 'Target.attachToTarget' , { targetId : this . _targetId } ) ;
239
226
return this . _pagePromise ! ;
240
227
}
241
228
242
229
_initPagePromise ( session : FFSession ) {
230
+ this . _session = session ;
243
231
this . _pagePromise = new Promise ( async f => {
244
232
this . _ffPage = new FFPage ( session , this . _context , async ( ) => {
245
233
const openerTarget = this . opener ( ) ;
@@ -318,7 +306,7 @@ export class FFBrowserContext extends BrowserContextBase {
318
306
319
307
async newPage ( ) : Promise < Page > {
320
308
assertBrowserContextIsNotOwned ( this ) ;
321
- const { targetId} = await this . _browser . _connection . send ( 'Target .newPage' , {
309
+ const { targetId} = await this . _browser . _connection . send ( 'Browser .newPage' , {
322
310
browserContextId : this . _browserContextId || undefined
323
311
} ) ;
324
312
const target = this . _browser . _targets . get ( targetId ) ! ;
@@ -410,7 +398,7 @@ export class FFBrowserContext extends BrowserContextBase {
410
398
if ( this . _closed )
411
399
return ;
412
400
assert ( this . _browserContextId , 'Non-incognito profiles cannot be closed!' ) ;
413
- await this . _browser . _connection . send ( 'Target .removeBrowserContext' , { browserContextId : this . _browserContextId } ) ;
401
+ await this . _browser . _connection . send ( 'Browser .removeBrowserContext' , { browserContextId : this . _browserContextId } ) ;
414
402
this . _browser . _contexts . delete ( this . _browserContextId ) ;
415
403
this . _didCloseInternal ( ) ;
416
404
}
0 commit comments