[web] Cleanup everything HTML from the flutter tool and test harness (#162836)

- Delete code paths that handle screenshots for the HTML renderer
- Delete artifact enums for the HTML/AUTO renderers (and all their
usages).
- Remove HTML/AUTO renderers warnings.
- Delete the HTML/AUTO renderer enums (and all their usages).
- Delete tests for all the above.
This commit is contained in:
Mouad Debbar 2025-02-13 15:53:37 -05:00 committed by GitHub
parent 4e6e24f729
commit 5fa05ab6df
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 45 additions and 611 deletions

View File

@ -59,69 +59,37 @@ class MatchesGoldenFile extends AsyncMatcher {
return 'matched too many widgets';
}
final Element element = elements.single;
final RenderObject renderObject = _findRepaintBoundary(element);
final Size size = renderObject.paintBounds.size;
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.instance;
final ui.FlutterView view = binding.platformDispatcher.implicitView!;
final RenderView renderView = binding.renderViews.firstWhere(
(RenderView r) => r.flutterView == view,
);
if (isSkiaWeb) {
// In CanvasKit and Skwasm, use Layer.toImage to generate the screenshot.
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.instance;
return binding.runAsync<String?>(() async {
assert(element.renderObject != null);
RenderObject renderObject = element.renderObject!;
while (!renderObject.isRepaintBoundary) {
renderObject = renderObject.parent!;
// In CanvasKit and Skwasm, use Layer.toImage to generate the screenshot.
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.instance;
return binding.runAsync<String?>(() async {
assert(element.renderObject != null);
RenderObject renderObject = element.renderObject!;
while (!renderObject.isRepaintBoundary) {
renderObject = renderObject.parent!;
}
assert(!renderObject.debugNeedsPaint);
final OffsetLayer layer = renderObject.debugLayer! as OffsetLayer;
final ui.Image image = await layer.toImage(renderObject.paintBounds);
try {
final ByteData? bytes = await image.toByteData(format: ui.ImageByteFormat.png);
if (bytes == null) {
return 'could not encode screenshot.';
}
assert(!renderObject.debugNeedsPaint);
final OffsetLayer layer = renderObject.debugLayer! as OffsetLayer;
final ui.Image image = await layer.toImage(renderObject.paintBounds);
try {
final ByteData? bytes = await image.toByteData(format: ui.ImageByteFormat.png);
if (bytes == null) {
return 'could not encode screenshot.';
}
if (autoUpdateGoldenFiles) {
await goldenFileComparator.update(key, bytes.buffer.asUint8List());
return null;
}
try {
final bool success = await goldenFileComparator.compare(
bytes.buffer.asUint8List(),
key,
);
return success ? null : 'does not match';
} on TestFailure catch (ex) {
return ex.message;
}
} finally {
image.dispose();
}
});
} else {
// In the HTML renderer, we don't have the ability to render an element
// to an image directly. Instead, we will use `window.render()` to render
// only the element being requested, and send a request to the test server
// requesting it to take a screenshot through the browser's debug interface.
_renderElement(view, renderObject);
final String? result = await binding.runAsync<String?>(() async {
if (autoUpdateGoldenFiles) {
await webGoldenComparator.update(size.width, size.height, key);
await goldenFileComparator.update(key, bytes.buffer.asUint8List());
return null;
}
try {
final bool success = await webGoldenComparator.compare(size.width, size.height, key);
final bool success = await goldenFileComparator.compare(bytes.buffer.asUint8List(), key);
return success ? null : 'does not match';
} on TestFailure catch (ex) {
return ex.message;
}
});
_renderElement(view, renderView);
return result;
}
} finally {
image.dispose();
}
});
}
@override
@ -130,27 +98,3 @@ class MatchesGoldenFile extends AsyncMatcher {
return description.add('one widget whose rasterized image matches golden image "$testNameUri"');
}
}
RenderObject _findRepaintBoundary(Element element) {
assert(element.renderObject != null);
RenderObject renderObject = element.renderObject!;
while (!renderObject.isRepaintBoundary) {
renderObject = renderObject.parent!;
}
return renderObject;
}
void _renderElement(ui.FlutterView window, RenderObject renderObject) {
assert(renderObject.debugLayer != null);
final Layer layer = renderObject.debugLayer!;
final ui.SceneBuilder sceneBuilder = ui.SceneBuilder();
if (layer is OffsetLayer) {
sceneBuilder.pushOffset(-layer.offset.dx, -layer.offset.dy);
}
// ignore: invalid_use_of_visible_for_testing_member, invalid_use_of_protected_member
layer.updateSubtreeNeedsAddToScene();
// ignore: invalid_use_of_protected_member
layer.addToScene(sceneBuilder);
sceneBuilder.pop();
window.render(sceneBuilder.build());
}

View File

