diff --git a/packages/devtools_app/lib/devtools.dart b/packages/devtools_app/lib/devtools.dart index ee7b6b8d5a9..fedbbb25950 100644 --- a/packages/devtools_app/lib/devtools.dart +++ b/packages/devtools_app/lib/devtools.dart @@ -9,4 +9,4 @@ // the constant declaration `const String version =`. // If you change the declaration you must also modify the regex in // tools/update_version.dart. -const String version = '2.26.0-dev.10'; +const String version = '2.26.0-dev.11'; diff --git a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart index eac33b8ec11..5352c4bc13b 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart @@ -40,6 +40,12 @@ class PerformanceController extends DisposableController timelineEventsController, rasterStatsController, ]; + + if (serviceManager.connectedApp?.isDartWebAppNow ?? false) { + // Do not perform initialization for web apps. + return; + } + // See https://github.com/dart-lang/linter/issues/3801 // ignore: discarded_futures unawaited(_init()); diff --git a/packages/devtools_app/lib/src/screens/performance/performance_screen.dart b/packages/devtools_app/lib/src/screens/performance/performance_screen.dart index faa2b24f7b1..5b5d9b2b581 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_screen.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_screen.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import '../../shared/analytics/analytics.dart' as ga; import '../../shared/banner_messages.dart'; import '../../shared/common_widgets.dart'; +import '../../shared/feature_flags.dart'; import '../../shared/globals.dart'; import '../../shared/primitives/auto_dispose.dart'; import '../../shared/screen.dart'; @@ -25,7 +26,6 @@ class PerformanceScreen extends Screen { PerformanceScreen() : super.conditional( id: id, - requiresDartVm: true, worksOffline: true, title: ScreenMetaData.performance.title, icon: ScreenMetaData.performance.icon, @@ -37,7 +37,13 @@ class PerformanceScreen extends Screen { String get docPageId => id; @override - Widget build(BuildContext context) => const PerformanceScreenBody(); + Widget build(BuildContext context) { + if (FeatureFlags.performancePageForWeb && + (serviceManager.connectedApp?.isDartWebAppNow ?? false)) { + return const WebPerformanceScreenBody(); + } + return const PerformanceScreenBody(); + } } class PerformanceScreenBody extends StatefulWidget { @@ -119,3 +125,14 @@ class PerformanceScreenBodyState extends State ); } } + +class WebPerformanceScreenBody extends StatelessWidget { + const WebPerformanceScreenBody({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text('TODO: add instructions for using Chrome DevTools'), + ); + } +} diff --git a/packages/devtools_app/lib/src/shared/console/console.dart b/packages/devtools_app/lib/src/shared/console/console.dart index b6450ce0791..cc947903e37 100644 --- a/packages/devtools_app/lib/src/shared/console/console.dart +++ b/packages/devtools_app/lib/src/shared/console/console.dart @@ -210,6 +210,7 @@ class _ConsoleOutputState extends State<_ConsoleOutput> } else if (line is VariableConsoleLine) { return ExpandableVariable( variable: line.variable, + isSelectable: false, ); } else { assert( diff --git a/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart b/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart index 12348396817..5ed55f7e615 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart @@ -17,6 +17,7 @@ class ExpandableVariable extends StatelessWidget { Key? key, this.variable, this.dataDisplayProvider, + this.isSelectable = true, }) : super(key: key); @visibleForTesting @@ -25,6 +26,8 @@ class ExpandableVariable extends StatelessWidget { final DartObjectNode? variable; final Widget Function(DartObjectNode, void Function())? dataDisplayProvider; + final bool isSelectable; + @override Widget build(BuildContext context) { final variable = this.variable; @@ -42,6 +45,7 @@ class ExpandableVariable extends StatelessWidget { onTap: onPressed, ), onItemSelected: onItemPressed, + isSelectable: isSelectable, ); } diff --git a/packages/devtools_app/lib/src/shared/feature_flags.dart b/packages/devtools_app/lib/src/shared/feature_flags.dart index 6117c85e477..98ce076c7e4 100644 --- a/packages/devtools_app/lib/src/shared/feature_flags.dart +++ b/packages/devtools_app/lib/src/shared/feature_flags.dart @@ -74,6 +74,13 @@ abstract class FeatureFlags { /// https://github.com/flutter/devtools/issues/1632 static bool devToolsExtensions = enableExperiments; + // TODO(elliottbrooks): remove this flag once you add instructions to the + // web performance page body. + /// Flag to enable the Performance page for web. + /// + /// https://github.com/flutter/devtools/issues/6095 + static bool get performancePageForWeb => enableExperiments; + /// Stores a map of all the feature flags for debugging purposes. /// /// When adding a new flag, you are responsible for adding it to this map as diff --git a/packages/devtools_app/lib/src/shared/tree.dart b/packages/devtools_app/lib/src/shared/tree.dart index 8bafdb648ee..3b0e7f36b1b 100644 --- a/packages/devtools_app/lib/src/shared/tree.dart +++ b/packages/devtools_app/lib/src/shared/tree.dart @@ -26,6 +26,7 @@ class TreeView> extends StatefulWidget { this.emptyTreeViewBuilder, this.scrollController, this.includeScrollbar = false, + this.isSelectable = true, }); final ValueListenable> dataRootsListenable; @@ -52,6 +53,8 @@ class TreeView> extends StatefulWidget { final bool includeScrollbar; + final bool isSelectable; + @override State> createState() => _TreeViewState(); } @@ -75,8 +78,8 @@ class _TreeViewState> extends State> if (dataFlatList.isEmpty) return _emptyTreeViewBuilder(); final content = SizedBox( height: dataFlatList.length * defaultTreeViewRowHeight, - child: SelectionArea( - child: ListView.builder( + child: _maybeWrapInSelectionArea( + ListView.builder( itemCount: dataFlatList.length, itemExtent: defaultTreeViewRowHeight, physics: const ClampingScrollPhysics(), @@ -111,6 +114,13 @@ class _TreeViewState> extends State> return const SizedBox(); } + Widget _maybeWrapInSelectionArea(Widget tree) { + if (widget.isSelectable) { + return SelectionArea(child: tree); + } + return tree; + } + // TODO(kenz): animate expansions and collapses. void _onItemSelected(T item) async { // Order of execution matters for the below calls. diff --git a/packages/devtools_app/pubspec.yaml b/packages/devtools_app/pubspec.yaml index a247e31143c..8ef1cc9cb08 100644 --- a/packages/devtools_app/pubspec.yaml +++ b/packages/devtools_app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none # Note: this version should only be updated by running tools/update_version.dart # that updates all versions of devtools packages (devtools_app, devtools_test). -version: 2.26.0-dev.10 +version: 2.26.0-dev.11 repository: https://github.com/flutter/devtools/tree/master/packages/devtools_app @@ -24,7 +24,7 @@ dependencies: codicon: ^1.0.0 collection: ^1.15.0 dds_service_extensions: ^1.3.2 - devtools_shared: 2.26.0-dev.10 + devtools_shared: 2.26.0-dev.11 devtools_extensions: path: ../devtools_extensions file: ^6.0.0 @@ -68,7 +68,7 @@ dependencies: dev_dependencies: args: ^2.4.2 build_runner: ^2.3.3 - devtools_test: 2.26.0-dev.10 + devtools_test: 2.26.0-dev.11 fake_async: ^1.3.1 flutter_driver: sdk: flutter diff --git a/packages/devtools_app/test/performance/performance_screen_test.dart b/packages/devtools_app/test/performance/performance_screen_test.dart index e24c92ffcb8..9da921f8d11 100644 --- a/packages/devtools_app/test/performance/performance_screen_test.dart +++ b/packages/devtools_app/test/performance/performance_screen_test.dart @@ -11,6 +11,7 @@ import 'package:devtools_app/src/screens/performance/panes/flutter_frames/flutte import 'package:devtools_app/src/screens/performance/panes/timeline_events/legacy/event_details.dart'; import 'package:devtools_app/src/screens/performance/panes/timeline_events/legacy/timeline_flame_chart.dart'; import 'package:devtools_app/src/screens/performance/tabbed_performance_view.dart'; +import 'package:devtools_app/src/shared/feature_flags.dart'; import 'package:devtools_shared/devtools_test_utils.dart'; import 'package:devtools_test/devtools_test.dart'; import 'package:flutter/material.dart'; @@ -70,7 +71,9 @@ void main() { }) async { await tester.pumpWidget( wrapWithControllers( - const PerformanceScreenBody(), + Builder( + builder: PerformanceScreen().build, + ), performance: controller, ), ); @@ -111,6 +114,8 @@ void main() { await tester.runAsync(() async { await pumpPerformanceScreen(tester, runAsync: true); await tester.pumpAndSettle(); + expect(find.byType(PerformanceScreenBody), findsOneWidget); + expect(find.byType(WebPerformanceScreenBody), findsNothing); expect(find.byType(PerformanceControls), findsOneWidget); expect(find.byType(FlutterFramesChart), findsOneWidget); expect(find.byType(TabbedPerformanceView), findsOneWidget); @@ -122,6 +127,32 @@ void main() { }, ); + testWidgetsWithWindowSize( + 'builds initial content for web app', + windowSize, + (WidgetTester tester) async { + setEnableExperiments(); + mockConnectedApp( + fakeServiceManager.connectedApp!, + isFlutterApp: false, + isProfileBuild: false, + isWebApp: true, + ); + await tester.pumpWidget( + wrap( + Builder(builder: PerformanceScreen().build), + ), + ); + await tester.pumpAndSettle(); + expect(find.byType(PerformanceScreenBody), findsNothing); + expect(find.byType(WebPerformanceScreenBody), findsOneWidget); + expect( + find.text('TODO: add instructions for using Chrome DevTools'), + findsOneWidget, + ); + }, + ); + testWidgetsWithWindowSize( 'builds initial content for non-flutter app', windowSize, diff --git a/packages/devtools_app/test/shared/visible_screens_test.dart b/packages/devtools_app/test/shared/visible_screens_test.dart index 84035c17fed..e1d80e40b5b 100644 --- a/packages/devtools_app/test/shared/visible_screens_test.dart +++ b/packages/devtools_app/test/shared/visible_screens_test.dart @@ -90,7 +90,7 @@ void main() { HomeScreen, // InspectorScreen, // LegacyPerformanceScreen, - // PerformanceScreen, + PerformanceScreen, // ProfilerScreen, // MemoryScreen, DebuggerScreen, @@ -161,7 +161,7 @@ void main() { HomeScreen, InspectorScreen, // LegacyPerformanceScreen, - // PerformanceScreen, + PerformanceScreen, // ProfilerScreen, // MemoryScreen, DebuggerScreen, diff --git a/packages/devtools_shared/pubspec.yaml b/packages/devtools_shared/pubspec.yaml index 59991bcd6ea..4a0d7c3ba76 100644 --- a/packages/devtools_shared/pubspec.yaml +++ b/packages/devtools_shared/pubspec.yaml @@ -1,7 +1,7 @@ name: devtools_shared description: Package of shared structures between devtools_app, dds, and other tools. -version: 2.26.0-dev.10 +version: 2.26.0-dev.11 repository: https://github.com/flutter/devtools/tree/master/packages/devtools_shared diff --git a/packages/devtools_test/pubspec.yaml b/packages/devtools_test/pubspec.yaml index e18b39009ef..aa77761247c 100644 --- a/packages/devtools_test/pubspec.yaml +++ b/packages/devtools_test/pubspec.yaml @@ -7,7 +7,7 @@ publish_to: none # When publishing new versions of this package be sure to publish a new version # of package:devtools as well. package:devtools contains a compiled snapshot of # this package. -version: 2.26.0-dev.10 +version: 2.26.0-dev.11 repository: https://github.com/flutter/devtools/tree/master/packages/devtools_test @@ -18,8 +18,8 @@ environment: dependencies: async: ^2.0.0 collection: ^1.15.0 - devtools_shared: 2.26.0-dev.10 - devtools_app: 2.26.0-dev.10 + devtools_shared: 2.26.0-dev.11 + devtools_app: 2.26.0-dev.11 flutter: sdk: flutter flutter_test: