Fix benchmark reload bug and migrate away from deprecated `js_util` APIs (#5577)
This PR:
- Ensures the benchmark client reloads with the proper `initialPage`. Without this change, the benchmark app may not reload properly, which causes a hang on the server.
- Migrates away from `js_util` APIs to `dart:ui_web`. This was causing spurious deprecation warnings.
The changes in this PR are test covered by existing tests.
diff --git a/packages/web_benchmarks/CHANGELOG.md b/packages/web_benchmarks/CHANGELOG.md
index 88f460e..7d4a422 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 43ef711..2b8e170 100644
--- a/packages/web_benchmarks/lib/client.dart
+++ b/packages/web_benchmarks/lib/client.dart
@@ -29,7 +29,10 @@
///
/// When used without a server, prompts the user to select a benchmark to
/// run next.
-Future<void> runBenchmarks(Map<String, RecorderFactory> benchmarks) async {
+Future<void> runBenchmarks(
+ Map<String, RecorderFactory> benchmarks, {
+ String initialPage = defaultInitialPage,
+}) async {
// Set local benchmarks.
_benchmarks = benchmarks;
@@ -43,7 +46,19 @@
}
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<void> _runBenchmark(String? benchmarkName) async {
diff --git a/packages/web_benchmarks/lib/server.dart b/packages/web_benchmarks/lib/server.dart
index 4aa47af..41ae762 100644
--- a/packages/web_benchmarks/lib/server.dart
+++ b/packages/web_benchmarks/lib/server.dart
@@ -8,6 +8,7 @@
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 @@
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 536cbea..5c7c725 100644
--- a/packages/web_benchmarks/lib/src/common.dart
+++ b/packages/web_benchmarks/lib/src/common.dart
@@ -14,3 +14,7 @@
/// 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 51fa697..7154386 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 @@
///
/// 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 @@
_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 142b2d1..9396f42 100644
--- a/packages/web_benchmarks/lib/src/runner.dart
+++ b/packages/web_benchmarks/lib/src/runner.dart
@@ -58,11 +58,6 @@
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 5c41da4..de97f0b 100644
--- a/packages/web_benchmarks/pubspec.yaml
+++ b/packages/web_benchmarks/pubspec.yaml
@@ -2,11 +2,11 @@
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 a208d16..5d005e2 100644
--- a/packages/web_benchmarks/testing/web_benchmarks_test.dart
+++ b/packages/web_benchmarks/testing/web_benchmarks_test.dart
@@ -8,7 +8,7 @@
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<void> main() async {
test('Can run a web benchmark', () async {
@@ -30,7 +30,7 @@
Future<void> _runBenchmarks({
required List<String> benchmarkNames,
required String entryPoint,
- String initialPage = BenchmarkServer.defaultInitialPage,
+ String initialPage = defaultInitialPage,
}) async {
final BenchmarkResults taskResult = await serveWebBenchmark(
benchmarkAppDirectory: Directory('testing/test_app'),