diff --git a/dev/automated_tests/pubspec.yaml b/dev/automated_tests/pubspec.yaml index c9c2dc5991..2fffc2419b 100644 --- a/dev/automated_tests/pubspec.yaml +++ b/dev/automated_tests/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -65,4 +65,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 5cc4 +# PUBSPEC CHECKSUM: f3c5 diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml index becfef6306..3b0c7e4ecd 100644 --- a/dev/benchmarks/complex_layout/pubspec.yaml +++ b/dev/benchmarks/complex_layout/pubspec.yaml @@ -43,7 +43,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.18 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -82,4 +82,4 @@ flutter: - packages/flutter_gallery_assets/people/square/ali.png - packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png -# PUBSPEC CHECKSUM: f699 +# PUBSPEC CHECKSUM: f69a diff --git a/dev/benchmarks/macrobenchmarks/pubspec.yaml b/dev/benchmarks/macrobenchmarks/pubspec.yaml index f12d528aa5..f7f56ec595 100644 --- a/dev/benchmarks/macrobenchmarks/pubspec.yaml +++ b/dev/benchmarks/macrobenchmarks/pubspec.yaml @@ -43,7 +43,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.18 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -79,4 +79,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: f699 +# PUBSPEC CHECKSUM: f69a diff --git a/dev/benchmarks/microbenchmarks/pubspec.yaml b/dev/benchmarks/microbenchmarks/pubspec.yaml index 64dfdf336b..a18484d9aa 100644 --- a/dev/benchmarks/microbenchmarks/pubspec.yaml +++ b/dev/benchmarks/microbenchmarks/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -73,4 +73,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: ce27 +# PUBSPEC CHECKSUM: 1128 diff --git a/dev/bots/pubspec.yaml b/dev/bots/pubspec.yaml index 0fa88143f6..3b047a63fb 100644 --- a/dev/bots/pubspec.yaml +++ b/dev/bots/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: path: 1.6.2 - args: 1.5.1 + args: 1.5.2 meta: 1.1.6 process: 3.0.9 platform: 2.2.0 @@ -64,7 +64,7 @@ dependencies: yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: - mockito: 4.0.0 + mockito: 4.1.0 test_api: 0.2.5 -# PUBSPEC CHECKSUM: 7f9d +# PUBSPEC CHECKSUM: ee9f diff --git a/dev/devicelab/bin/tasks/linux_chrome_dev_mode.dart b/dev/devicelab/bin/tasks/linux_chrome_dev_mode.dart new file mode 100644 index 0000000000..a11b0ab96e --- /dev/null +++ b/dev/devicelab/bin/tasks/linux_chrome_dev_mode.dart @@ -0,0 +1,10 @@ +// Copyright 2019 The Chromium 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 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/web_dev_mode_tests.dart'; + +Future main() async { + await task(createWebDevModeTest()); +} diff --git a/dev/devicelab/bin/tasks/macos_chrome_dev_mode.dart b/dev/devicelab/bin/tasks/macos_chrome_dev_mode.dart new file mode 100644 index 0000000000..a11b0ab96e --- /dev/null +++ b/dev/devicelab/bin/tasks/macos_chrome_dev_mode.dart @@ -0,0 +1,10 @@ +// Copyright 2019 The Chromium 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 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/web_dev_mode_tests.dart'; + +Future main() async { + await task(createWebDevModeTest()); +} diff --git a/dev/devicelab/bin/tasks/windows_chrome_dev_mode.dart b/dev/devicelab/bin/tasks/windows_chrome_dev_mode.dart new file mode 100644 index 0000000000..a11b0ab96e --- /dev/null +++ b/dev/devicelab/bin/tasks/windows_chrome_dev_mode.dart @@ -0,0 +1,10 @@ +// Copyright 2019 The Chromium 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 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/web_dev_mode_tests.dart'; + +Future main() async { + await task(createWebDevModeTest()); +} diff --git a/dev/devicelab/lib/tasks/web_dev_mode_tests.dart b/dev/devicelab/lib/tasks/web_dev_mode_tests.dart new file mode 100644 index 0000000000..5a5628f0d1 --- /dev/null +++ b/dev/devicelab/lib/tasks/web_dev_mode_tests.dart @@ -0,0 +1,139 @@ +// Copyright 2019 The Chromium 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:convert'; +import 'dart:io'; + +import 'package:path/path.dart' as path; + +import '../framework/framework.dart'; +import '../framework/utils.dart'; + +final Directory _editedFlutterGalleryDir = dir(path.join(Directory.systemTemp.path, 'edited_flutter_gallery')); +final Directory flutterGalleryDir = dir(path.join(flutterDirectory.path, 'examples/flutter_gallery')); + +TaskFunction createWebDevModeTest() { + return () async { + final List options = [ + '--hot', '-d', 'web', '--verbose', '--resident', '--target=lib/main_web.dart', + ]; + setLocalEngineOptionIfNecessary(options); + int hotRestartCount = 0; + await inDirectory(flutterDirectory, () async { + rmTree(_editedFlutterGalleryDir); + mkdirs(_editedFlutterGalleryDir); + recursiveCopy(flutterGalleryDir, _editedFlutterGalleryDir); + await inDirectory(_editedFlutterGalleryDir, () async { + { + final Process packagesGet = await startProcess( + path.join(flutterDirectory.path, 'bin', 'flutter'), + ['packages', 'get'], + environment: { + 'FLUTTER_WEB': 'true', + }, + ); + await packagesGet.exitCode; + final Process process = await startProcess( + path.join(flutterDirectory.path, 'bin', 'flutter'), + ['run']..addAll(options), + environment: { + 'FLUTTER_WEB': 'true', + }, + ); + + final Completer stdoutDone = Completer(); + final Completer stderrDone = Completer(); + process.stdout + .transform(utf8.decoder) + .transform(const LineSplitter()) + .listen((String line) { + if (line.contains('To hot restart')) { + process.stdin.write('R'); + } + if (line.contains('Restarted')) { + if (hotRestartCount == 0) { + // Update the file and reload again. + final File appDartSource = file(path.join( + _editedFlutterGalleryDir.path, 'lib/gallery/app.dart', + )); + appDartSource.writeAsStringSync( + appDartSource.readAsStringSync().replaceFirst( + "'Flutter Gallery'", "'Updated Flutter Gallery'", + ) + ); + process.stdin.writeln('R'); + ++hotRestartCount; + } else { + // Quit after second hot restart. + process.stdin.writeln('q'); + } + } + print('stdout: $line'); + }, onDone: () { + stdoutDone.complete(); + }); + process.stderr + .transform(utf8.decoder) + .transform(const LineSplitter()) + .listen((String line) { + print('stderr: $line'); + }, onDone: () { + stderrDone.complete(); + }); + + await Future.wait(>[ + stdoutDone.future, + stderrDone.future, + ]); + await process.exitCode; + + } + + // Start `flutter run` again to make sure it loads from the previous + // state. dev compilers loads up from previously compiled JavaScript. + { + final Process process = await startProcess( + path.join(flutterDirectory.path, 'bin', 'flutter'), + ['run']..addAll(options), + environment: { + 'FLUTTER_WEB': 'true', + }, + ); + final Completer stdoutDone = Completer(); + final Completer stderrDone = Completer(); + process.stdout + .transform(utf8.decoder) + .transform(const LineSplitter()) + .listen((String line) { + if (line.contains('To hot restart')) { + process.stdin.write('R'); + } + if (line.contains('Restarted')) { + process.stdin.writeln('q'); + } + print('stdout: $line'); + }, onDone: () { + stdoutDone.complete(); + }); + process.stderr + .transform(utf8.decoder) + .transform(const LineSplitter()) + .listen((String line) { + print('stderr: $line'); + }, onDone: () { + stderrDone.complete(); + }); + + await Future.wait(>[ + stdoutDone.future, + stderrDone.future, + ]); + await process.exitCode; + } + }); + }); + return TaskResult.success(null); + }; +} diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml index 0c976c9b95..e8ec205d8b 100644 --- a/dev/devicelab/manifest.yaml +++ b/dev/devicelab/manifest.yaml @@ -125,6 +125,13 @@ tasks: stage: devicelab_win required_agent_capabilities: ["windows/android"] + windows_chrome_dev_mode: + description: > + Run flutter web on the devicelab and hot restart. + stage: devicelab_win + required_agent_capabilities: ["windows/android"] + flaky: true + # Android on-device tests complex_layout_scroll_perf__timeline_summary: @@ -324,6 +331,13 @@ tasks: stage: devicelab required_agent_capabilities: ["linux/android"] + linux_chrome_dev_mode: + description: > + Run flutter web on the devicelab and hot restart. + stage: devicelab_win + required_agent_capabilities: ["linux/android"] + flaky: true + # iOS on-device tests flavors_test_ios: @@ -421,6 +435,13 @@ tasks: stage: devicelab_ios required_agent_capabilities: ["mac/ios"] + macos_chrome_dev_mode: + description: > + Run flutter web on the devicelab and hot restart. + stage: devicelab_win + required_agent_capabilities: ["mac/ios"] + flaky: true + # Tests running on Windows host flavors_test_win: diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml index db2cd556fd..7720b330a7 100644 --- a/dev/devicelab/pubspec.yaml +++ b/dev/devicelab/pubspec.yaml @@ -8,7 +8,7 @@ environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" dependencies: - args: 1.5.1 + args: 1.5.2 file: 5.0.8 image: 2.1.3 meta: 1.1.6 @@ -73,4 +73,4 @@ dev_dependencies: watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: b018 +# PUBSPEC CHECKSUM: e419 diff --git a/dev/integration_tests/android_semantics_testing/pubspec.yaml b/dev/integration_tests/android_semantics_testing/pubspec.yaml index 571f789961..dd9f6acac6 100644 --- a/dev/integration_tests/android_semantics_testing/pubspec.yaml +++ b/dev/integration_tests/android_semantics_testing/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -63,4 +63,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: d60e +# PUBSPEC CHECKSUM: 820f diff --git a/dev/integration_tests/android_views/pubspec.yaml b/dev/integration_tests/android_views/pubspec.yaml index bf9e305910..74356bdac2 100644 --- a/dev/integration_tests/android_views/pubspec.yaml +++ b/dev/integration_tests/android_views/pubspec.yaml @@ -40,7 +40,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.18 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -76,4 +76,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 10be +# PUBSPEC CHECKSUM: fdbf diff --git a/dev/integration_tests/channels/pubspec.yaml b/dev/integration_tests/channels/pubspec.yaml index 150a7685df..a0a74cdceb 100644 --- a/dev/integration_tests/channels/pubspec.yaml +++ b/dev/integration_tests/channels/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: d60e +# PUBSPEC CHECKSUM: 820f diff --git a/dev/integration_tests/codegen/pubspec.yaml b/dev/integration_tests/codegen/pubspec.yaml index 229c3e4f0f..baca4ae8db 100644 --- a/dev/integration_tests/codegen/pubspec.yaml +++ b/dev/integration_tests/codegen/pubspec.yaml @@ -35,7 +35,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.18 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -74,4 +74,4 @@ builders: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: d60e +# PUBSPEC CHECKSUM: 820f diff --git a/dev/integration_tests/external_ui/pubspec.yaml b/dev/integration_tests/external_ui/pubspec.yaml index 17e47393b1..8827df8515 100644 --- a/dev/integration_tests/external_ui/pubspec.yaml +++ b/dev/integration_tests/external_ui/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: d60e +# PUBSPEC CHECKSUM: 820f diff --git a/dev/integration_tests/flavors/pubspec.yaml b/dev/integration_tests/flavors/pubspec.yaml index 8ef036a1f0..d6a9adaca7 100644 --- a/dev/integration_tests/flavors/pubspec.yaml +++ b/dev/integration_tests/flavors/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: d60e +# PUBSPEC CHECKSUM: 820f diff --git a/dev/integration_tests/image_loading/pubspec.yaml b/dev/integration_tests/image_loading/pubspec.yaml index 09b3790fed..9d2f5c60e3 100644 --- a/dev/integration_tests/image_loading/pubspec.yaml +++ b/dev/integration_tests/image_loading/pubspec.yaml @@ -5,10 +5,10 @@ dependencies: flutter: sdk: flutter test: 1.6.3 - mockito: 4.0.0 + mockito: 4.1.0 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -60,4 +60,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: bf1e +# PUBSPEC CHECKSUM: 8420 diff --git a/dev/integration_tests/platform_interaction/pubspec.yaml b/dev/integration_tests/platform_interaction/pubspec.yaml index 8171255894..9e483e4601 100644 --- a/dev/integration_tests/platform_interaction/pubspec.yaml +++ b/dev/integration_tests/platform_interaction/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: d60e +# PUBSPEC CHECKSUM: 820f diff --git a/dev/integration_tests/simple_codegen/pubspec.yaml b/dev/integration_tests/simple_codegen/pubspec.yaml index 3f13bf2fbf..024082e007 100644 --- a/dev/integration_tests/simple_codegen/pubspec.yaml +++ b/dev/integration_tests/simple_codegen/pubspec.yaml @@ -5,7 +5,7 @@ dependencies: build: 1.1.4 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -32,4 +32,4 @@ environment: # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite. sdk: ">=2.0.0-dev.68.0 <3.0.0" -# PUBSPEC CHECKSUM: 669a +# PUBSPEC CHECKSUM: 069b diff --git a/dev/integration_tests/ui/pubspec.yaml b/dev/integration_tests/ui/pubspec.yaml index 3454f9d59e..cba14c5914 100644 --- a/dev/integration_tests/ui/pubspec.yaml +++ b/dev/integration_tests/ui/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" archive: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -77,4 +77,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 1b28 +# PUBSPEC CHECKSUM: 3129 diff --git a/dev/manual_tests/pubspec.yaml b/dev/manual_tests/pubspec.yaml index 703c255a9c..4ceeef249b 100644 --- a/dev/manual_tests/pubspec.yaml +++ b/dev/manual_tests/pubspec.yaml @@ -17,7 +17,7 @@ dev_dependencies: flutter_test: sdk: flutter - mockito: 4.0.0 + mockito: 4.1.0 async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -36,4 +36,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 949f +# PUBSPEC CHECKSUM: 0ba0 diff --git a/dev/snippets/pubspec.yaml b/dev/snippets/pubspec.yaml index f0502917b2..9422e4aac9 100644 --- a/dev/snippets/pubspec.yaml +++ b/dev/snippets/pubspec.yaml @@ -13,7 +13,7 @@ dartdoc: nodoc: true dependencies: - args: 1.5.1 + args: 1.5.2 dart_style: 1.2.7 meta: 1.1.6 platform: 2.2.0 @@ -98,4 +98,4 @@ executables: vm_service_client: 0.2.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 6b2c +# PUBSPEC CHECKSUM: 052d diff --git a/dev/tools/gen_keycodes/pubspec.yaml b/dev/tools/gen_keycodes/pubspec.yaml index 0b1f93500b..cabc93895c 100644 --- a/dev/tools/gen_keycodes/pubspec.yaml +++ b/dev/tools/gen_keycodes/pubspec.yaml @@ -6,7 +6,7 @@ environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" dependencies: - args: 1.5.1 + args: 1.5.2 http: 0.12.0+2 path: 1.6.2 platform: 2.2.0 @@ -22,4 +22,4 @@ dependencies: term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 8bd3 +# PUBSPEC CHECKSUM: 24d4 diff --git a/dev/tools/pubspec.yaml b/dev/tools/pubspec.yaml index bf6f713887..be0a7f7cca 100644 --- a/dev/tools/pubspec.yaml +++ b/dev/tools/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: archive: 2.0.9 - args: 1.5.1 + args: 1.5.2 http: 0.12.0+2 intl: 0.15.8 meta: 1.1.6 @@ -30,11 +30,11 @@ dependencies: dev_dependencies: test_api: 0.2.5 - mockito: 4.0.0 + mockito: 4.1.0 boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" stack_trace: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 470f +# PUBSPEC CHECKSUM: a711 diff --git a/dev/tools/vitool/pubspec.yaml b/dev/tools/vitool/pubspec.yaml index c9c6437fe7..e7fc5a7f0b 100644 --- a/dev/tools/vitool/pubspec.yaml +++ b/dev/tools/vitool/pubspec.yaml @@ -9,7 +9,7 @@ environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" dependencies: - args: 1.5.1 + args: 1.5.2 vector_math: 2.0.8 xml: 3.5.0 @@ -37,4 +37,4 @@ dev_dependencies: term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: b74d +# PUBSPEC CHECKSUM: 3d4e diff --git a/examples/catalog/pubspec.yaml b/examples/catalog/pubspec.yaml index f5f77ec051..70e2c7e992 100644 --- a/examples/catalog/pubspec.yaml +++ b/examples/catalog/pubspec.yaml @@ -23,7 +23,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -73,4 +73,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 5ff8 +# PUBSPEC CHECKSUM: 25f9 diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml index 780e46c6ff..0463f8d1dc 100644 --- a/examples/flutter_gallery/pubspec.yaml +++ b/examples/flutter_gallery/pubspec.yaml @@ -39,7 +39,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -253,4 +253,4 @@ flutter: - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf -# PUBSPEC CHECKSUM: 8760 +# PUBSPEC CHECKSUM: e061 diff --git a/examples/platform_channel/pubspec.yaml b/examples/platform_channel/pubspec.yaml index 9433dfa85d..50bc7d5e75 100644 --- a/examples/platform_channel/pubspec.yaml +++ b/examples/platform_channel/pubspec.yaml @@ -21,7 +21,7 @@ dev_dependencies: test: 1.6.3 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -72,4 +72,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 5ff8 +# PUBSPEC CHECKSUM: 25f9 diff --git a/examples/stocks/pubspec.yaml b/examples/stocks/pubspec.yaml index e9aea00083..f10e89a261 100644 --- a/examples/stocks/pubspec.yaml +++ b/examples/stocks/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: isolate: 2.0.2 analyzer: 0.36.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -62,4 +62,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 63b7 +# PUBSPEC CHECKSUM: 69b8 diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index a035993d1b..e4afaebfe5 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -22,7 +22,7 @@ dev_dependencies: sdk: flutter flutter_goldens: sdk: flutter - mockito: 4.0.0 + mockito: 4.1.0 async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -42,4 +42,4 @@ dev_dependencies: term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 94dc +# PUBSPEC CHECKSUM: 45dd diff --git a/packages/flutter_driver/pubspec.yaml b/packages/flutter_driver/pubspec.yaml index eb36b72078..70c267920f 100644 --- a/packages/flutter_driver/pubspec.yaml +++ b/packages/flutter_driver/pubspec.yaml @@ -43,7 +43,7 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: - mockito: 4.0.0 + mockito: 4.1.0 quiver: 2.0.3 -# PUBSPEC CHECKSUM: b48d +# PUBSPEC CHECKSUM: ef8e diff --git a/packages/flutter_goldens/pubspec.yaml b/packages/flutter_goldens/pubspec.yaml index 2a53afc8a4..cf846a1cb3 100644 --- a/packages/flutter_goldens/pubspec.yaml +++ b/packages/flutter_goldens/pubspec.yaml @@ -33,6 +33,6 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: - mockito: 4.0.0 + mockito: 4.1.0 -# PUBSPEC CHECKSUM: 046a +# PUBSPEC CHECKSUM: 926b diff --git a/packages/flutter_localizations/pubspec.yaml b/packages/flutter_localizations/pubspec.yaml index d73ddefd18..7c50e3dd40 100644 --- a/packages/flutter_localizations/pubspec.yaml +++ b/packages/flutter_localizations/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mockito: 4.0.0 + mockito: 4.1.0 async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -35,4 +35,4 @@ dev_dependencies: term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 4ddd +# PUBSPEC CHECKSUM: c3de diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index 182130a5dc..e15a3ae4bc 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -43,8 +43,8 @@ import 'macos/xcode_validator.dart'; import 'run_hot.dart'; import 'usage.dart'; import 'version.dart'; +import 'web/chrome.dart'; import 'web/compile.dart'; -import 'web/web_device.dart'; import 'windows/windows_workflow.dart'; Future runInContext( diff --git a/packages/flutter_tools/lib/src/resident_web_runner.dart b/packages/flutter_tools/lib/src/resident_web_runner.dart index ba774a6444..b9523b85b9 100644 --- a/packages/flutter_tools/lib/src/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/resident_web_runner.dart @@ -5,11 +5,14 @@ import 'dart:async'; import 'package:meta/meta.dart'; +import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; import 'asset.dart'; import 'base/common.dart'; import 'base/file_system.dart'; +import 'base/logger.dart'; import 'base/terminal.dart'; +import 'base/utils.dart'; import 'build_info.dart'; import 'bundle.dart'; import 'dart/package_map.dart'; @@ -19,8 +22,8 @@ import 'project.dart'; import 'resident_runner.dart'; import 'run_hot.dart'; import 'web/asset_server.dart'; +import 'web/chrome.dart'; import 'web/compile.dart'; -import 'web/web_device.dart'; /// A hot-runner which handles browser specific delegation. class ResidentWebRunner extends ResidentRunner { @@ -44,6 +47,7 @@ class ResidentWebRunner extends ResidentRunner { WebAssetServer _server; ProjectFileInvalidator projectFileInvalidator; DateTime _lastCompiled; + WipConnection _connection; final FlutterProject flutterProject; @override @@ -58,12 +62,16 @@ class ResidentWebRunner extends ResidentRunner { } @override - Future cleanupAfterSignal() { + Future cleanupAfterSignal() async { + await _connection.sendCommand('Browser.close'); + _connection = null; return _server?.dispose(); } @override - Future cleanupAtFinish() { + Future cleanupAtFinish() async { + await _connection?.sendCommand('Browser.close'); + _connection = null; return _server?.dispose(); } @@ -128,7 +136,15 @@ class ResidentWebRunner extends ResidentRunner { await _server.initialize(); // Step 3: Spawn an instance of Chrome and direct it to the created server. - await chromeLauncher.launch('http:localhost:${_server.port}'); + final String url = 'http://localhost:${_server.port}'; + final Chrome chrome = await chromeLauncher.launch(url); + final ChromeTab chromeTab = await chrome.chromeConnection.getTab((ChromeTab chromeTab) { + return chromeTab.url.contains(url); // we don't care about trailing slashes or # + }); + _connection = await chromeTab.connect(); + _connection.onClose.listen((WipConnection connection) { + appFinished(); + }); // We don't support the debugging proxy yet. appStartedCompleter?.complete(); @@ -139,23 +155,39 @@ class ResidentWebRunner extends ResidentRunner { } @override - Future restart( - {bool fullRestart = false, - bool pauseAfterRestart = false, - String reason, - bool benchmarkMode = false}) async { - final List invalidatedSources = ProjectFileInvalidator.findInvalidated( - lastCompiled: _lastCompiled, - urisToMonitor: [ - for (FileSystemEntity entity in flutterProject.directory - .childDirectory('lib') - .listSync(recursive: true)) - if (entity is File && entity.path.endsWith('.dart')) entity.uri - ], // Add new class to track this for web. - packagesPath: PackageMap.globalPackagesPath, + Future restart({ + bool fullRestart = false, + bool pauseAfterRestart = false, + String reason, + bool benchmarkMode = false, + }) async { + final Stopwatch timer = Stopwatch()..start(); + final Status status = logger.startProgress( + 'Performing hot restart...', + timeout: timeoutConfiguration.fastOperation, + progressId: 'hot.restart', ); - await webCompilationProxy.invalidate(inputs: invalidatedSources); - printStatus('Sources updated, refresh browser'); - return OperationResult.ok; + OperationResult result = OperationResult.ok; + try { + final List invalidatedSources = ProjectFileInvalidator.findInvalidated( + lastCompiled: _lastCompiled, + urisToMonitor: [ + for (FileSystemEntity entity in flutterProject.directory + .childDirectory('lib') + .listSync(recursive: true)) + if (entity is File && entity.path.endsWith('.dart')) entity.uri + ], // Add new class to track this for web. + packagesPath: PackageMap.globalPackagesPath, + ); + await webCompilationProxy.invalidate(inputs: invalidatedSources); + await _connection.sendCommand('Page.reload'); + await Future.delayed(const Duration(milliseconds: 150)); + } catch (err) { + result = OperationResult(1, err.toString()); + } finally { + printStatus('Restarted application in ${getElapsedAsMilliseconds(timer.elapsed)}.'); + status.cancel(); + } + return result; } } diff --git a/packages/flutter_tools/lib/src/web/asset_server.dart b/packages/flutter_tools/lib/src/web/asset_server.dart index d4ad143b3c..730692c000 100644 --- a/packages/flutter_tools/lib/src/web/asset_server.dart +++ b/packages/flutter_tools/lib/src/web/asset_server.dart @@ -170,7 +170,6 @@ class WebAssetServer { Future _completeRequest(HttpRequest request, File file, [String contentType = 'text']) async { - printTrace('looking for ${request.uri} at ${file.path}'); if (!file.existsSync()) { request.response.statusCode = HttpStatus.notFound; await request.response.close(); diff --git a/packages/flutter_tools/lib/src/web/chrome.dart b/packages/flutter_tools/lib/src/web/chrome.dart new file mode 100644 index 0000000000..1f7e5f19ef --- /dev/null +++ b/packages/flutter_tools/lib/src/web/chrome.dart @@ -0,0 +1,173 @@ +// Copyright 2019 The Chromium 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:webkit_inspection_protocol/webkit_inspection_protocol.dart'; + +import '../base/common.dart'; +import '../base/context.dart'; +import '../base/file_system.dart'; +import '../base/io.dart'; +import '../base/os.dart'; +import '../base/platform.dart'; +import '../base/process_manager.dart'; +import '../convert.dart'; + +/// The [ChromeLauncher] instance. +ChromeLauncher get chromeLauncher => context.get(); + +const String _kChromeEnvironment = 'CHROME_EXECUTABLE'; +const String _kLinuxExecutable = 'google-chrome'; +const String _kMacOSExecutable = + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'; +const String _kWindowsExecutable = r'Google\Chrome\Application\chrome.exe'; +final List _kWindowsPrefixes = [ + platform.environment['LOCALAPPDATA'], + platform.environment['PROGRAMFILES'], + platform.environment['PROGRAMFILES(X86)'] +]; + +// Responsible for launching chrome with devtools configured. +class ChromeLauncher { + const ChromeLauncher(); + + static final Completer _currentCompleter = Completer(); + + /// Launch the chrome browser to a particular `host` page. + Future launch(String url) async { + final String chromeExecutable = _findExecutable(); + final Directory dataDir = fs.systemTempDirectory.createTempSync(); + final int port = await os.findFreePort(); + final List args = [ + chromeExecutable, + // Using a tmp directory ensures that a new instance of chrome launches + // allowing for the remote debug port to be enabled. + '--user-data-dir=${dataDir.path}', + '--remote-debugging-port=$port', + // When the DevTools has focus we don't want to slow down the application. + '--disable-background-timer-throttling', + // Since we are using a temp profile, disable features that slow the + // Chrome launch. + '--disable-extensions', + '--disable-popup-blocking', + '--bwsi', + '--no-first-run', + '--no-default-browser-check', + '--disable-default-apps', + '--disable-translate', + url, + ]; + final Process process = await processManager.start(args); + + // Wait until the DevTools are listening before trying to connect. + await process.stderr + .transform(utf8.decoder) + .transform(const LineSplitter()) + .firstWhere((String line) => line.startsWith('DevTools listening')) + .timeout(const Duration(seconds: 60), onTimeout: () { + throwToolExit('Unable to connect to Chrome DevTools.'); + return null; + }); + + return _connect(Chrome._( + port, + ChromeConnection('localhost', port), + process: process, + dataDir: dataDir, + )); + } + + static Future _connect(Chrome chrome) async { + if (_currentCompleter.isCompleted) { + throwToolExit('Only one instance of chrome can be started.'); + } + // The connection is lazy. Try a simple call to make sure the provided + // connection is valid. + try { + await chrome.chromeConnection.getTabs(); + } catch (e) { + await chrome.close(); + throwToolExit( + 'Unable to connect to Chrome debug port: ${chrome.debugPort}\n $e'); + } + _currentCompleter.complete(chrome); + return chrome; + } + + /// Connects to an instance of Chrome with an open debug port. + static Future fromExisting(int port) async => + _connect(Chrome._(port, ChromeConnection('localhost', port))); + + static Future get connectedInstance => _currentCompleter.future; + + static String _findExecutable() { + if (platform.environment.containsKey(_kChromeEnvironment)) { + return platform.environment[_kChromeEnvironment]; + } + if (platform.isLinux) { + // Don't check if this exists, it isn't a file. + return _kLinuxExecutable; + } + if (platform.isMacOS) { + if (!fs.file(_kMacOSExecutable).existsSync()) { + throwToolExit('Chrome executable not found at $_kMacOSExecutable'); + } + return _kMacOSExecutable; + } + if (platform.isWindows) { + final String windowsPrefix = _kWindowsPrefixes.firstWhere((String prefix) { + if (prefix == null) { + return false; + } + final String path = fs.path.join(prefix, _kWindowsExecutable); + return fs.file(path).existsSync(); + }, orElse: () => '.'); + final String path = fs.path.join(windowsPrefix, _kWindowsExecutable); + if (!fs.file(path).existsSync()) { + throwToolExit('Chrome executable not found at $path'); + } + return path; + } + throwToolExit('Platform ${platform.operatingSystem} is not supported.'); + return null; + } +} + +/// A class for managing an instance of Chrome. +class Chrome { + const Chrome._( + this.debugPort, + this.chromeConnection, { + Process process, + Directory dataDir, + }) : _process = process, + _dataDir = dataDir; + + final int debugPort; + final Process _process; + final Directory _dataDir; + final ChromeConnection chromeConnection; + + static Completer _currentCompleter = Completer(); + + Future close() async { + if (_currentCompleter.isCompleted) { + _currentCompleter = Completer(); + } + chromeConnection.close(); + _process?.kill(ProcessSignal.SIGKILL); + await _process?.exitCode; + try { + // Chrome starts another process as soon as it dies that modifies the + // profile information. Give it some time before attempting to delete + // the directory. + await Future.delayed(const Duration(milliseconds: 500)); + await _dataDir?.delete(recursive: true); + } catch (_) { + // Silently fail if we can't clean up the profile information. + // It is a system tmp directory so it should get cleaned up eventually. + } + } +} diff --git a/packages/flutter_tools/lib/src/web/web_device.dart b/packages/flutter_tools/lib/src/web/web_device.dart index d8ce9ce3e5..098591d2a2 100644 --- a/packages/flutter_tools/lib/src/web/web_device.dart +++ b/packages/flutter_tools/lib/src/web/web_device.dart @@ -5,12 +5,10 @@ import '../application_package.dart'; import '../asset.dart'; import '../base/common.dart'; -import '../base/context.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../base/logger.dart'; import '../base/platform.dart'; -import '../base/process_manager.dart'; import '../build_info.dart'; import '../bundle.dart'; import '../device.dart'; @@ -18,8 +16,7 @@ import '../globals.dart'; import '../project.dart'; import '../version.dart'; import '../web/compile.dart'; - -ChromeLauncher get chromeLauncher => context.get(); +import 'chrome.dart'; /// Only launch or display web devices if `FLUTTER_WEB` /// environment variable is set to true. @@ -202,45 +199,3 @@ class WebDevices extends PollingDeviceDiscovery { @override bool get supportsPlatform => flutterWebEnabled; } - -const String _klinuxExecutable = 'google-chrome'; -const String _kMacOSExecutable = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'; -const String _kWindowsExecutable = r'Google\Chrome\Application\chrome.exe'; -final List _kWindowsPrefixes = [ - platform.environment['LOCALAPPDATA'], - platform.environment['PROGRAMFILES'], - platform.environment['PROGRAMFILES(X86)'], -]; - -// Responsible for launching chrome with devtools configured. -class ChromeLauncher { - const ChromeLauncher(); - - /// Launch the chrome browser to a particular `host` page. - Future launch(String host) async { - String executable; - if (platform.isMacOS) { - executable = _kMacOSExecutable; - } else if (platform.isLinux) { - executable = _klinuxExecutable; - } else if (platform.isWindows) { - final String filePath = _kWindowsPrefixes.firstWhere((String prefix) { - if (prefix == null) { - return false; - } - final String path = fs.path.join(prefix, _kWindowsExecutable); - return fs.file(path).existsSync(); - }, orElse: () => '.'); - executable = filePath; - } else { - throwToolExit('Platform ${platform.operatingSystem} is not supported.'); - } - if (!fs.file(executable).existsSync()) { - throwToolExit('Chrome executable not found at $executable'); - } - return processManager.start([ - executable, - host, - ], mode: ProcessStartMode.detached); - } -} diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 2c8b87bf61..546b4784a3 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: # To update these, use "flutter update-packages --force-upgrade". archive: 2.0.9 - args: 1.5.1 + args: 1.5.2 bsdiff: 0.1.0 completion: 0.2.1+1 coverage: 0.12.4 @@ -33,6 +33,7 @@ dependencies: usage: 3.4.1 vm_service_client: 0.2.6+2 web_socket_channel: 1.0.13 + webkit_inspection_protocol: 0.4.0 xml: 3.5.0 yaml: 2.1.15 flutter_goldens_client: @@ -61,7 +62,7 @@ dependencies: build_config: 0.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" build_resolvers: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" built_collection: 4.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - built_value: 6.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + built_value: 6.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -78,6 +79,9 @@ dependencies: kernel: 0.3.18 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.7.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -88,6 +92,8 @@ dependencies: pubspec_parse: 0.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" scratch_space: 0.0.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf_web_socket: 0.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" source_map_stack_trace: 1.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" source_maps: 0.10.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -101,21 +107,15 @@ dependencies: dev_dependencies: collection: 1.14.11 - mockito: 4.0.0 + mockito: 4.1.0 file_testing: 2.1.0 - vm_service_lib: 3.17.0 + vm_service_lib: 3.17.0+1 build_runner: 1.4.0 build_vm_compilers: 1.0.0 build_test: 0.10.7+3 - mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: b34a +# PUBSPEC CHECKSUM: 25f1 diff --git a/packages/flutter_tools/test/web/devices_test.dart b/packages/flutter_tools/test/web/devices_test.dart index 77dac14e70..7ab085629d 100644 --- a/packages/flutter_tools/test/web/devices_test.dart +++ b/packages/flutter_tools/test/web/devices_test.dart @@ -5,6 +5,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/project.dart'; +import 'package:flutter_tools/src/web/chrome.dart'; import 'package:flutter_tools/src/web/compile.dart'; import 'package:flutter_tools/src/web/web_device.dart'; import 'package:mockito/mockito.dart'; diff --git a/packages/fuchsia_remote_debug_protocol/pubspec.yaml b/packages/fuchsia_remote_debug_protocol/pubspec.yaml index 67b6225b96..c5cbdba3be 100644 --- a/packages/fuchsia_remote_debug_protocol/pubspec.yaml +++ b/packages/fuchsia_remote_debug_protocol/pubspec.yaml @@ -42,6 +42,6 @@ dependencies: vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: - mockito: 4.0.0 + mockito: 4.1.0 -# PUBSPEC CHECKSUM: b48d +# PUBSPEC CHECKSUM: ef8e