@ -103,21 +103,14 @@ enum HostArtifact {
/// The precompiled SDKs and sourcemaps for web debug builds with the AMD module system.
// TODO(markzipan): delete these when DDC's AMD module system is deprecated, https://github.com/flutter/flutter/issues/142060.
webPrecompiledAmdSdk,
webPrecompiledAmdSdkSourcemaps,
webPrecompiledAmdCanvaskitSdk,
webPrecompiledAmdCanvaskitSdkSourcemaps,
webPrecompiledAmdCanvaskitAndHtmlSdk,
webPrecompiledAmdCanvaskitAndHtmlSdkSourcemaps,
/// The precompiled SDKs and sourcemaps for web debug builds with the DDC
/// library bundle module system.
webPrecompiledDdcLibraryBundleSdk,
webPrecompiledDdcLibraryBundleSdkSourcemaps,
/// library bundle module system. Only SDKs built with sound null-safety are
/// provided here.
webPrecompiledDdcLibraryBundleCanvaskitSdk,
webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps,
webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk,
webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdkSourcemaps,
iosDeploy,
idevicesyslog,
@ -263,19 +256,11 @@ String _hostArtifactToFileName(HostArtifact artifact, Platform platform) {
return 'dart2js_platform.dill';
case HostArtifact.flutterWebLibrariesJson:
return 'libraries.json';
case HostArtifact.webPrecompiledAmdSdk:
case HostArtifact.webPrecompiledAmdCanvaskitSdk:
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk:
return 'dart_sdk.js';
case HostArtifact.webPrecompiledAmdSdkSourcemaps:
case HostArtifact.webPrecompiledAmdCanvaskitSdkSourcemaps:
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdkSourcemaps:
case HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdkSourcemaps:
return 'dart_sdk.js.map';
case HostArtifact.impellerc:
return 'impellerc$exe';
@ -459,15 +444,6 @@ class CachedArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdSdk:
case HostArtifact.webPrecompiledAmdSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'amd',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdCanvaskitSdk:
case HostArtifact.webPrecompiledAmdCanvaskitSdkSourcemaps:
final String path = _fileSystem.path.join(
@ -477,24 +453,6 @@ class CachedArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'amd-canvaskit-html',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'ddcLibraryBundle',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps:
final String path = _fileSystem.path.join(
@ -504,15 +462,6 @@ class CachedArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'ddcLibraryBundle-canvaskit-html',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.idevicesyslog:
case HostArtifact.idevicescreenshot:
final String artifactFileName = _hostArtifactToFileName(artifact, _platform);
@ -1162,15 +1111,6 @@ class CachedLocalEngineArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdSdk:
case HostArtifact.webPrecompiledAmdSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'amd',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdCanvaskitSdk:
case HostArtifact.webPrecompiledAmdCanvaskitSdkSourcemaps:
final String path = _fileSystem.path.join(
@ -1180,24 +1120,6 @@ class CachedLocalEngineArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'amd-canvaskit-html',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'ddcLibraryBundle',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps:
final String path = _fileSystem.path.join(
@ -1207,15 +1129,6 @@ class CachedLocalEngineArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'ddcLibraryBundle-canvaskit-html',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.idevicesyslog:
case HostArtifact.idevicescreenshot:
final String artifactFileName = _hostArtifactToFileName(artifact, _platform);
@ -1569,15 +1482,6 @@ class CachedLocalWebSdkArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdSdk:
case HostArtifact.webPrecompiledAmdSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'amd',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdCanvaskitSdk:
case HostArtifact.webPrecompiledAmdCanvaskitSdkSourcemaps:
final String path = _fileSystem.path.join(
@ -1587,24 +1491,6 @@ class CachedLocalWebSdkArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'amd-canvaskit-html',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'ddcLibraryBundle',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps:
final String path = _fileSystem.path.join(
@ -1614,15 +1500,6 @@ class CachedLocalWebSdkArtifacts implements Artifacts {
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk:
case HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdkSourcemaps:
final String path = _fileSystem.path.join(
_getFlutterWebSdkPath(),
'kernel',
'ddcLibraryBundle-canvaskit-html',
_hostArtifactToFileName(artifact, _platform),
);
return _fileSystem.file(path);
case HostArtifact.iosDeploy:
case HostArtifact.idevicesyslog:
case HostArtifact.idevicescreenshot:

View File

@ -169,9 +169,6 @@ class BuildWebCommand extends BuildSubCommand {
final bool sourceMaps = boolArg('source-maps');
final List<WebCompilerConfig> compilerConfigs;
if (webRenderer.isDeprecated) {
globals.logger.printWarning(webRenderer.deprecationWarning);
}
if (useWasm) {
if (webRenderer != WebRendererMode.getDefault(useWasm: true)) {

View File

@ -672,10 +672,6 @@ class RunCommand extends RunCommandBase {
throwToolExit('--wasm is only supported on the web platform');
}
if (webRenderer.isDeprecated) {
globals.logger.printWarning(webRenderer.deprecationWarning);
}
if (webRenderer == WebRendererMode.skwasm && !useWasm) {
throwToolExit('Skwasm renderer requires --wasm');
}

View File

@ -592,10 +592,6 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
throwToolExit('Skwasm renderer requires --wasm');
}
if (webRenderer.isDeprecated) {
globals.logger.printWarning(webRenderer.deprecationWarning);
}
Device? integrationTestDevice;
if (_isIntegrationTest) {
integrationTestDevice = await findTargetDevice();

View File

@ -17,7 +17,6 @@ import 'package:shelf_web_socket/shelf_web_socket.dart';
import 'package:stream_channel/stream_channel.dart';
import 'package:test_core/src/platform.dart'; // ignore: implementation_imports
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart' hide StackTrace;
import '../artifacts.dart';
import '../base/common.dart';
@ -451,49 +450,12 @@ class FlutterWebPlatform extends PlatformPlugin {
json.decode(await request.readAsString()) as Map<String, Object?>;
final Uri goldenKey = Uri.parse(body['key']! as String);
final Uri testUri = Uri.parse(body['testUri']! as String);
final num? width = body['width'] as num?;
final num? height = body['height'] as num?;
Uint8List bytes;
if (body.containsKey('bytes')) {
bytes = base64.decode(body['bytes']! as String);
} else {
// TODO(hterkelsen): Do not use browser screenshots for testing on the
// web once we transition off the HTML renderer. See:
// https://github.com/flutter/flutter/issues/135700
try {
final ChromeTab chromeTab =
(await getChromeTabGuarded(_browserManager!._browser.chromeConnection, (
ChromeTab tab,
) {
return tab.url.contains(_browserManager!._browser.url!);
}))!;
final WipConnection connection = await chromeTab.connect();
final WipResponse response = await connection.sendCommand(
'Page.captureScreenshot',
<String, Object>{
// Clip the screenshot to include only the element.
// Prior to taking a screenshot, we are calling `window.render()` in
// `_matchers_web.dart` to only render the element on screen. That
// will make sure that the element will always be displayed on the
// origin of the screen.
'clip': <String, Object>{
'x': 0.0,
'y': 0.0,
'width': width!.toDouble(),
'height': height!.toDouble(),
'scale': 1.0,
},
},
);
bytes = base64.decode(response.result!['data'] as String);
} on WipError catch (ex) {
_logger.printError('Caught WIPError: $ex');
return shelf.Response.ok('WIP error: $ex');
} on FormatException catch (ex) {
_logger.printError('Caught FormatException: $ex');
return shelf.Response.ok('Caught exception: $ex');
}
return shelf.Response.ok('Request must contain bytes in the body.');
}
if (updateGoldens) {
return switch (await _testGoldenComparator.update(testUri, bytes, goldenKey)) {

View File

@ -160,30 +160,19 @@ class WebBuilder {
/// Web rendering backend mode.
enum WebRendererMode {
/// Auto detects which rendering backend to use.
auto,
/// Always uses canvaskit.
canvaskit,
/// Always uses html.
html,
/// Always use skwasm.
skwasm;
factory WebRendererMode.fromDartDefines(Iterable<String> defines, {required bool useWasm}) {
if (defines.contains('FLUTTER_WEB_AUTO_DETECT=true')) {
return auto;
} else if (defines.contains('FLUTTER_WEB_USE_SKIA=false') &&
if (defines.contains('FLUTTER_WEB_USE_SKIA=false') &&
defines.contains('FLUTTER_WEB_USE_SKWASM=true')) {
return skwasm;
} else if (defines.contains('FLUTTER_WEB_USE_SKIA=true') &&
defines.contains('FLUTTER_WEB_USE_SKWASM=false')) {
return canvaskit;
} else if (defines.contains('FLUTTER_WEB_USE_SKIA=false') &&
defines.contains('FLUTTER_WEB_USE_SKWASM=false')) {
return html; // The horror!
}
return getDefault(useWasm: useWasm);
}
@ -195,30 +184,6 @@ enum WebRendererMode {
static const WebRendererMode defaultForJs = WebRendererMode.canvaskit;
static const WebRendererMode defaultForWasm = WebRendererMode.skwasm;
/// Returns whether the WebRendererMode is considered deprecated or not.
///
/// Deprecated modes: auto, html.
bool get isDeprecated => switch (this) {
auto => true,
canvaskit => false,
html => true,
skwasm => false,
};
/// Returns a consistent deprecation warning for the WebRendererMode.
String get deprecationWarning =>
'The HTML Renderer is deprecated and will be removed. Please, stop using it.'
'\nSee: https://docs.flutter.dev/to/web-html-renderer-deprecation';
String get helpText => switch (this) {
auto => 'Use the HTML renderer on mobile devices, and CanvasKit on desktop devices.',
canvaskit =>
'Always use the CanvasKit renderer. This renderer uses WebGL and WebAssembly to render graphics.',
html =>
'Always use the HTML renderer. This renderer uses a combination of HTML, CSS, SVG, 2D Canvas, and WebGL.',
skwasm => 'Always use the experimental skwasm renderer.',
};
/// Returns [dartDefines] in a way usable from the CLI.
///
/// This is used to start integration tests.
@ -226,9 +191,7 @@ enum WebRendererMode {
dartDefines.map((String define) => '--dart-define=$define');
Iterable<String> get dartDefines => switch (this) {
auto => const <String>{'FLUTTER_WEB_AUTO_DETECT=true'},
canvaskit => const <String>{'FLUTTER_WEB_USE_SKIA=true', 'FLUTTER_WEB_USE_SKWASM=false'},
html => const <String>{'FLUTTER_WEB_USE_SKIA=false', 'FLUTTER_WEB_USE_SKWASM=false'},
skwasm => const <String>{'FLUTTER_WEB_USE_SKIA=false', 'FLUTTER_WEB_USE_SKWASM=true'},
};
@ -238,9 +201,7 @@ enum WebRendererMode {
dartDefinesSet
..removeWhere((String d) {
return d.startsWith('FLUTTER_WEB_AUTO_DETECT=') ||
d.startsWith('FLUTTER_WEB_USE_SKIA=') ||
d.startsWith('FLUTTER_WEB_USE_SKWASM=');
return d.startsWith('FLUTTER_WEB_USE_SKIA=') || d.startsWith('FLUTTER_WEB_USE_SKWASM=');
})
..addAll(dartDefines);
@ -251,37 +212,28 @@ enum WebRendererMode {
/// The correct precompiled artifact to use for each build and render mode for DDC with AMD modules.
// TODO(markzipan): delete this when DDC's AMD module system is deprecated, https://github.com/flutter/flutter/issues/142060.
const Map<WebRendererMode, HostArtifact> kAmdDartSdkJsArtifactMap = <WebRendererMode, HostArtifact>{
WebRendererMode.auto: HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdk,
WebRendererMode.canvaskit: HostArtifact.webPrecompiledAmdCanvaskitSdk,
WebRendererMode.html: HostArtifact.webPrecompiledAmdSdk,
};
/// The correct source map artifact to use for each build and render mode for DDC with AMD modules.
// TODO(markzipan): delete this when DDC's AMD module system is deprecated, https://github.com/flutter/flutter/issues/142060.
const Map<WebRendererMode, HostArtifact> kAmdDartSdkJsMapArtifactMap =
<WebRendererMode, HostArtifact>{
WebRendererMode.auto: HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdkSourcemaps,
WebRendererMode.canvaskit: HostArtifact.webPrecompiledAmdCanvaskitSdkSourcemaps,
WebRendererMode.html: HostArtifact.webPrecompiledAmdSdkSourcemaps,
};
/// The correct precompiled artifact to use for each build and render mode for
/// DDC with DDC library bundle module format.
const Map<WebRendererMode, HostArtifact> kDdcLibraryBundleDartSdkJsArtifactMap =
<WebRendererMode, HostArtifact>{
WebRendererMode.auto: HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk,
WebRendererMode.canvaskit: HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk,
WebRendererMode.html: HostArtifact.webPrecompiledDdcLibraryBundleSdk,
};
/// The correct source map artifact to use for each build and render mode for
/// DDC with DDC library bundle module format.
const Map<WebRendererMode, HostArtifact> kDdcLibraryBundleDartSdkJsMapArtifactMap =
<WebRendererMode, HostArtifact>{
WebRendererMode.auto:
HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdkSourcemaps,
WebRendererMode.canvaskit: HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps,
WebRendererMode.html: HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps,
};
String _buildEventAnalyticsSettings({required List<WebCompilerConfig> configs}) {

View File

@ -4,7 +4,6 @@
import 'package:args/command_runner.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
@ -14,14 +13,12 @@ import 'package:flutter_tools/src/build_system/targets/web.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/commands/build_web.dart';
import 'package:flutter_tools/src/dart/pub.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:flutter_tools/src/web/compile.dart';
import '../../src/common.dart';
import '../../src/context.dart';
import '../../src/fake_pub_deps.dart';
import '../../src/fakes.dart';
import '../../src/test_build_system.dart';
import '../../src/test_flutter_command_runner.dart';
@ -32,16 +29,6 @@ void main() {
late BufferLogger logger;
late ProcessManager processManager;
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
// See https://github.com/flutter/flutter/issues/160257 for details.
FeatureFlags enableExplicitPackageDependencies() {
return TestFeatureFlags(
isExplicitPackageDependenciesEnabled: true,
// Assumed to be true below.
isWebEnabled: true,
);
}
setUpAll(() {
Cache.flutterRoot = '';
Cache.disableLocking();
@ -459,42 +446,6 @@ void main() {
},
);
// Tests whether using a deprecated webRenderer toggles a warningText.
Future<void> testWebRendererDeprecationMessage(WebRendererMode webRenderer) async {
testUsingContext(
'Using the "${webRenderer.name}" renderer triggers a warningText.',
() async {
// Run the command so it parses the renderer, but ignore all errors.
// We only care about the logger.
try {
final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem);
await createTestCommandRunner(
buildCommand,
).run(<String>['build', 'web', '--no-pub', ...webRenderer.toCliDartDefines]);
} on ToolExit catch (error) {
expect(error, isA<ToolExit>());
}
expect(
logger.warningText,
contains('See: https://docs.flutter.dev/to/web-html-renderer-deprecation'),
);
},
overrides: <Type, Generator>{
Platform: () => fakePlatform,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Logger: () => logger,
FeatureFlags: enableExplicitPackageDependencies,
Pub: FakePubWithPrimedDeps.new,
},
);
}
/// Do test all the deprecated WebRendererModes
WebRendererMode.values
.where((WebRendererMode mode) => mode.isDeprecated)
.forEach(testWebRendererDeprecationMessage);
testUsingContext(
'flutter build web option visibility',
() async {

View File

@ -53,12 +53,8 @@ void main() {
tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_web_platform_test.');
for (final HostArtifact artifact in <HostArtifact>[
HostArtifact.webPrecompiledAmdCanvaskitAndHtmlSdk,
HostArtifact.webPrecompiledAmdCanvaskitSdk,
HostArtifact.webPrecompiledAmdSdk,
HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitAndHtmlSdk,
HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk,
HostArtifact.webPrecompiledDdcLibraryBundleSdk,
]) {
final File artifactFile = artifacts.getHostArtifact(artifact) as File;
artifactFile.createSync();

View File

@ -1107,39 +1107,6 @@ void main() {
},
);
// Tests whether using a deprecated webRenderer toggles a warningText.
Future<void> testWebRendererDeprecationMessage(WebRendererMode webRenderer) async {
testUsingContext(
'Using the "${webRenderer.name}" renderer triggers a warningText.',
() async {
// Run the command so it parses the renderer, but ignore all errors.
// We only care about the logger.
try {
await createTestCommandRunner(
RunCommand(),
).run(<String>['run', '--no-pub', ...webRenderer.toCliDartDefines]);
} on ToolExit catch (error) {
expect(error, isA<ToolExit>());
}
expect(
logger.warningText,
contains('See: https://docs.flutter.dev/to/web-html-renderer-deprecation'),
);
},
overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
Logger: () => logger,
DeviceManager: () => testDeviceManager,
},
);
}
/// Do test all the deprecated WebRendererModes
WebRendererMode.values
.where((WebRendererMode mode) => mode.isDeprecated)
.forEach(testWebRendererDeprecationMessage);
testUsingContext(
'accepts headers with commas in them',
() async {

View File

@ -1525,45 +1525,6 @@ dev_dependencies:
);
});
// Tests whether using a deprecated webRenderer toggles a warningText.
Future<void> testWebRendererDeprecationMessage(WebRendererMode webRenderer) async {
testUsingContext(
'Using the "${webRenderer.name}" renderer triggers a warningText.',
() async {
// Run the command so it parses the renderer, but ignore all errors.
// We only care about the logger.
try {
final FakeFlutterTestRunner testRunner = FakeFlutterTestRunner(0);
final TestCommand testCommand = TestCommand(testRunner: testRunner);
await createTestCommandRunner(testCommand).run(<String>[
'test',
'web',
'--no-pub',
'--platform=chrome',
...webRenderer.toCliDartDefines,
]);
} on ToolExit catch (error) {
expect(error, isA<ToolExit>());
}
expect(
logger.warningText,
contains('See: https://docs.flutter.dev/to/web-html-renderer-deprecation'),
);
},
overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
Logger: () => logger,
},
);
}
/// Do test all the deprecated WebRendererModes
WebRendererMode.values
.where((WebRendererMode mode) => mode.isDeprecated)
.forEach(testWebRendererDeprecationMessage);
testUsingContext(
'Can test in a pub workspace',
() async {

View File

@ -236,14 +236,6 @@ void main() {
);
testWithoutContext('Precompiled web AMD module system artifact paths are correct', () {
expect(
artifacts.getHostArtifact(HostArtifact.webPrecompiledAmdSdk).path,
'root/bin/cache/flutter_web_sdk/kernel/amd/dart_sdk.js',
);
expect(
artifacts.getHostArtifact(HostArtifact.webPrecompiledAmdSdkSourcemaps).path,
'root/bin/cache/flutter_web_sdk/kernel/amd/dart_sdk.js.map',
);
expect(
artifacts.getHostArtifact(HostArtifact.webPrecompiledAmdCanvaskitSdk).path,
'root/bin/cache/flutter_web_sdk/kernel/amd-canvaskit/dart_sdk.js',
@ -257,14 +249,6 @@ void main() {
testWithoutContext(
'Precompiled web DDC library bundle module system artifact paths are correct',
() {
expect(
artifacts.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleSdk).path,
'root/bin/cache/flutter_web_sdk/kernel/ddcLibraryBundle/dart_sdk.js',
);
expect(
artifacts.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps).path,
'root/bin/cache/flutter_web_sdk/kernel/ddcLibraryBundle/dart_sdk.js.map',
);
expect(
artifacts.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk).path,
'root/bin/cache/flutter_web_sdk/kernel/ddcLibraryBundle-canvaskit/dart_sdk.js',

View File

@ -13,39 +13,17 @@ void main() {
dartDefines = <String>[];
});
test('auto web-renderer with no dart-defines', () {
dartDefines = WebRendererMode.auto.updateDartDefines(dartDefines);
expect(dartDefines, <String>['FLUTTER_WEB_AUTO_DETECT=true']);
});
test('canvaskit web-renderer with no dart-defines', () {
dartDefines = WebRendererMode.canvaskit.updateDartDefines(dartDefines);
expect(dartDefines, <String>['FLUTTER_WEB_USE_SKIA=true', 'FLUTTER_WEB_USE_SKWASM=false']);
});
test('html web-renderer with no dart-defines', () {
dartDefines = WebRendererMode.html.updateDartDefines(dartDefines);
expect(dartDefines, <String>['FLUTTER_WEB_USE_SKIA=false', 'FLUTTER_WEB_USE_SKWASM=false']);
});
test('auto web-renderer with existing dart-defines', () {
dartDefines = <String>['FLUTTER_WEB_USE_SKIA=false'];
dartDefines = WebRendererMode.auto.updateDartDefines(dartDefines);
expect(dartDefines, <String>['FLUTTER_WEB_AUTO_DETECT=true']);
});
test('canvaskit web-renderer with existing dart-defines', () {
dartDefines = <String>['FLUTTER_WEB_USE_SKIA=false'];
dartDefines = WebRendererMode.canvaskit.updateDartDefines(dartDefines);
expect(dartDefines, <String>['FLUTTER_WEB_USE_SKIA=true', 'FLUTTER_WEB_USE_SKWASM=false']);
});
test('html web-renderer with existing dart-defines', () {
dartDefines = <String>['FLUTTER_WEB_USE_SKIA=true'];
dartDefines = WebRendererMode.html.updateDartDefines(dartDefines);
expect(dartDefines, <String>['FLUTTER_WEB_USE_SKIA=false', 'FLUTTER_WEB_USE_SKWASM=false']);
});
test('skwasm web-renderer with existing dart-defines', () {
dartDefines = <String>['FLUTTER_WEB_USE_SKWASM=false'];
dartDefines = WebRendererMode.skwasm.updateDartDefines(dartDefines);

View File

@ -1236,7 +1236,6 @@ void main() {
JsCompilerConfig(optimizationLevel: 0),
JsCompilerConfig(noFrequencyBasedMinification: true),
JsCompilerConfig(sourceMaps: false),
JsCompilerConfig(renderer: WebRendererMode.html),
// All properties non-default
JsCompilerConfig(
@ -1246,7 +1245,6 @@ void main() {
optimizationLevel: 0,
noFrequencyBasedMinification: true,
sourceMaps: false,
renderer: WebRendererMode.html,
),
];

View File

@ -807,7 +807,7 @@ void main() {
chromiumLauncher: null,
ddcModuleSystem: usesDdcModuleSystem,
canaryFeatures: canaryFeatures,
webRenderer: WebRendererMode.html,
webRenderer: WebRendererMode.canvaskit,
isWasm: false,
useLocalCanvasKit: false,
rootDirectory: globals.fs.currentDirectory,
@ -822,12 +822,6 @@ void main() {
globals.fs.currentDirectory.childDirectory('lib').childFile('web_entrypoint.dart')
..createSync(recursive: true)
..writeAsStringSync('GENERATED');
final String webPrecompiledSdk =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleSdk).path;
final String webPrecompiledSdkSourcemaps =
globals.artifacts!
.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleSdkSourcemaps)
.path;
final String webPrecompiledCanvaskitSdk =
globals.artifacts!
.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdk)
@ -836,18 +830,12 @@ void main() {
globals.artifacts!
.getHostArtifact(HostArtifact.webPrecompiledDdcLibraryBundleCanvaskitSdkSourcemaps)
.path;
globals.fs.file(webPrecompiledSdk)
..createSync(recursive: true)
..writeAsStringSync('HELLO');
globals.fs.file(webPrecompiledSdkSourcemaps)
..createSync(recursive: true)
..writeAsStringSync('THERE');
globals.fs.file(webPrecompiledCanvaskitSdk)
..createSync(recursive: true)
..writeAsStringSync('OL');
..writeAsStringSync('HELLO');
globals.fs.file(webPrecompiledCanvaskitSdkSourcemaps)
..createSync(recursive: true)
..writeAsStringSync('CHUM');
..writeAsStringSync('THERE');
await webDevFS.update(
mainUri: globals.fs.file(globals.fs.path.join('lib', 'main.dart')).uri,
@ -872,7 +860,7 @@ void main() {
expect(await webDevFS.webAssetServer.dartSourceContents('dart_sdk.js.map'), 'THERE');
// Update to the SDK.
globals.fs.file(webPrecompiledSdk).writeAsStringSync('BELLOW');
globals.fs.file(webPrecompiledCanvaskitSdk).writeAsStringSync('BELLOW');
// New SDK should be visible..
expect(await webDevFS.webAssetServer.dartSourceContents('dart_sdk.js'), 'BELLOW');
@ -1071,57 +1059,6 @@ void main() {
await webDevFS.destroy();
});
runInTestbed('Can start web server with auto detect enabled', () async {
final String path = globals.fs.path.join('lib', 'main.dart');
final File outputFile = globals.fs.file(path)..createSync(recursive: true);
outputFile.parent.childFile('a.sources').writeAsStringSync('');
outputFile.parent.childFile('a.json').writeAsStringSync('{}');
outputFile.parent.childFile('a.map').writeAsStringSync('{}');
final WebDevFS webDevFS = WebDevFS(
hostname: 'localhost',
port: 0,
tlsCertPath: null,
tlsCertKeyPath: null,
packagesFilePath: '.dart_tool/package_config.json',
urlTunneller: null,
useSseForDebugProxy: true,
useSseForDebugBackend: true,
useSseForInjectedClient: true,
nullAssertions: true,
nativeNullAssertions: true,
buildInfo: const BuildInfo(
BuildMode.debug,
'',
treeShakeIcons: false,
dartDefines: <String>['FLUTTER_WEB_AUTO_DETECT=true'],
packageConfigPath: '.dart_tool/package_config.json',
),
enableDwds: false,
enableDds: false,
entrypoint: Uri.base,
testMode: true,
expressionCompiler: null,
extraHeaders: const <String, String>{},
chromiumLauncher: null,
ddcModuleSystem: usesDdcModuleSystem,
canaryFeatures: canaryFeatures,
webRenderer: WebRendererMode.auto,
isWasm: false,
useLocalCanvasKit: false,
rootDirectory: globals.fs.currentDirectory,
isWindows: false,
);
webDevFS.ddcModuleLoaderJS.createSync(recursive: true);
webDevFS.stackTraceMapper.createSync(recursive: true);
await webDevFS.create();
expect(webDevFS.webAssetServer.webRenderer, WebRendererMode.auto);
await webDevFS.destroy();
});
runInTestbed('Can start web server with tls connection', () async {
final String dataPath = globals.fs.path.join(
getFlutterRoot(),

View File

@ -927,7 +927,7 @@ void main() {
chromiumLauncher: null,
ddcModuleSystem: usesDdcModuleSystem,
canaryFeatures: canaryFeatures,
webRenderer: WebRendererMode.html,
webRenderer: WebRendererMode.canvaskit,
isWasm: false,
useLocalCanvasKit: false,
rootDirectory: globals.fs.currentDirectory,
@ -939,17 +939,19 @@ void main() {
final Uri uri = await webDevFS.create();
webDevFS.webAssetServer.entrypointCacheDirectory = globals.fs.currentDirectory;
final String webPrecompiledSdk =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledAmdSdk).path;
final String webPrecompiledSdkSourcemaps =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledAmdSdkSourcemaps).path;
final String webPrecompiledCanvaskitSdk =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledAmdCanvaskitSdk).path;
final String webPrecompiledCanvaskitSdkSourcemaps =
globals.artifacts!
.getHostArtifact(HostArtifact.webPrecompiledAmdCanvaskitSdkSourcemaps)
.path;
globals.fs.currentDirectory.childDirectory('lib').childFile('web_entrypoint.dart')
..createSync(recursive: true)
..writeAsStringSync('GENERATED');
globals.fs.file(webPrecompiledSdk)
globals.fs.file(webPrecompiledCanvaskitSdk)
..createSync(recursive: true)
..writeAsStringSync('HELLO');
globals.fs.file(webPrecompiledSdkSourcemaps)
globals.fs.file(webPrecompiledCanvaskitSdkSourcemaps)
..createSync(recursive: true)
..writeAsStringSync('THERE');
@ -976,7 +978,7 @@ void main() {
expect(await webDevFS.webAssetServer.dartSourceContents('dart_sdk.js.map'), 'THERE');
// Update to the SDK.
globals.fs.file(webPrecompiledSdk).writeAsStringSync('BELLOW');
globals.fs.file(webPrecompiledCanvaskitSdk).writeAsStringSync('BELLOW');
// New SDK should be visible..
expect(await webDevFS.webAssetServer.dartSourceContents('dart_sdk.js'), 'BELLOW');
@ -1034,7 +1036,7 @@ void main() {
chromiumLauncher: null,
ddcModuleSystem: usesDdcModuleSystem,
canaryFeatures: canaryFeatures,
webRenderer: WebRendererMode.html,
webRenderer: WebRendererMode.canvaskit,
isWasm: false,
useLocalCanvasKit: false,
rootDirectory: globals.fs.currentDirectory,
@ -1049,10 +1051,6 @@ void main() {
globals.fs.currentDirectory.childDirectory('lib').childFile('web_entrypoint.dart')
..createSync(recursive: true)
..writeAsStringSync('GENERATED');
final String webPrecompiledSdk =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledAmdSdk).path;
final String webPrecompiledSdkSourcemaps =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledAmdSdkSourcemaps).path;
final String webPrecompiledCanvaskitSdk =
globals.artifacts!.getHostArtifact(HostArtifact.webPrecompiledAmdCanvaskitSdk).path;
final String webPrecompiledCanvaskitSdkSourcemaps =
@ -1063,18 +1061,12 @@ void main() {
globals.artifacts!.getHostArtifact(HostArtifact.flutterJsDirectory).path,
'flutter.js',
);
globals.fs.file(webPrecompiledSdk)
..createSync(recursive: true)
..writeAsStringSync('HELLO');
globals.fs.file(webPrecompiledSdkSourcemaps)
..createSync(recursive: true)
..writeAsStringSync('THERE');
globals.fs.file(webPrecompiledCanvaskitSdk)
..createSync(recursive: true)
..writeAsStringSync('OL');
..writeAsStringSync('HELLO');
globals.fs.file(webPrecompiledCanvaskitSdkSourcemaps)
..createSync(recursive: true)
..writeAsStringSync('CHUM');
..writeAsStringSync('THERE');
globals.fs.file(flutterJs)
..createSync(recursive: true)
..writeAsStringSync('(flutter.js content)');
@ -1102,7 +1094,7 @@ void main() {
expect(await webDevFS.webAssetServer.dartSourceContents('dart_sdk.js.map'), 'THERE');
// Update to the SDK.
globals.fs.file(webPrecompiledSdk).writeAsStringSync('BELLOW');
globals.fs.file(webPrecompiledCanvaskitSdk).writeAsStringSync('BELLOW');
// New SDK should be visible..
expect(await webDevFS.webAssetServer.dartSourceContents('dart_sdk.js'), 'BELLOW');
@ -1307,60 +1299,6 @@ void main() {
}),
);
test(
'Can start web server with auto detect enabled',
() => testbed.run(() async {
final File outputFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
..createSync(recursive: true);
outputFile.parent.childFile('a.sources').writeAsStringSync('');
outputFile.parent.childFile('a.json').writeAsStringSync('{}');
outputFile.parent.childFile('a.map').writeAsStringSync('{}');
final WebDevFS webDevFS = WebDevFS(
hostname: 'localhost',
port: 0,
tlsCertPath: null,
tlsCertKeyPath: null,
packagesFilePath: '.dart_tool/package_config.json',
urlTunneller: null,
useSseForDebugProxy: true,
useSseForDebugBackend: true,
useSseForInjectedClient: true,
nullAssertions: true,
nativeNullAssertions: true,
buildInfo: const BuildInfo(
BuildMode.debug,
'',
treeShakeIcons: false,
dartDefines: <String>['FLUTTER_WEB_AUTO_DETECT=true'],
packageConfigPath: '.dart_tool/package_config.json',
),
enableDwds: false,
enableDds: false,
entrypoint: Uri.base,
testMode: true,
expressionCompiler: null,
extraHeaders: const <String, String>{},
chromiumLauncher: null,
ddcModuleSystem: usesDdcModuleSystem,
canaryFeatures: canaryFeatures,
webRenderer: WebRendererMode.auto,
isWasm: false,
useLocalCanvasKit: false,
rootDirectory: globals.fs.currentDirectory,
isWindows: false,
);
webDevFS.requireJS.createSync(recursive: true);
webDevFS.stackTraceMapper.createSync(recursive: true);
await webDevFS.create();
expect(webDevFS.webAssetServer.webRenderer, WebRendererMode.auto);
await webDevFS.destroy();
}),
);
test(
'Can start web server with tls connection',
() => testbed.run(() async {

View File

@ -63,7 +63,7 @@ String indexHtmlFlutterJsLoad = _generateFlutterJsIndexHtml('''
builds: [
{
"compileTarget": "dartdevc",
"renderer": "html",
"renderer": "canvaskit",
"mainJsPath": "main.dart.js",
}
]