From 3f2e8ba838510a0afcd832f11be0e77895bee01f Mon Sep 17 00:00:00 2001 From: Srujan Gaddam <58529443+srujzs@users.noreply.github.com> Date: Mon, 16 Jun 2025 09:21:34 -0700 Subject: [PATCH] Set max request pool size for DDC module loader when in CI (#170565) Possible fix for https://github.com/flutter/flutter/issues/169574 It looks like the timeouts seem to be specific to downloading scripts. Specifically, after a certain point, we no longer download any scripts. Lowering the number of max concurrent requests seems to avoid Chrome timing out. This does a refactor as well to make sure we're piping FileSystem, Logger, and Platform into devfs_web.dart instead of relying on globals every time. This also fixes a test issue where we were always passing `isWindows: false` in some test cases instead of checking for the value. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. --- .../lib/src/isolated/devfs_web.dart | 140 +++++++------- .../lib/src/isolated/resident_web_runner.dart | 4 +- .../flutter_tools/lib/src/web/bootstrap.dart | 7 + .../general.shard/web/bootstrap_test.dart | 23 +++ .../web/devfs_web_ddc_modules_test.dart | 169 ++++++++++------- .../general.shard/web/devfs_web_test.dart | 174 +++++++++++------- 6 files changed, 315 insertions(+), 202 deletions(-) diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index e7fdea27bbd..6b2a7b8098e 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -66,6 +66,8 @@ const String _kDefaultIndex = ''' '''; +const String kLuciEnvName = 'LUCI_CONTEXT'; + /// An expression compiler connecting to FrontendServer. /// /// This is only used in development mode. @@ -132,7 +134,8 @@ class WebAssetServer implements AssetReader { this._canaryFeatures, { required this.webRenderer, required this.useLocalCanvasKit, - }) : basePath = WebTemplate.baseHref(_htmlTemplate('index.html', _kDefaultIndex)) { + required this.fileSystem, + }) : basePath = WebTemplate.baseHref(_htmlTemplate(fileSystem, 'index.html', _kDefaultIndex)) { // TODO(srujzs): Remove this assertion when the library bundle format is // supported without canary mode. if (_ddcModuleSystem) { @@ -261,6 +264,9 @@ class WebAssetServer implements AssetReader { // TODO(markzipan): Make sure this default value aligns with that in the debugger options. bool ddcModuleSystem = false, bool canaryFeatures = false, + required FileSystem fileSystem, + required Logger logger, + required Platform platform, }) async { // TODO(srujzs): Remove this assertion when the library bundle format is // supported without canary mode. @@ -289,7 +295,7 @@ class WebAssetServer implements AssetReader { break; } on SocketException catch (e, s) { if (i >= kMaxRetries) { - globals.printError('Failed to bind web development server:\n$e', stackTrace: s); + logger.printError('Failed to bind web development server:\n$e', stackTrace: s); throwToolExit('Failed to bind web development server:\n$e'); } await Future.delayed(const Duration(milliseconds: 100)); @@ -316,6 +322,7 @@ class WebAssetServer implements AssetReader { canaryFeatures, webRenderer: webRenderer, useLocalCanvasKit: useLocalCanvasKit, + fileSystem: fileSystem, ); final int selectedPort = server.selectedPort; String url = '$hostname:$selectedPort'; @@ -334,8 +341,8 @@ class WebAssetServer implements AssetReader { if (buildInfo.mode != BuildMode.debug || isWasm) { final ReleaseAssetServer releaseAssetServer = ReleaseAssetServer( entrypoint, - fileSystem: globals.fs, - platform: globals.platform, + fileSystem: fileSystem, + platform: platform, flutterRoot: Cache.flutterRoot, webBuildDirectory: getWebBuildDirectory(), basePath: server.basePath, @@ -346,7 +353,7 @@ class WebAssetServer implements AssetReader { shelf.serveRequests(httpServer!, releaseAssetServer.handle); }, (Object e, StackTrace s) { - globals.printTrace('Release asset server: error serving requests: $e:$s'); + logger.printTrace('Release asset server: error serving requests: $e:$s'); }, ); return server; @@ -358,12 +365,12 @@ class WebAssetServer implements AssetReader { // Ensure dwds is present and provide middleware to avoid trying to // load the through the isolate APIs. - final Directory directory = await _loadDwdsDirectory(globals.fs, globals.logger); + final Directory directory = await _loadDwdsDirectory(fileSystem, logger); shelf.Handler middleware(FutureOr Function(shelf.Request) innerHandler) { return (shelf.Request request) async { if (request.url.path.endsWith('dwds/src/injected/client.js')) { final Uri uri = directory.uri.resolve('src/injected/client.js'); - final String result = await globals.fs.file(uri.toFilePath()).readAsString(); + final String result = await fileSystem.file(uri.toFilePath()).readAsString(); return shelf.Response.ok( result, headers: {HttpHeaders.contentTypeHeader: 'application/javascript'}, @@ -374,7 +381,7 @@ class WebAssetServer implements AssetReader { } logging.Logger.root.level = logging.Level.ALL; - logging.Logger.root.onRecord.listen(log); + logging.Logger.root.onRecord.listen((logging.LogRecord event) => log(logger, event)); // Retrieve connected web devices. final List? devices = await globals.deviceManager?.getAllDevices(); @@ -403,7 +410,7 @@ class WebAssetServer implements AssetReader { digestProvider, BuildSettings( appEntrypoint: packageConfig.toPackageUri( - globals.fs.file(entrypoint).absolute.uri, + fileSystem.file(entrypoint).absolute.uri, ), ), packageConfigPath: buildInfo.packageConfigPath, @@ -419,7 +426,7 @@ class WebAssetServer implements AssetReader { digestProvider, BuildSettings( appEntrypoint: packageConfig.toPackageUri( - globals.fs.file(entrypoint).absolute.uri, + fileSystem.file(entrypoint).absolute.uri, ), ), packageConfigPath: buildInfo.packageConfigPath, @@ -454,7 +461,7 @@ class WebAssetServer implements AssetReader { shelf.serveRequests(httpServer!, cascade.handler); }, (Object e, StackTrace s) { - globals.printTrace('Dwds server: error serving requests: $e:$s'); + logger.printTrace('Dwds server: error serving requests: $e:$s'); }, ); server.dwds = dwds; @@ -566,8 +573,8 @@ class WebAssetServer implements AssetReader { File file = _resolveDartFile(requestPath); if (!file.existsSync() && requestPath.startsWith('canvaskit/')) { - final Directory canvasKitDirectory = globals.fs.directory( - globals.fs.path.join( + final Directory canvasKitDirectory = fileSystem.directory( + fileSystem.path.join( globals.artifacts!.getHostArtifact(HostArtifact.flutterWebSdk).path, 'canvaskit', ), @@ -575,25 +582,25 @@ class WebAssetServer implements AssetReader { final Uri potential = canvasKitDirectory.uri.resolve( requestPath.replaceFirst('canvaskit/', ''), ); - file = globals.fs.file(potential); + file = fileSystem.file(potential); } // If all of the lookups above failed, the file might have been an asset. // Try and resolve the path relative to the built asset directory. if (!file.existsSync()) { - final Uri potential = globals.fs + final Uri potential = fileSystem .directory(getAssetBuildDirectory()) .uri .resolve(requestPath.replaceFirst('assets/', '')); - file = globals.fs.file(potential); + file = fileSystem.file(potential); } if (!file.existsSync()) { - final Uri webPath = globals.fs.currentDirectory + final Uri webPath = fileSystem.currentDirectory .childDirectory('web') .uri .resolve(requestPath); - file = globals.fs.file(webPath); + file = fileSystem.file(webPath); } if (!file.existsSync()) { @@ -652,6 +659,8 @@ class WebAssetServer implements AssetReader { final bool useLocalCanvasKit; + final FileSystem fileSystem; + String get _buildConfigString { final Map buildConfig = { 'engineRevision': globals.flutterVersion.engineRevision, @@ -672,8 +681,8 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; '''; } - File get _flutterJsFile => globals.fs.file( - globals.fs.path.join( + File get _flutterJsFile => fileSystem.file( + fileSystem.path.join( globals.artifacts!.getHostArtifact(HostArtifact.flutterJsDirectory).path, 'flutter.js', ), @@ -681,6 +690,7 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; String get _flutterBootstrapJsContent { final WebTemplate bootstrapTemplate = _getWebTemplate( + fileSystem, 'flutter_bootstrap.js', generateDefaultFlutterBootstrapScript(includeServiceWorkerSettings: false), ); @@ -700,7 +710,7 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; } shelf.Response _serveIndexHtml() { - final WebTemplate indexHtml = _getWebTemplate('index.html', _kDefaultIndex); + final WebTemplate indexHtml = _getWebTemplate(fileSystem, 'index.html', _kDefaultIndex); return shelf.Response.ok( indexHtml.withSubstitutions( // Currently, we don't support --base-href for the "run" command. @@ -731,7 +741,7 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; // If this is a dart file, it must be on the local file system and is // likely coming from a source map request. The tool doesn't currently // consider the case of Dart files as assets. - final File dartFile = globals.fs.file(globals.fs.currentDirectory.uri.resolve(path)); + final File dartFile = fileSystem.file(fileSystem.currentDirectory.uri.resolve(path)); if (dartFile.existsSync()) { return dartFile; } @@ -748,7 +758,7 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; Uri(scheme: 'package', pathSegments: segments.skip(1)), ); if (filePath != null) { - final File packageFile = globals.fs.file(filePath); + final File packageFile = fileSystem.file(filePath); if (packageFile.existsSync()) { return packageFile; } @@ -757,7 +767,7 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; // Otherwise it must be a Dart SDK source or a Flutter Web SDK source. final Directory dartSdkParent = - globals.fs + fileSystem .directory( globals.artifacts!.getArtifactPath( Artifact.engineDartSdkPath, @@ -765,15 +775,15 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; ), ) .parent; - final File dartSdkFile = globals.fs.file(dartSdkParent.uri.resolve(path)); + final File dartSdkFile = fileSystem.file(dartSdkParent.uri.resolve(path)); if (dartSdkFile.existsSync()) { return dartSdkFile; } - final Directory flutterWebSdk = globals.fs.directory( + final Directory flutterWebSdk = fileSystem.directory( globals.artifacts!.getHostArtifact(HostArtifact.flutterWebSdk), ); - final File webSdkFile = globals.fs.file(flutterWebSdk.uri.resolve(path)); + final File webSdkFile = fileSystem.file(flutterWebSdk.uri.resolve(path)); return webSdkFile; } @@ -781,13 +791,13 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)}; File get _resolveDartSdkJsFile { final Map dartSdkArtifactMap = _ddcModuleSystem ? kDdcLibraryBundleDartSdkJsArtifactMap : kAmdDartSdkJsArtifactMap; - return globals.fs.file(globals.artifacts!.getHostArtifact(dartSdkArtifactMap[webRenderer]!)); + return fileSystem.file(globals.artifacts!.getHostArtifact(dartSdkArtifactMap[webRenderer]!)); } File get _resolveDartSdkJsMapFile { final Map dartSdkArtifactMap = _ddcModuleSystem ? kDdcLibraryBundleDartSdkJsMapArtifactMap : kAmdDartSdkJsMapArtifactMap; - return globals.fs.file(globals.artifacts!.getHostArtifact(dartSdkArtifactMap[webRenderer]!)); + return fileSystem.file(globals.artifacts!.getHostArtifact(dartSdkArtifactMap[webRenderer]!)); } @override @@ -867,7 +877,9 @@ class WebDevFS implements DevFS { required this.isWasm, required this.useLocalCanvasKit, required this.rootDirectory, - required this.isWindows, + required this.fileSystem, + required this.logger, + required this.platform, this.testMode = false, }) : _port = port { // TODO(srujzs): Remove this assertion when the library bundle format is @@ -900,7 +912,9 @@ class WebDevFS implements DevFS { final WebRendererMode webRenderer; final bool isWasm; final bool useLocalCanvasKit; - final bool isWindows; + final FileSystem fileSystem; + final Logger logger; + final Platform platform; late WebAssetServer webAssetServer; @@ -943,7 +957,7 @@ class WebDevFS implements DevFS { foundFirstConnection = true; final vm_service.VmService vmService = await vmServiceFactory( Uri.parse(debugConnection.uri), - logger: globals.logger, + logger: logger, ); firstConnection.complete(ConnectionResult(appConnection, debugConnection, vmService)); } @@ -954,7 +968,7 @@ class WebDevFS implements DevFS { } }, onError: (Object error, StackTrace stackTrace) { - globals.printError('Unknown error while waiting for debug connection:$error\n$stackTrace'); + logger.printError('Unknown error while waiting for debug connection:$error\n$stackTrace'); if (!firstConnection.isCompleted) { firstConnection.completeError(error, stackTrace); } @@ -1003,6 +1017,9 @@ class WebDevFS implements DevFS { testMode: testMode, ddcModuleSystem: ddcModuleSystem, canaryFeatures: canaryFeatures, + fileSystem: fileSystem, + logger: logger, + platform: platform, ); return baseUri!; } @@ -1025,16 +1042,14 @@ class WebDevFS implements DevFS { final Directory rootDirectory; Future _validateTemplateFile(String filename) async { - final File file = globals.fs.currentDirectory.childDirectory('web').childFile(filename); + final File file = fileSystem.currentDirectory.childDirectory('web').childFile(filename); if (!await file.exists()) { return; } final WebTemplate template = WebTemplate(await file.readAsString()); for (final WebTemplateWarning warning in template.getWarnings()) { - globals.logger.printWarning( - 'Warning: In $filename:${warning.lineNumber}: ${warning.warningText}', - ); + logger.printWarning('Warning: In $filename:${warning.lineNumber}: ${warning.warningText}'); } } @@ -1058,13 +1073,13 @@ class WebDevFS implements DevFS { File? dartPluginRegistrant, }) async { lastPackageConfig = packageConfig; - final File mainFile = globals.fs.file(mainUri); + final File mainFile = fileSystem.file(mainUri); final String outputDirectoryPath = mainFile.parent.path; if (bundleFirstUpload) { - webAssetServer.entrypointCacheDirectory = globals.fs.directory(outputDirectoryPath); + webAssetServer.entrypointCacheDirectory = fileSystem.directory(outputDirectoryPath); generator.addFileSystemRoot(outputDirectoryPath); - final String entrypoint = globals.fs.path.basename(mainFile.path); + final String entrypoint = fileSystem.path.basename(mainFile.path); webAssetServer.writeBytes(entrypoint, mainFile.readAsBytesSync()); if (ddcModuleSystem) { webAssetServer.writeBytes('ddc_module_loader.js', ddcModuleLoaderJS.readAsBytesSync()); @@ -1087,7 +1102,7 @@ class WebDevFS implements DevFS { ddcModuleLoaderUrl: 'ddc_module_loader.js', mapperUrl: 'stack_trace_mapper.js', generateLoadingIndicator: enableDwds, - isWindows: isWindows, + isWindows: platform.isWindows, ) : generateBootstrapScript( requireUrl: 'require.js', @@ -1106,6 +1121,7 @@ class WebDevFS implements DevFS { entrypoint: entrypoint, nativeNullAssertions: nativeNullAssertions, onLoadEndBootstrap: onLoadEndBootstrap, + isCi: platform.environment.containsKey(kLuciEnvName), ) : generateMainModule( entrypoint: entrypoint, @@ -1117,14 +1133,14 @@ class WebDevFS implements DevFS { // be shared. if (bundle != null) { await writeBundle( - globals.fs.directory(getAssetBuildDirectory()), + fileSystem.directory(getAssetBuildDirectory()), bundle.entries, targetPlatform: TargetPlatform.web_javascript, impellerStatus: ImpellerStatus.disabled, processManager: globals.processManager, - fileSystem: globals.fs, + fileSystem: fileSystem, artifacts: globals.artifacts!, - logger: globals.logger, + logger: logger, projectDir: rootDirectory, buildMode: buildInfo.mode, ); @@ -1147,7 +1163,7 @@ class WebDevFS implements DevFS { outputPath: dillOutputPath, packageConfig: packageConfig, projectRootPath: projectRootPath, - fs: globals.fs, + fs: fileSystem, dartPluginRegistrant: dartPluginRegistrant, recompileRestart: fullRestart, ); @@ -1172,7 +1188,7 @@ class WebDevFS implements DevFS { File metadataFile; late List modules; try { - final Directory parentDirectory = globals.fs.directory(outputDirectoryPath); + final Directory parentDirectory = fileSystem.directory(outputDirectoryPath); codeFile = parentDirectory.childFile('${compilerOutput.outputFilename}.sources'); manifestFile = parentDirectory.childFile('${compilerOutput.outputFilename}.json'); sourcemapFile = parentDirectory.childFile('${compilerOutput.outputFilename}.map'); @@ -1202,8 +1218,8 @@ class WebDevFS implements DevFS { } @visibleForTesting - final File requireJS = globals.fs.file( - globals.fs.path.join( + File get requireJS => fileSystem.file( + fileSystem.path.join( globals.artifacts!.getArtifactPath( Artifact.engineDartSdkPath, platform: TargetPlatform.web_javascript, @@ -1216,8 +1232,8 @@ class WebDevFS implements DevFS { ); @visibleForTesting - final File ddcModuleLoaderJS = globals.fs.file( - globals.fs.path.join( + File get ddcModuleLoaderJS => fileSystem.file( + fileSystem.path.join( globals.artifacts!.getArtifactPath( Artifact.engineDartSdkPath, platform: TargetPlatform.web_javascript, @@ -1230,16 +1246,16 @@ class WebDevFS implements DevFS { ); @visibleForTesting - final File flutterJs = globals.fs.file( - globals.fs.path.join( + File get flutterJs => fileSystem.file( + fileSystem.path.join( globals.artifacts!.getHostArtifact(HostArtifact.flutterJsDirectory).path, 'flutter.js', ), ); @visibleForTesting - final File stackTraceMapper = globals.fs.file( - globals.fs.path.join( + File get stackTraceMapper => fileSystem.file( + fileSystem.path.join( globals.artifacts!.getArtifactPath( Artifact.engineDartSdkPath, platform: TargetPlatform.web_javascript, @@ -1355,19 +1371,19 @@ class ReleaseAssetServer { } @visibleForTesting -void log(logging.LogRecord event) { +void log(Logger logger, logging.LogRecord event) { final String error = event.error == null ? '' : 'Error: ${event.error}'; if (event.level >= logging.Level.SEVERE) { - globals.printError('${event.loggerName}: ${event.message}$error', stackTrace: event.stackTrace); + logger.printError('${event.loggerName}: ${event.message}$error', stackTrace: event.stackTrace); } else if (event.level == logging.Level.WARNING) { // Temporary fix for https://github.com/flutter/flutter/issues/109792 // TODO(annagrin): Remove the condition after the bogus warning is // removed in dwds: https://github.com/dart-lang/webdev/issues/1722 if (!event.message.contains('No module for')) { - globals.printWarning('${event.loggerName}: ${event.message}$error'); + logger.printWarning('${event.loggerName}: ${event.message}$error'); } } else { - globals.printTrace('${event.loggerName}: ${event.message}$error'); + logger.printTrace('${event.loggerName}: ${event.message}$error'); } } @@ -1387,12 +1403,12 @@ String? _stripBasePath(String path, String basePath) { return stripLeadingSlash(path); } -WebTemplate _getWebTemplate(String filename, String fallbackContent) { - final String htmlContent = _htmlTemplate(filename, fallbackContent); +WebTemplate _getWebTemplate(FileSystem fileSystem, String filename, String fallbackContent) { + final String htmlContent = _htmlTemplate(fileSystem, filename, fallbackContent); return WebTemplate(htmlContent); } -String _htmlTemplate(String filename, String fallbackContent) { - final File template = globals.fs.currentDirectory.childDirectory('web').childFile(filename); +String _htmlTemplate(FileSystem fileSystem, String filename, String fallbackContent) { + final File template = fileSystem.currentDirectory.childDirectory('web').childFile(filename); return template.existsSync() ? template.readAsStringSync() : fallbackContent; } diff --git a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart index 269d0b8d6ca..2e5d116bf88 100644 --- a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart @@ -327,7 +327,9 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive). isWasm: debuggingOptions.webUseWasm, useLocalCanvasKit: debuggingOptions.buildInfo.useLocalCanvasKit, rootDirectory: fileSystem.directory(projectRootPath), - isWindows: _platform.isWindows, + fileSystem: fileSystem, + logger: logger, + platform: _platform, ); Uri url = await device!.devFS!.create(); if (debuggingOptions.tlsCertKeyPath != null && debuggingOptions.tlsCertPath != null) { diff --git a/packages/flutter_tools/lib/src/web/bootstrap.dart b/packages/flutter_tools/lib/src/web/bootstrap.dart index 4d609c0e0de..be354c83b11 100644 --- a/packages/flutter_tools/lib/src/web/bootstrap.dart +++ b/packages/flutter_tools/lib/src/web/bootstrap.dart @@ -463,7 +463,13 @@ String generateDDCLibraryBundleMainModule({ required String entrypoint, required bool nativeNullAssertions, required String onLoadEndBootstrap, + required bool isCi, }) { + // Chrome in CI seems to hang when there are too many requests at once, so we + // limit the max number of script requests for that environment. + // https://github.com/flutter/flutter/issues/169574 + final String setMaxRequests = + isCi ? r'window.$dartLoader.loadConfig.maxRequestPoolSize = 100;' : ''; // The typo below in "EXTENTION" is load-bearing, package:build depends on it. return ''' /* ENTRYPOINT_EXTENTION_MARKER */ @@ -473,6 +479,7 @@ String generateDDCLibraryBundleMainModule({ dartDevEmbedder.debugger.registerDevtoolsFormatter(); + $setMaxRequests // Set up a final script that lets us know when all scripts have been loaded. // Only then can we call the main method. let onLoadEndSrc = '$onLoadEndBootstrap'; diff --git a/packages/flutter_tools/test/general.shard/web/bootstrap_test.dart b/packages/flutter_tools/test/general.shard/web/bootstrap_test.dart index 8c67e871846..0663d17ab58 100644 --- a/packages/flutter_tools/test/general.shard/web/bootstrap_test.dart +++ b/packages/flutter_tools/test/general.shard/web/bootstrap_test.dart @@ -264,6 +264,7 @@ void main() { entrypoint: 'main.js', nativeNullAssertions: false, onLoadEndBootstrap: 'on_load_end_bootstrap.js', + isCi: true, ); // bootstrap main module has correct defined module. expect(result, contains('let appName = "org-dartlang-app:/main.js";')); @@ -275,6 +276,7 @@ void main() { entrypoint: 'main.js', nativeNullAssertions: true, onLoadEndBootstrap: 'on_load_end_bootstrap.js', + isCi: true, ); expect(result, contains('nativeNonNullAsserts: true')); @@ -285,11 +287,32 @@ void main() { entrypoint: 'main.js', nativeNullAssertions: false, onLoadEndBootstrap: 'on_load_end_bootstrap.js', + isCi: true, ); expect(result, contains('nativeNonNullAsserts: false')); }); + test('generateDDCLibraryBundleMainModule sets max requests when isCi only', () { + String result = generateDDCLibraryBundleMainModule( + entrypoint: 'main.js', + nativeNullAssertions: false, + onLoadEndBootstrap: 'on_load_end_bootstrap.js', + isCi: true, + ); + + expect(result, contains('maxRequestPoolSize =')); + + result = generateDDCLibraryBundleMainModule( + entrypoint: 'main.js', + nativeNullAssertions: false, + onLoadEndBootstrap: 'on_load_end_bootstrap.js', + isCi: false, + ); + + expect(result, isNot(contains('maxRequestPoolSize ='))); + }); + test('generateTestBootstrapFileContents embeds urls correctly', () { final String result = generateTestBootstrapFileContents( 'foo.dart.js', diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_ddc_modules_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_ddc_modules_test.dart index 9ae915179a3..d03693cc500 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_ddc_modules_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_ddc_modules_test.dart @@ -76,6 +76,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); releaseAssetServer = ReleaseAssetServer( globals.fs.file('main.dart').uri, @@ -108,7 +109,8 @@ void main() { logging.LogRecord(logging.Level.WARNING, otherMessage, 'DartUri'), ]; - events.forEach(log); + void logWithLogger(logging.LogRecord event) => log(logger, event); + events.forEach(logWithLogger); expect(logger.warningText, contains(unresolvedUriMessage)); expect(logger.warningText, contains(otherMessage)); }); @@ -321,6 +323,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); expect(webAssetServer.basePath, 'foo/bar'); @@ -341,6 +344,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); // Defaults to "/" when there's no base element. @@ -364,6 +368,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ), throwsToolExit(), ); @@ -386,6 +391,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ), throwsToolExit(), ); @@ -810,7 +816,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.ddcModuleLoaderJS.createSync(recursive: true); webDevFS.flutterJs.createSync(recursive: true); @@ -920,7 +928,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.ddcModuleLoaderJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -994,7 +1004,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.ddcModuleLoaderJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1043,7 +1055,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.ddcModuleLoaderJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1093,7 +1107,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.ddcModuleLoaderJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1106,72 +1122,84 @@ void main() { await webDevFS.destroy(); }, overrides: {Artifacts: Artifacts.test}); - test('allows frame embedding', () async { - final WebAssetServer webAssetServer = await WebAssetServer.start( - null, - 'localhost', - 0, - null, - null, - null, - true, - true, - true, - const BuildInfo( - BuildMode.debug, - '', - treeShakeIcons: false, - packageConfigPath: '.dart_tool/package_config.json', - ), - false, - false, - Uri.base, - null, - const {}, - webRenderer: WebRendererMode.canvaskit, - isWasm: false, - useLocalCanvasKit: false, - testMode: true, - ); + test( + 'allows frame embedding', + () => testbed.run(() async { + final WebAssetServer webAssetServer = await WebAssetServer.start( + null, + 'localhost', + 0, + null, + null, + null, + true, + true, + true, + const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + packageConfigPath: '.dart_tool/package_config.json', + ), + false, + false, + Uri.base, + null, + const {}, + webRenderer: WebRendererMode.canvaskit, + isWasm: false, + useLocalCanvasKit: false, + testMode: true, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, + ); - expect(webAssetServer.defaultResponseHeaders['x-frame-options'], null); - await webAssetServer.dispose(); - }); + expect(webAssetServer.defaultResponseHeaders['x-frame-options'], null); + await webAssetServer.dispose(); + }, overrides: {Artifacts: () => Artifacts.test()}), + ); - test('passes on extra headers', () async { - const String extraHeaderKey = 'hurray'; - const String extraHeaderValue = 'flutter'; - final WebAssetServer webAssetServer = await WebAssetServer.start( - null, - 'localhost', - 0, - null, - null, - null, - true, - true, - true, - const BuildInfo( - BuildMode.debug, - '', - treeShakeIcons: false, - packageConfigPath: '.dart_tool/package_config.json', - ), - false, - false, - Uri.base, - null, - const {extraHeaderKey: extraHeaderValue}, - webRenderer: WebRendererMode.canvaskit, - isWasm: false, - useLocalCanvasKit: false, - testMode: true, - ); + test( + 'passes on extra headers', + () => testbed.run(() async { + const String extraHeaderKey = 'hurray'; + const String extraHeaderValue = 'flutter'; + final WebAssetServer webAssetServer = await WebAssetServer.start( + null, + 'localhost', + 0, + null, + null, + null, + true, + true, + true, + const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + packageConfigPath: '.dart_tool/package_config.json', + ), + false, + false, + Uri.base, + null, + const {extraHeaderKey: extraHeaderValue}, + webRenderer: WebRendererMode.canvaskit, + isWasm: false, + useLocalCanvasKit: false, + testMode: true, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, + ); - expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], [extraHeaderValue]); + expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], [extraHeaderValue]); - await webAssetServer.dispose(); - }); + await webAssetServer.dispose(); + }, overrides: {Artifacts: () => Artifacts.test()}), + ); runInTestbed('WebAssetServer responds to POST requests with 404 not found', () async { final Response response = await webAssetServer.handleRequest( @@ -1203,6 +1231,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); expect(await webAssetServer.metadataContents('foo/main_module.ddc_merged_metadata'), null); @@ -1253,7 +1282,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.ddcModuleLoaderJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index 1707abe952d..26fcec623be 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -75,6 +75,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); releaseAssetServer = ReleaseAssetServer( globals.fs.file('main.dart').uri, @@ -100,7 +101,8 @@ void main() { logging.LogRecord(logging.Level.WARNING, otherMessage, 'DartUri'), ]; - events.forEach(log); + void logWithLogger(logging.LogRecord event) => log(logger, event); + events.forEach(logWithLogger); expect(logger.warningText, contains(unresolvedUriMessage)); expect(logger.warningText, contains(otherMessage)); }), @@ -342,6 +344,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); expect(webAssetServer.basePath, 'foo/bar'); @@ -365,6 +368,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); // Defaults to "/" when there's no base element. @@ -391,6 +395,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ), throwsToolExit(), ); @@ -416,6 +421,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ), throwsToolExit(), ); @@ -488,6 +494,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: true, + fileSystem: globals.fs, ); final Response response = await webAssetServer.handleRequest( @@ -930,7 +937,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.flutterJs.createSync(recursive: true); @@ -1038,7 +1047,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.flutterJs.createSync(recursive: true); @@ -1152,7 +1163,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1229,7 +1242,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1281,7 +1296,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1334,7 +1351,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true); @@ -1348,72 +1367,84 @@ void main() { }, overrides: {Artifacts: () => Artifacts.test()}), ); - test('allows frame embedding', () async { - final WebAssetServer webAssetServer = await WebAssetServer.start( - null, - 'localhost', - 0, - null, - null, - null, - true, - true, - true, - const BuildInfo( - BuildMode.debug, - '', - treeShakeIcons: false, - packageConfigPath: '.dart_tool/package_config.json', - ), - false, - false, - Uri.base, - null, - const {}, - webRenderer: WebRendererMode.canvaskit, - isWasm: false, - useLocalCanvasKit: false, - testMode: true, - ); + test( + 'allows frame embedding', + () => testbed.run(() async { + final WebAssetServer webAssetServer = await WebAssetServer.start( + null, + 'localhost', + 0, + null, + null, + null, + true, + true, + true, + const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + packageConfigPath: '.dart_tool/package_config.json', + ), + false, + false, + Uri.base, + null, + const {}, + webRenderer: WebRendererMode.canvaskit, + isWasm: false, + useLocalCanvasKit: false, + testMode: true, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, + ); - expect(webAssetServer.defaultResponseHeaders['x-frame-options'], null); - await webAssetServer.dispose(); - }); + expect(webAssetServer.defaultResponseHeaders['x-frame-options'], null); + await webAssetServer.dispose(); + }, overrides: {Artifacts: () => Artifacts.test()}), + ); - test('passes on extra headers', () async { - const String extraHeaderKey = 'hurray'; - const String extraHeaderValue = 'flutter'; - final WebAssetServer webAssetServer = await WebAssetServer.start( - null, - 'localhost', - 0, - null, - null, - null, - true, - true, - true, - const BuildInfo( - BuildMode.debug, - '', - treeShakeIcons: false, - packageConfigPath: '.dart_tool/package_config.json', - ), - false, - false, - Uri.base, - null, - const {extraHeaderKey: extraHeaderValue}, - webRenderer: WebRendererMode.canvaskit, - isWasm: false, - useLocalCanvasKit: false, - testMode: true, - ); + test( + 'passes on extra headers', + () => testbed.run(() async { + const String extraHeaderKey = 'hurray'; + const String extraHeaderValue = 'flutter'; + final WebAssetServer webAssetServer = await WebAssetServer.start( + null, + 'localhost', + 0, + null, + null, + null, + true, + true, + true, + const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + packageConfigPath: '.dart_tool/package_config.json', + ), + false, + false, + Uri.base, + null, + const {extraHeaderKey: extraHeaderValue}, + webRenderer: WebRendererMode.canvaskit, + isWasm: false, + useLocalCanvasKit: false, + testMode: true, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, + ); - expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], [extraHeaderValue]); + expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], [extraHeaderValue]); - await webAssetServer.dispose(); - }); + await webAssetServer.dispose(); + }, overrides: {Artifacts: () => Artifacts.test()}), + ); test( 'WebAssetServer responds to POST requests with 404 not found', @@ -1453,6 +1484,7 @@ void main() { canaryFeatures, webRenderer: WebRendererMode.canvaskit, useLocalCanvasKit: false, + fileSystem: globals.fs, ); expect(await webAssetServer.metadataContents('foo/main_module.ddc_merged_metadata'), null); @@ -1504,7 +1536,9 @@ void main() { isWasm: false, useLocalCanvasKit: false, rootDirectory: globals.fs.currentDirectory, - isWindows: false, + fileSystem: globals.fs, + logger: globals.logger, + platform: globals.platform, ); webDevFS.requireJS.createSync(recursive: true); webDevFS.stackTraceMapper.createSync(recursive: true);