15
15
* limitations under the License.
16
16
*/
17
17
18
- import { FFBrowser } from '../firefox/ffBrowser' ;
19
- import { BrowserFetcher , OnProgressCallback , BrowserFetcherOptions } from './browserFetcher' ;
20
- import { DeviceDescriptors } from '../deviceDescriptors' ;
21
- import { launchProcess , waitForLine } from './processLauncher' ;
22
- import * as types from '../types' ;
23
- import * as platform from '../platform' ;
24
- import { kBrowserCloseMessageId } from '../firefox/ffConnection' ;
25
18
import * as fs from 'fs' ;
26
19
import * as os from 'os' ;
27
20
import * as path from 'path' ;
28
21
import * as util from 'util' ;
22
+ import { ConnectOptions , LaunchType } from '../browser' ;
23
+ import { BrowserContext } from '../browserContext' ;
24
+ import { DeviceDescriptors } from '../deviceDescriptors' ;
29
25
import { TimeoutError } from '../errors' ;
26
+ import { Events } from '../events' ;
27
+ import { FFBrowser } from '../firefox/ffBrowser' ;
28
+ import { kBrowserCloseMessageId } from '../firefox/ffConnection' ;
30
29
import { assert , helper } from '../helper' ;
31
- import { LaunchOptions , BrowserArgOptions , BrowserType } from './browserType' ;
32
- import { ConnectOptions , LaunchType } from '../browser' ;
30
+ import * as platform from '../platform' ;
31
+ import * as types from '../types' ;
32
+ import { BrowserFetcher , BrowserFetcherOptions , OnProgressCallback } from './browserFetcher' ;
33
33
import { BrowserServer } from './browserServer' ;
34
- import { Events } from '../events' ;
35
- import { ConnectionTransport } from '../transport' ;
36
- import { BrowserContext } from '../browserContext' ;
34
+ import { BrowserArgOptions , BrowserType , LaunchOptions } from './browserType' ;
35
+ import { launchProcess , waitForLine } from './processLauncher' ;
37
36
38
37
const mkdtempAsync = platform . promisify ( fs . mkdtemp ) ;
39
38
@@ -64,30 +63,34 @@ export class Firefox implements BrowserType {
64
63
async launch ( options ?: LaunchOptions & { slowMo ?: number } ) : Promise < FFBrowser > {
65
64
if ( options && ( options as any ) . userDataDir )
66
65
throw new Error ( 'userDataDir option is not supported in `browserType.launch`. Use `browserType.launchPersistent` instead' ) ;
67
- const { browserServer, transport } = await this . _launchServer ( options , 'local' ) ;
68
- const browser = await FFBrowser . connect ( transport ! , options && options . slowMo ) ;
66
+ const browserServer = await this . _launchServer ( options , 'local' ) ;
67
+ const browser = await platform . connectToWebsocket ( browserServer . wsEndpoint ( ) ! , transport => {
68
+ return FFBrowser . connect ( transport , options && options . slowMo ) ;
69
+ } ) ;
69
70
// Hack: for typical launch scenario, ensure that close waits for actual process termination.
70
71
browser . close = ( ) => browserServer . close ( ) ;
71
72
( browser as any ) [ '__server__' ] = browserServer ;
72
73
return browser ;
73
74
}
74
75
75
76
async launchServer ( options ?: LaunchOptions & { port ?: number } ) : Promise < BrowserServer > {
76
- return ( await this . _launchServer ( options , 'server' , undefined , options && options . port ) ) . browserServer ;
77
+ return await this . _launchServer ( options , 'server' , undefined , options && options . port ) ;
77
78
}
78
79
79
80
async launchPersistent ( userDataDir : string , options ?: LaunchOptions ) : Promise < BrowserContext > {
80
81
const { timeout = 30000 } = options || { } ;
81
- const { browserServer, transport } = await this . _launchServer ( options , 'persistent' , userDataDir ) ;
82
- const browser = await FFBrowser . connect ( transport ! ) ;
82
+ const browserServer = await this . _launchServer ( options , 'persistent' , userDataDir ) ;
83
+ const browser = await platform . connectToWebsocket ( browserServer . wsEndpoint ( ) ! , transport => {
84
+ return FFBrowser . connect ( transport ) ;
85
+ } ) ;
83
86
await helper . waitWithTimeout ( browser . _waitForTarget ( t => t . type ( ) === 'page' ) , 'first page' , timeout ) ;
84
87
// Hack: for typical launch scenario, ensure that close waits for actual process termination.
85
88
const browserContext = browser . _defaultContext ;
86
89
browserContext . close = ( ) => browserServer . close ( ) ;
87
90
return browserContext ;
88
91
}
89
92
90
- private async _launchServer ( options : LaunchOptions = { } , launchType : LaunchType , userDataDir ?: string , port ?: number ) : Promise < { browserServer : BrowserServer , transport ?: ConnectionTransport } > {
93
+ private async _launchServer ( options : LaunchOptions = { } , launchType : LaunchType , userDataDir ?: string , port ?: number ) : Promise < BrowserServer > {
91
94
const {
92
95
ignoreDefaultArgs = false ,
93
96
args = [ ] ,
@@ -144,7 +147,7 @@ export class Firefox implements BrowserType {
144
147
// We try to gracefully close to prevent crash reporting and core dumps.
145
148
// Note that it's fine to reuse the pipe transport, since
146
149
// our connection ignores kBrowserCloseMessageId.
147
- const transport = new platform . WebSocketTransport ( browserWSEndpoint ) ;
150
+ const transport = await platform . connectToWebsocket ( browserWSEndpoint , async transport => transport ) ;
148
151
const message = { method : 'Browser.close' , params : { } , id : kBrowserCloseMessageId } ;
149
152
await transport . send ( JSON . stringify ( message ) ) ;
150
153
} ,
@@ -157,13 +160,14 @@ export class Firefox implements BrowserType {
157
160
const timeoutError = new TimeoutError ( `Timed out after ${ timeout } ms while trying to connect to Firefox!` ) ;
158
161
const match = await waitForLine ( launchedProcess , launchedProcess . stdout , / ^ J u g g l e r l i s t e n i n g o n ( w s : \/ \/ .* ) $ / , timeout , timeoutError ) ;
159
162
const browserWSEndpoint = match [ 1 ] ;
160
- browserServer = new BrowserServer ( launchedProcess , gracefullyClose , launchType === 'server' ? browserWSEndpoint : null ) ;
161
- return { browserServer, transport : launchType === 'server' ? undefined : new platform . WebSocketTransport ( browserWSEndpoint ) } ;
163
+ browserServer = new BrowserServer ( launchedProcess , gracefullyClose , browserWSEndpoint ) ;
164
+ return browserServer ;
162
165
}
163
166
164
167
async connect ( options : ConnectOptions ) : Promise < FFBrowser > {
165
- const transport = new platform . WebSocketTransport ( options . wsEndpoint ) ;
166
- return FFBrowser . connect ( transport , options . slowMo ) ;
168
+ return await platform . connectToWebsocket ( options . wsEndpoint , transport => {
169
+ return FFBrowser . connect ( transport , options . slowMo ) ;
170
+ } ) ;
167
171
}
168
172
169
173
executablePath ( ) : string {
0 commit comments