@@ -25,7 +25,7 @@ import * as ws from 'ws';
25
25
import { launchProcess } from './processLauncher' ;
26
26
import { kBrowserCloseMessageId } from '../chromium/crConnection' ;
27
27
import { PipeTransport } from './pipeTransport' ;
28
- import { LaunchOptions , BrowserArgOptions , ConnectOptions , LaunchServerOptions , AbstractBrowserType } from './browserType' ;
28
+ import { LaunchOptions , BrowserArgOptions , ConnectOptions , LaunchServerOptions , AbstractBrowserType , processBrowserArgOptions } from './browserType' ;
29
29
import { LaunchType } from '../browser' ;
30
30
import { BrowserServer , WebSocketWrapper } from './browserServer' ;
31
31
import { Events } from '../events' ;
@@ -48,10 +48,13 @@ export class Chromium extends AbstractBrowserType<CRBrowser> {
48
48
return await browserServer . _initializeOrClose ( deadline , async ( ) => {
49
49
if ( ( options as any ) . __testHookBeforeCreateBrowser )
50
50
await ( options as any ) . __testHookBeforeCreateBrowser ( ) ;
51
- const browser = await CRBrowser . connect ( transport ! , false , logger , options ) ;
52
- browser . _ownedServer = browserServer ;
53
- browser . _downloadsPath = downloadsPath ;
54
- return browser ;
51
+ return await CRBrowser . connect ( transport ! , {
52
+ slowMo : options . slowMo ,
53
+ headful : ! processBrowserArgOptions ( options ) . headless ,
54
+ logger,
55
+ downloadsPath,
56
+ ownedServer : browserServer
57
+ } ) ;
55
58
} ) ;
56
59
}
57
60
@@ -62,12 +65,18 @@ export class Chromium extends AbstractBrowserType<CRBrowser> {
62
65
async launchPersistentContext ( userDataDir : string , options : LaunchOptions = { } ) : Promise < BrowserContext > {
63
66
const { timeout = 30000 } = options ;
64
67
const deadline = TimeoutSettings . computeDeadline ( timeout ) ;
65
- const { transport, browserServer, logger } = await this . _launchServer ( options , 'persistent' , userDataDir ) ;
68
+ const { transport, browserServer, downloadsPath , logger } = await this . _launchServer ( options , 'persistent' , userDataDir ) ;
66
69
return await browserServer . _initializeOrClose ( deadline , async ( ) => {
67
70
if ( ( options as any ) . __testHookBeforeCreateBrowser )
68
71
await ( options as any ) . __testHookBeforeCreateBrowser ( ) ;
69
- const browser = await CRBrowser . connect ( transport ! , true , logger , options ) ;
70
- browser . _ownedServer = browserServer ;
72
+ const browser = await CRBrowser . connect ( transport ! , {
73
+ slowMo : options . slowMo ,
74
+ persistent : true ,
75
+ logger,
76
+ downloadsPath,
77
+ headful : ! processBrowserArgOptions ( options ) . headless ,
78
+ ownedServer : browserServer
79
+ } ) ;
71
80
const context = browser . _defaultContext ! ;
72
81
if ( ! options . ignoreDefaultArgs || Array . isArray ( options . ignoreDefaultArgs ) )
73
82
await context . _loadDefaultContext ( ) ;
@@ -109,6 +118,11 @@ export class Chromium extends AbstractBrowserType<CRBrowser> {
109
118
const chromeExecutable = executablePath || this . executablePath ( ) ;
110
119
if ( ! chromeExecutable )
111
120
throw new Error ( `No executable path is specified. Pass "executablePath" option directly.` ) ;
121
+
122
+ // Note: it is important to define these variables before launchProcess, so that we don't get
123
+ // "Cannot access 'browserServer' before initialization" if something went wrong.
124
+ let transport : PipeTransport | undefined = undefined ;
125
+ let browserServer : BrowserServer | undefined = undefined ;
112
126
const { launchedProcess, gracefullyClose, downloadsPath } = await launchProcess ( {
113
127
executablePath : chromeExecutable ,
114
128
args : chromeArguments ,
@@ -134,8 +148,6 @@ export class Chromium extends AbstractBrowserType<CRBrowser> {
134
148
} ,
135
149
} ) ;
136
150
137
- let transport : PipeTransport | undefined = undefined ;
138
- let browserServer : BrowserServer | undefined = undefined ;
139
151
const stdio = launchedProcess . stdio as unknown as [ NodeJS . ReadableStream , NodeJS . WritableStream , NodeJS . WritableStream , NodeJS . WritableStream , NodeJS . ReadableStream ] ;
140
152
transport = new PipeTransport ( stdio [ 3 ] , stdio [ 4 ] , logger ) ;
141
153
browserServer = new BrowserServer ( launchedProcess , gracefullyClose , launchType === 'server' ? wrapTransportWithWebSocket ( transport , logger , port ) : null ) ;
@@ -146,16 +158,13 @@ export class Chromium extends AbstractBrowserType<CRBrowser> {
146
158
return await WebSocketTransport . connect ( options . wsEndpoint , async transport => {
147
159
if ( ( options as any ) . __testHookBeforeCreateBrowser )
148
160
await ( options as any ) . __testHookBeforeCreateBrowser ( ) ;
149
- return CRBrowser . connect ( transport , false , new RootLogger ( options . logger ) , options ) ;
161
+ return CRBrowser . connect ( transport , { slowMo : options . slowMo , logger : new RootLogger ( options . logger ) , downloadsPath : '' } ) ;
150
162
} ) ;
151
163
}
152
164
153
165
private _defaultArgs ( options : BrowserArgOptions = { } , launchType : LaunchType , userDataDir : string ) : string [ ] {
154
- const {
155
- devtools = false ,
156
- headless = ! devtools ,
157
- args = [ ] ,
158
- } = options ;
166
+ const { devtools, headless } = processBrowserArgOptions ( options ) ;
167
+ const { args = [ ] } = options ;
159
168
const userDataDirArg = args . find ( arg => arg . startsWith ( '--user-data-dir' ) ) ;
160
169
if ( userDataDirArg )
161
170
throw new Error ( 'Pass userDataDir parameter instead of specifying --user-data-dir argument' ) ;
0 commit comments