diff --git a/packages/web_benchmarks/CHANGELOG.md b/packages/web_benchmarks/CHANGELOG.md index d167518850..7222ae8557 100644 --- a/packages/web_benchmarks/CHANGELOG.md +++ b/packages/web_benchmarks/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.1.0+8 + +* Adds an optional parameter `treeShakeIcons` to `serveWebBenchmark`. +* Adds a required and named parameter `treeShakeIcons` to `BenchmarkServer`. + ## 0.1.0+7 * Updates `package:process` version constraints. diff --git a/packages/web_benchmarks/lib/server.dart b/packages/web_benchmarks/lib/server.dart index 7327e1aa08..7d16b79940 100644 --- a/packages/web_benchmarks/lib/server.dart +++ b/packages/web_benchmarks/lib/server.dart @@ -46,6 +46,7 @@ Future serveWebBenchmark({ int benchmarkServerPort = defaultBenchmarkServerPort, int chromeDebugPort = defaultChromeDebugPort, bool headless = true, + bool treeShakeIcons = true, }) async { // Reduce logging level. Otherwise, package:webkit_inspection_protocol is way too spammy. Logger.root.level = Level.INFO; @@ -57,5 +58,6 @@ Future serveWebBenchmark({ benchmarkServerPort: benchmarkServerPort, chromeDebugPort: chromeDebugPort, headless: headless, + treeShakeIcons: treeShakeIcons, ).run(); } diff --git a/packages/web_benchmarks/lib/src/runner.dart b/packages/web_benchmarks/lib/src/runner.dart index e47bc2de1b..66293538d8 100644 --- a/packages/web_benchmarks/lib/src/runner.dart +++ b/packages/web_benchmarks/lib/src/runner.dart @@ -54,6 +54,7 @@ class BenchmarkServer { required this.benchmarkServerPort, required this.chromeDebugPort, required this.headless, + required this.treeShakeIcons, }); final ProcessManager _processManager = const LocalProcessManager(); @@ -84,6 +85,11 @@ class BenchmarkServer { /// This is useful in environments (e.g. CI) that doesn't have a display. final bool headless; + /// Whether to tree shake icons during the build. + /// + /// When false, '--no-tree-shake-icons' will be passed as a build argument. + final bool treeShakeIcons; + /// Builds and serves the benchmark app, and collects benchmark results. Future run() async { // Reduce logging level. Otherwise, package:webkit_inspection_protocol is way too spammy. @@ -101,6 +107,7 @@ class BenchmarkServer { 'web', '--dart-define=FLUTTER_WEB_ENABLE_PROFILING=true', if (useCanvasKit) '--dart-define=FLUTTER_WEB_USE_SKIA=true', + if (!treeShakeIcons) '--no-tree-shake-icons', '--profile', '-t', entryPoint, diff --git a/packages/web_benchmarks/pubspec.yaml b/packages/web_benchmarks/pubspec.yaml index ee54ff318c..036c29a627 100644 --- a/packages/web_benchmarks/pubspec.yaml +++ b/packages/web_benchmarks/pubspec.yaml @@ -2,7 +2,7 @@ name: web_benchmarks description: A benchmark harness for performance-testing Flutter apps in Chrome. repository: https://github.com/flutter/packages/tree/main/packages/web_benchmarks issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_benchmarks%22 -version: 0.1.0+7 +version: 0.1.0+8 environment: sdk: ">=2.19.0 <4.0.0" diff --git a/packages/web_benchmarks/testing/test_app/lib/aboutpage.dart b/packages/web_benchmarks/testing/test_app/lib/about_page.dart similarity index 100% rename from packages/web_benchmarks/testing/test_app/lib/aboutpage.dart rename to packages/web_benchmarks/testing/test_app/lib/about_page.dart diff --git a/packages/web_benchmarks/testing/test_app/lib/benchmarks/runner.dart b/packages/web_benchmarks/testing/test_app/lib/benchmarks/runner.dart index af5b7bb439..cf7ef251fb 100644 --- a/packages/web_benchmarks/testing/test_app/lib/benchmarks/runner.dart +++ b/packages/web_benchmarks/testing/test_app/lib/benchmarks/runner.dart @@ -8,8 +8,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:web_benchmarks/client.dart'; -import '../aboutpage.dart' show backKey; -import '../homepage.dart' show aboutPageKey, textKey; +import '../about_page.dart' show backKey; +import '../home_page.dart' show aboutPageKey, textKey; import '../main.dart'; /// A recorder that measures frame building durations. diff --git a/packages/web_benchmarks/testing/test_app/lib/homepage.dart b/packages/web_benchmarks/testing/test_app/lib/home_page.dart similarity index 100% rename from packages/web_benchmarks/testing/test_app/lib/homepage.dart rename to packages/web_benchmarks/testing/test_app/lib/home_page.dart diff --git a/packages/web_benchmarks/testing/test_app/lib/icon_page.dart b/packages/web_benchmarks/testing/test_app/lib/icon_page.dart new file mode 100644 index 0000000000..fd0da430ee --- /dev/null +++ b/packages/web_benchmarks/testing/test_app/lib/icon_page.dart @@ -0,0 +1,45 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class IconGeneratorPage extends StatefulWidget { + const IconGeneratorPage({super.key}); + + static int defaultIconCodePoint = int.parse('0xf03f'); + + @override + State createState() => _IconGeneratorPageState(); +} + +class _IconGeneratorPageState extends State { + int iconCodePoint = IconGeneratorPage.defaultIconCodePoint; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + TextField( + onSubmitted: (String value) { + final int codePointAsInt = + int.tryParse(value) ?? IconGeneratorPage.defaultIconCodePoint; + setState(() { + iconCodePoint = codePointAsInt; + }); + }, + ), + const SizedBox(height: 24.0), + Icon(generateIcon(iconCodePoint)), + ], + ); + } + + // Unless '--no-tree-shake-icons' is passed to the flutter build command, + // the presence of this method will trigger an exception due to the use of + // non-constant invocations of [IconData]. + IconData generateIcon(int materialIconCodePoint) => IconData( + materialIconCodePoint, + fontFamily: 'MaterialIcons', + ); +} diff --git a/packages/web_benchmarks/testing/test_app/lib/main.dart b/packages/web_benchmarks/testing/test_app/lib/main.dart index 5621621e21..e07fc56ec2 100644 --- a/packages/web_benchmarks/testing/test_app/lib/main.dart +++ b/packages/web_benchmarks/testing/test_app/lib/main.dart @@ -4,8 +4,9 @@ import 'package:flutter/material.dart'; -import 'aboutpage.dart'; -import 'homepage.dart'; +import 'about_page.dart'; +import 'home_page.dart'; +import 'icon_page.dart'; void main() { runApp(const MyApp()); @@ -26,6 +27,7 @@ class MyApp extends StatelessWidget { routes: { 'home': (_) => const HomePage(title: 'Flutter Demo Home Page'), 'about': (_) => const AboutPage(), + 'icon_generator': (_) => const IconGeneratorPage(), }, ); } diff --git a/packages/web_benchmarks/testing/test_app/pubspec.yaml b/packages/web_benchmarks/testing/test_app/pubspec.yaml index 506615d45d..eb02b1153c 100644 --- a/packages/web_benchmarks/testing/test_app/pubspec.yaml +++ b/packages/web_benchmarks/testing/test_app/pubspec.yaml @@ -6,10 +6,9 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ">=2.19.0 <4.0.0" + sdk: '>=2.19.0 <4.0.0' dependencies: - cupertino_icons: ^1.0.5 flutter: sdk: flutter flutter_test: diff --git a/packages/web_benchmarks/testing/web_benchmarks_test.dart b/packages/web_benchmarks/testing/web_benchmarks_test.dart index 3f4db8e1ae..7d092c9eb1 100644 --- a/packages/web_benchmarks/testing/web_benchmarks_test.dart +++ b/packages/web_benchmarks/testing/web_benchmarks_test.dart @@ -15,6 +15,7 @@ Future main() async { benchmarkAppDirectory: Directory('testing/test_app'), entryPoint: 'lib/benchmarks/runner.dart', useCanvasKit: false, + treeShakeIcons: false, ); for (final String benchmarkName in ['scroll', 'page', 'tap']) {