diff --git a/packages/flutter_tools/lib/src/web/chrome.dart b/packages/flutter_tools/lib/src/web/chrome.dart index 710f5048b57..3314a803fcc 100644 --- a/packages/flutter_tools/lib/src/web/chrome.dart +++ b/packages/flutter_tools/lib/src/web/chrome.dart @@ -4,6 +4,7 @@ import 'dart:async'; +import 'package:collection/collection.dart'; import 'package:meta/meta.dart'; import 'package:process/process.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart' hide StackTrace; @@ -145,6 +146,31 @@ class ChromiumLauncher { /// The executable this launcher will use. String findExecutable() => _browserFinder(_platform, _fileSystem); + /// Creates a user data directory for Chrome based on provided flags or creates a temporary one. + /// + /// This method handles the creation of Chrome's user data directory in two ways: + /// 1. If webBrowserFlags contains a --user-data-dir flag, it uses that directory + /// 2. Otherwise, it creates a temporary directory in the system's temp location + /// + /// The user data directory is where Chrome stores user preferences, cookies, + /// and other session data. Using a temporary directory ensures a clean state + /// for each launch, while allowing custom directories through flags for + /// persistent configurations. + Directory _createUserDataDirectory(List webBrowserFlags) { + if (webBrowserFlags.isNotEmpty) { + final String? userDataDirFlag = webBrowserFlags.firstWhereOrNull( + (String flag) => flag.startsWith('--user-data-dir='), + ); + + if (userDataDirFlag != null) { + final Directory userDataDir = _fileSystem.directory(userDataDirFlag.split('=')[1]); + webBrowserFlags.remove(userDataDirFlag); + return userDataDir; + } + } + return _fileSystem.systemTempDirectory.createTempSync('flutter_tools_chrome_device.'); + } + /// Launch a Chromium browser to a particular `host` page. /// /// [headless] defaults to false, and controls whether we open a headless or @@ -189,9 +215,7 @@ class ChromiumLauncher { } } - final Directory userDataDir = _fileSystem.systemTempDirectory.createTempSync( - 'flutter_tools_chrome_device.', - ); + final Directory userDataDir = _createUserDataDirectory(webBrowserFlags); if (cacheDir != null) { // Seed data dir with previous state. diff --git a/packages/flutter_tools/test/web.shard/chrome_test.dart b/packages/flutter_tools/test/web.shard/chrome_test.dart index c1a5a871be9..12ed6bed7c1 100644 --- a/packages/flutter_tools/test/web.shard/chrome_test.dart +++ b/packages/flutter_tools/test/web.shard/chrome_test.dart @@ -931,6 +931,30 @@ void main() { await chrome.close(); }, ); + + testWithoutContext('respects custom user data directory flag', () async { + const String customUserDataDir = '/custom/chrome/data/dir'; + processManager.addCommand( + const FakeCommand( + command: [ + 'example_chrome', + '--user-data-dir=$customUserDataDir', + '--remote-debugging-port=12345', + ...kChromeArgs, + 'example_url', + ], + stderr: kDevtoolsStderr, + ), + ); + + await expectReturnsNormallyLater( + chromeLauncher.launch( + 'example_url', + skipCheck: true, + webBrowserFlags: ['--user-data-dir=$customUserDataDir'], + ), + ); + }); } /// Fake chrome connection that fails to get tabs a few times.