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.
This commit is contained in:
Srujan Gaddam 2025-06-16 09:21:34 -07:00 committed by GitHub
parent fb42702f65
commit 3f2e8ba838
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 315 additions and 202 deletions

View File

@ -66,6 +66,8 @@ const String _kDefaultIndex = '''
</html>
''';
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<void>.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<shelf.Response> 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: <String, String>{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<Device>? 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<String, dynamic> buildConfig = <String, dynamic>{
'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<WebRendererMode, HostArtifact> 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<WebRendererMode, HostArtifact> 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<void> _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<String> 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;
}

View File

@ -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) {

View File

@ -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';

View File

@ -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',

View File

@ -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: <Type, Generator>{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 <String, String>{},
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 <String, String>{},
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: <Type, Generator>{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 <String, String>{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 <String, String>{extraHeaderKey: extraHeaderValue},
webRenderer: WebRendererMode.canvaskit,
isWasm: false,
useLocalCanvasKit: false,
testMode: true,
fileSystem: globals.fs,
logger: globals.logger,
platform: globals.platform,
);
expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], <String>[extraHeaderValue]);
expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], <String>[extraHeaderValue]);
await webAssetServer.dispose();
});
await webAssetServer.dispose();
}, overrides: <Type, Generator>{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);

View File

@ -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: <Type, Generator>{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 <String, String>{},
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 <String, String>{},
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: <Type, Generator>{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 <String, String>{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 <String, String>{extraHeaderKey: extraHeaderValue},
webRenderer: WebRendererMode.canvaskit,
isWasm: false,
useLocalCanvasKit: false,
testMode: true,
fileSystem: globals.fs,
logger: globals.logger,
platform: globals.platform,
);
expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], <String>[extraHeaderValue]);
expect(webAssetServer.defaultResponseHeaders[extraHeaderKey], <String>[extraHeaderValue]);
await webAssetServer.dispose();
});
await webAssetServer.dispose();
}, overrides: <Type, Generator>{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);