diff --git a/packages/web_benchmarks/CHANGELOG.md b/packages/web_benchmarks/CHANGELOG.md index 88f460e800f..7d4a422d2f4 100644 --- a/packages/web_benchmarks/CHANGELOG.md +++ b/packages/web_benchmarks/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.1.0+10 + +* Ensure the benchmark client reloads with the proper `initialPage`. +* Migrates benchmark recorder away from deprecated `js_util` APIs. + ## 0.1.0+9 * Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. diff --git a/packages/web_benchmarks/lib/client.dart b/packages/web_benchmarks/lib/client.dart index 43ef711918c..2b8e170c1f8 100644 --- a/packages/web_benchmarks/lib/client.dart +++ b/packages/web_benchmarks/lib/client.dart @@ -29,7 +29,10 @@ final LocalBenchmarkServerClient _client = LocalBenchmarkServerClient(); /// /// When used without a server, prompts the user to select a benchmark to /// run next. -Future runBenchmarks(Map benchmarks) async { +Future runBenchmarks( + Map benchmarks, { + String initialPage = defaultInitialPage, +}) async { // Set local benchmarks. _benchmarks = benchmarks; @@ -43,7 +46,19 @@ Future runBenchmarks(Map benchmarks) async { } await _runBenchmark(nextBenchmark); - html.window.location.reload(); + + final Uri currentUri = Uri.parse(html.window.location.href); + // Create a new URI with the current 'page' value set to [initialPage] to + // ensure the benchmark app is reloaded at the proper location. + final Uri newUri = Uri( + scheme: currentUri.scheme, + host: currentUri.host, + port: currentUri.port, + path: initialPage, + ); + + // Reloading the window will trigger the next benchmark to run. + html.window.location.replace(newUri.toString()); } Future _runBenchmark(String? benchmarkName) async { diff --git a/packages/web_benchmarks/lib/server.dart b/packages/web_benchmarks/lib/server.dart index 4aa47af3b83..41ae7623ec9 100644 --- a/packages/web_benchmarks/lib/server.dart +++ b/packages/web_benchmarks/lib/server.dart @@ -8,6 +8,7 @@ import 'dart:io' as io; import 'package:logging/logging.dart'; import 'src/benchmark_result.dart'; +import 'src/common.dart'; import 'src/runner.dart'; export 'src/benchmark_result.dart'; @@ -47,7 +48,7 @@ Future serveWebBenchmark({ int chromeDebugPort = defaultChromeDebugPort, bool headless = true, bool treeShakeIcons = true, - String initialPage = BenchmarkServer.defaultInitialPage, + String initialPage = defaultInitialPage, }) async { // Reduce logging level. Otherwise, package:webkit_inspection_protocol is way too spammy. Logger.root.level = Level.INFO; diff --git a/packages/web_benchmarks/lib/src/common.dart b/packages/web_benchmarks/lib/src/common.dart index 536cbea236d..5c7c7259796 100644 --- a/packages/web_benchmarks/lib/src/common.dart +++ b/packages/web_benchmarks/lib/src/common.dart @@ -14,3 +14,7 @@ const int kMeasuredSampleCount = 100; /// A special value returned by the `/next-benchmark` HTTP POST request when /// all benchmarks have run and there are no more benchmarks to run. const String kEndOfBenchmarks = '__end_of_benchmarks__'; + +/// The default initial page to load upon opening the benchmark app or reloading +/// it in Chrome. +const String defaultInitialPage = 'index.html'; diff --git a/packages/web_benchmarks/lib/src/recorder.dart b/packages/web_benchmarks/lib/src/recorder.dart index 51fa697cecf..7154386f989 100644 --- a/packages/web_benchmarks/lib/src/recorder.dart +++ b/packages/web_benchmarks/lib/src/recorder.dart @@ -4,10 +4,9 @@ import 'dart:async'; import 'dart:html' as html; -import 'dart:js'; -import 'dart:js_util' as js_util; import 'dart:math' as math; import 'dart:ui'; +import 'dart:ui_web' as ui_web; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -1211,19 +1210,21 @@ final Map _engineBenchmarkListeners = /// /// If another listener is already registered, overrides it. void registerEngineBenchmarkValueListener( - String name, EngineBenchmarkValueListener listener) { + String name, + EngineBenchmarkValueListener listener, +) { if (_engineBenchmarkListeners.containsKey(name)) { - throw StateError('A listener for "$name" is already registered.\n' - 'Call `stopListeningToEngineBenchmarkValues` to unregister the previous ' - 'listener before registering a new one.'); + throw StateError( + 'A listener for "$name" is already registered.\n' + 'Call `stopListeningToEngineBenchmarkValues` to unregister the previous ' + 'listener before registering a new one.', + ); } if (_engineBenchmarkListeners.isEmpty) { // The first listener is being registered. Register the global listener. - js_util.setProperty(html.window, '_flutter_internal_on_benchmark', - allowInterop(_dispatchEngineBenchmarkValue)); + ui_web.benchmarkValueCallback = _dispatchEngineBenchmarkValue; } - _engineBenchmarkListeners[name] = listener; } @@ -1232,7 +1233,7 @@ void stopListeningToEngineBenchmarkValues(String name) { _engineBenchmarkListeners.remove(name); if (_engineBenchmarkListeners.isEmpty) { // The last listener unregistered. Remove the global listener. - js_util.setProperty(html.window, '_flutter_internal_on_benchmark', null); + ui_web.benchmarkValueCallback = null; } } diff --git a/packages/web_benchmarks/lib/src/runner.dart b/packages/web_benchmarks/lib/src/runner.dart index 142b2d1f4eb..9396f42ebc3 100644 --- a/packages/web_benchmarks/lib/src/runner.dart +++ b/packages/web_benchmarks/lib/src/runner.dart @@ -58,11 +58,6 @@ class BenchmarkServer { this.initialPage = defaultInitialPage, }); - /// The default initial page to load upon opening the benchmark app in Chrome. - /// - /// This value will be used by default if no value is passed to [initialPage]. - static const String defaultInitialPage = 'index.html'; - final ProcessManager _processManager = const LocalProcessManager(); /// The directory containing the app that's being benchmarked. diff --git a/packages/web_benchmarks/pubspec.yaml b/packages/web_benchmarks/pubspec.yaml index 5c41da447e0..de97f0b2162 100644 --- a/packages/web_benchmarks/pubspec.yaml +++ b/packages/web_benchmarks/pubspec.yaml @@ -2,11 +2,11 @@ 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+9 +version: 0.1.0+10 environment: - sdk: ">=3.0.0 <4.0.0" - flutter: ">=3.10.0" + sdk: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" dependencies: flutter: diff --git a/packages/web_benchmarks/testing/web_benchmarks_test.dart b/packages/web_benchmarks/testing/web_benchmarks_test.dart index a208d16efd8..5d005e2afc7 100644 --- a/packages/web_benchmarks/testing/web_benchmarks_test.dart +++ b/packages/web_benchmarks/testing/web_benchmarks_test.dart @@ -8,7 +8,7 @@ import 'dart:io'; import 'package:test/test.dart'; import 'package:web_benchmarks/server.dart'; -import 'package:web_benchmarks/src/runner.dart'; +import 'package:web_benchmarks/src/common.dart'; Future main() async { test('Can run a web benchmark', () async { @@ -30,7 +30,7 @@ Future main() async { Future _runBenchmarks({ required List benchmarkNames, required String entryPoint, - String initialPage = BenchmarkServer.defaultInitialPage, + String initialPage = defaultInitialPage, }) async { final BenchmarkResults taskResult = await serveWebBenchmark( benchmarkAppDirectory: Directory('testing/test_app'),