diff --git a/dev/benchmarks/macrobenchmarks/.gitignore b/dev/benchmarks/macrobenchmarks/.gitignore index 394b6af32c5..951e36e4044 100644 --- a/dev/benchmarks/macrobenchmarks/.gitignore +++ b/dev/benchmarks/macrobenchmarks/.gitignore @@ -1,4 +1,3 @@ -lib/generated_plugin_registrant.dart devtools_memory.json *.sksl.json vmservice.out diff --git a/dev/benchmarks/macrobenchmarks/lib/src/web/bench_link_infinite_scroll.dart b/dev/benchmarks/macrobenchmarks/lib/src/web/bench_link_infinite_scroll.dart deleted file mode 100644 index e6572c671fa..00000000000 --- a/dev/benchmarks/macrobenchmarks/lib/src/web/bench_link_infinite_scroll.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2014 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 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:url_launcher/link.dart'; - - -import 'recorder.dart'; - -/// Creates an infinite list of Link widgets and scrolls it. -class BenchLinkInfiniteScroll extends WidgetRecorder { - BenchLinkInfiniteScroll.forward() - : initialOffset = 0.0, - finalOffset = 30000.0, - super(name: benchmarkName); - - BenchLinkInfiniteScroll.backward() - : initialOffset = 30000.0, - finalOffset = 0.0, - super(name: benchmarkNameBackward); - - static const String benchmarkName = 'bench_link_infinite_scroll'; - static const String benchmarkNameBackward = 'bench_link_infinite_scroll_backward'; - - final double initialOffset; - final double finalOffset; - - @override - Widget createWidget() => MaterialApp( - title: 'Infinite Link Scroll Benchmark', - home: _InfiniteScrollLinks(initialOffset, finalOffset), - ); -} - -class _InfiniteScrollLinks extends StatefulWidget { - const _InfiniteScrollLinks(this.initialOffset, this.finalOffset); - - final double initialOffset; - final double finalOffset; - - @override - State<_InfiniteScrollLinks> createState() => _InfiniteScrollLinksState(); -} - -class _InfiniteScrollLinksState extends State<_InfiniteScrollLinks> { - static const Duration stepDuration = Duration(seconds: 20); - - late ScrollController scrollController; - late double offset; - - @override - void initState() { - super.initState(); - - offset = widget.initialOffset; - - scrollController = ScrollController( - initialScrollOffset: offset, - ); - - // Without the timer the animation doesn't begin. - Timer.run(() async { - await scrollController.animateTo( - widget.finalOffset, - curve: Curves.linear, - duration: stepDuration, - ); - }); - } - - @override - void dispose() { - scrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ListView.builder( - controller: scrollController, - itemExtent: 100.0, - itemBuilder: (BuildContext context, int index) { - return SizedBox( - height: 100.0, - child: Link( - uri: Uri.parse('https://www.google.com'), - builder: (BuildContext context, FollowLink? followLink) => ElevatedButton( - onPressed: followLink, - child: const Text('Google'), - ), - ), - ); - }, - ); - } -} diff --git a/dev/benchmarks/macrobenchmarks/lib/src/web/bench_platform_view_infinite_scroll.dart b/dev/benchmarks/macrobenchmarks/lib/src/web/bench_platform_view_infinite_scroll.dart new file mode 100644 index 00000000000..7d92a5fb65f --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/lib/src/web/bench_platform_view_infinite_scroll.dart @@ -0,0 +1,119 @@ +// Copyright 2014 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 'dart:async'; +import 'dart:html' as html; + +import 'package:flutter/material.dart'; + +// TODO(mdebbar): flutter/flutter#55000 Remove this conditional import once +// web-only dart:ui_web APIs are exposed from a dedicated place. +import 'platform_views/non_web.dart' + if (dart.library.html) 'platform_views/web.dart'; +import 'recorder.dart'; + +const String benchmarkViewType = 'benchmark_element'; + +void _registerFactory() { + platformViewRegistry.registerViewFactory(benchmarkViewType, (int viewId) { + final html.Element htmlElement = html.DivElement(); + htmlElement.id = '${benchmarkViewType}_$viewId'; + htmlElement.innerText = 'Google'; + htmlElement.style + ..width = '100%' + ..height = '100%' + ..color = 'black' + ..backgroundColor = 'rgba(0, 255, 0, .5)' + ..textAlign = 'center' + ..border = '1px solid black'; + return htmlElement; + }); +} + +/// Creates an infinite list of Link widgets and scrolls it. +class BenchPlatformViewInfiniteScroll extends WidgetRecorder { + BenchPlatformViewInfiniteScroll.forward() + : initialOffset = 0.0, + finalOffset = 30000.0, + super(name: benchmarkName) { + _registerFactory(); + } + + BenchPlatformViewInfiniteScroll.backward() + : initialOffset = 30000.0, + finalOffset = 0.0, + super(name: benchmarkNameBackward) { + _registerFactory(); + } + + static const String benchmarkName = 'bench_platform_view_infinite_scroll'; + static const String benchmarkNameBackward = + 'bench_platform_view_infinite_scroll_backward'; + + final double initialOffset; + final double finalOffset; + + @override + Widget createWidget() => MaterialApp( + title: 'Infinite Platform View Scroll Benchmark', + home: _InfiniteScrollPlatformViews(initialOffset, finalOffset), + ); +} + +class _InfiniteScrollPlatformViews extends StatefulWidget { + const _InfiniteScrollPlatformViews(this.initialOffset, this.finalOffset); + + final double initialOffset; + final double finalOffset; + + @override + State<_InfiniteScrollPlatformViews> createState() => _InfiniteScrollPlatformViewsState(); +} + +class _InfiniteScrollPlatformViewsState extends State<_InfiniteScrollPlatformViews> { + static const Duration stepDuration = Duration(seconds: 20); + + late ScrollController scrollController; + late double offset; + + @override + void initState() { + super.initState(); + + offset = widget.initialOffset; + + scrollController = ScrollController( + initialScrollOffset: offset, + ); + + // Without the timer the animation doesn't begin. + Timer.run(() async { + await scrollController.animateTo( + widget.finalOffset, + curve: Curves.linear, + duration: stepDuration, + ); + }); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ListView.builder( + controller: scrollController, + itemExtent: 100.0, + itemBuilder: (BuildContext context, int index) { + return const SizedBox( + height: 100.0, + child: HtmlElementView(viewType: benchmarkViewType), + ); + }, + ); + } +} diff --git a/dev/benchmarks/macrobenchmarks/lib/src/web/platform_views/non_web.dart b/dev/benchmarks/macrobenchmarks/lib/src/web/platform_views/non_web.dart new file mode 100644 index 00000000000..199244b15e5 --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/lib/src/web/platform_views/non_web.dart @@ -0,0 +1,15 @@ +// Copyright 2014 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. + +// ignore: avoid_classes_with_only_static_members +/// Shim for web_ui engine.PlatformViewRegistry +/// https://github.com/flutter/engine/blob/master/lib/web_ui/lib/ui.dart#L62 +// ignore: camel_case_types +class platformViewRegistry { + /// Shim for registerViewFactory + /// https://github.com/flutter/engine/blob/master/lib/web_ui/lib/ui.dart#L72 + static void registerViewFactory( + String viewTypeId, dynamic Function(int viewId) viewFactory, + {bool isVisible = true}) {} +} diff --git a/dev/benchmarks/macrobenchmarks/lib/src/web/platform_views/web.dart b/dev/benchmarks/macrobenchmarks/lib/src/web/platform_views/web.dart new file mode 100644 index 00000000000..9359c81a170 --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/lib/src/web/platform_views/web.dart @@ -0,0 +1,5 @@ +// Copyright 2014 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. + +export 'dart:ui'; diff --git a/dev/benchmarks/macrobenchmarks/lib/web_benchmarks.dart b/dev/benchmarks/macrobenchmarks/lib/web_benchmarks.dart index fae34f30675..bb9d7fa7c46 100644 --- a/dev/benchmarks/macrobenchmarks/lib/web_benchmarks.dart +++ b/dev/benchmarks/macrobenchmarks/lib/web_benchmarks.dart @@ -16,7 +16,6 @@ import 'src/web/bench_default_target_platform.dart'; import 'src/web/bench_draw_rect.dart'; import 'src/web/bench_dynamic_clip_on_static_picture.dart'; import 'src/web/bench_image_decoding.dart'; -import 'src/web/bench_link_infinite_scroll.dart'; import 'src/web/bench_material_3.dart'; import 'src/web/bench_mouse_region_grid_hover.dart'; import 'src/web/bench_mouse_region_grid_scroll.dart'; @@ -24,6 +23,7 @@ import 'src/web/bench_mouse_region_mixed_grid_hover.dart'; import 'src/web/bench_pageview_scroll_linethrough.dart'; import 'src/web/bench_paths.dart'; import 'src/web/bench_picture_recording.dart'; +import 'src/web/bench_platform_view_infinite_scroll.dart'; import 'src/web/bench_simple_lazy_text_scroll.dart'; import 'src/web/bench_text_layout.dart'; import 'src/web/bench_text_out_of_picture_bounds.dart'; @@ -59,8 +59,8 @@ final Map benchmarks = { BenchMouseRegionGridHover.benchmarkName: () => BenchMouseRegionGridHover(), BenchMouseRegionMixedGridHover.benchmarkName: () => BenchMouseRegionMixedGridHover(), BenchWrapBoxScroll.benchmarkName: () => BenchWrapBoxScroll(), - BenchLinkInfiniteScroll.benchmarkName: () => BenchLinkInfiniteScroll.forward(), - BenchLinkInfiniteScroll.benchmarkNameBackward: () => BenchLinkInfiniteScroll.backward(), + BenchPlatformViewInfiniteScroll.benchmarkName: () => BenchPlatformViewInfiniteScroll.forward(), + BenchPlatformViewInfiniteScroll.benchmarkNameBackward: () => BenchPlatformViewInfiniteScroll.backward(), BenchMaterial3Components.benchmarkName: () => BenchMaterial3Components(), // CanvasKit-only benchmarks