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