launchDevTools method
Implementation
Future<Map<String, dynamic>> launchDevTools(
Map<String, dynamic> params,
Uri vmServiceUri,
String devToolsUrl,
bool headlessMode,
bool machineMode,
) async {
// First see if we have an existing DevTools client open that we can
// reuse.
final canReuse =
params.containsKey('reuseWindows') && params['reuseWindows'] == true;
final shouldNotify =
params.containsKey('notify') && params['notify'] == true;
final page = params['page'];
if (canReuse &&
await _tryReuseExistingDevToolsInstance(
vmServiceUri,
page,
shouldNotify,
)) {
_emitLaunchEvent(
reused: true,
notified: shouldNotify,
pid: null,
machineMode: machineMode,
);
return {
'reused': true,
'notified': shouldNotify,
};
}
final uriParams = <String, dynamic>{};
// Copy over queryParams passed by the client
params['queryParams']?.forEach((key, value) => uriParams[key] = value);
// Add the URI to the VM service
uriParams['uri'] = vmServiceUri.toString();
final devToolsUri = Uri.parse(devToolsUrl);
final uriToLaunch = _buildUriToLaunch(uriParams, page, devToolsUri);
// TODO(dantup): When ChromeOS has support for tunneling all ports we can
// change this to always use the native browser for ChromeOS and may wish to
// handle this inside `browser_launcher`; https://crbug.com/848063.
final useNativeBrowser = _isChromeOS &&
_isAccessibleToChromeOSNativeBrowser(devToolsUri) &&
_isAccessibleToChromeOSNativeBrowser(vmServiceUri);
int? browserPid;
if (useNativeBrowser) {
await Process.start('x-www-browser', [uriToLaunch.toString()]);
} else {
final args = headlessMode
? [
'--headless',
// When running headless, Chrome will quit immediately after
// loading the page unless we have the debug port open.
'--remote-debugging-port=9223',
'--disable-gpu',
'--no-sandbox',
// When running on MacOS, Chrome may open system dialogs
// requesting credentials. This uses a mock keychain to avoid that
// dialog from blocking.
'--use-mock-keychain',
]
: <String>[];
final proc = await Chrome.start([uriToLaunch.toString()], args: args);
browserPid = proc.pid;
}
_emitLaunchEvent(
reused: false,
notified: false,
pid: browserPid!,
machineMode: machineMode);
return {
'reused': false,
'notified': false,
'pid': browserPid,
};
}