From d33cf1155678c04e858c23df62432c53e7869d3d Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Tue, 3 Sep 2019 10:37:34 -0700 Subject: [PATCH] Automatically generated registrants for web plugins (#39628) * WIP on web plugin registry * WIP on registering plugins * WIP on web plugin registration * Only generate `package:flutter_web_plugins` imports if plugins are defined * Add parsing test * Add documentation * Fix analyzer warnings * add license headers * Add tests for package:flutter_web_plugins * Run `flutter update-packages --force-upgrade` * Fix analyzer errors * Fix analyzer error in test * Update copyright and remove flutter SDK constraints * Enable tests since engine has rolled * add flutter_web_plugins tests to bots * Create an empty .packages file for WebFs test --- dev/benchmarks/complex_layout/pubspec.yaml | 4 +- dev/benchmarks/macrobenchmarks/pubspec.yaml | 4 +- dev/bots/pubspec.yaml | 6 +- dev/bots/test.dart | 1 + dev/devicelab/pubspec.yaml | 4 +- .../android_semantics_testing/pubspec.yaml | 4 +- .../splash_screen_kitchen_sink/pubspec.yaml | 4 +- .../splash_screen_trans_rotate/pubspec.yaml | 4 +- .../android_views/pubspec.yaml | 4 +- dev/integration_tests/channels/pubspec.yaml | 4 +- dev/integration_tests/codegen/pubspec.yaml | 4 +- .../external_ui/pubspec.yaml | 4 +- dev/integration_tests/flavors/pubspec.yaml | 4 +- .../platform_interaction/pubspec.yaml | 4 +- dev/integration_tests/ui/pubspec.yaml | 4 +- dev/tools/pubspec.yaml | 4 +- examples/catalog/pubspec.yaml | 4 +- examples/flutter_gallery/pubspec.yaml | 6 +- examples/platform_channel/pubspec.yaml | 4 +- examples/platform_channel_swift/pubspec.yaml | 4 +- examples/stocks/pubspec.yaml | 4 +- packages/flutter/pubspec.yaml | 4 +- packages/flutter_driver/pubspec.yaml | 4 +- packages/flutter_goldens/pubspec.yaml | 4 +- packages/flutter_goldens_client/pubspec.yaml | 4 +- packages/flutter_test/pubspec.yaml | 4 +- .../lib/src/build_runner/build_script.dart | 30 ++++- .../web_compilation_delegate.dart | 1 + .../lib/src/build_runner/web_fs.dart | 22 ++-- .../lib/src/platform_plugins.dart | 51 ++++++++ packages/flutter_tools/lib/src/plugins.dart | 50 ++++++++ packages/flutter_tools/lib/src/project.dart | 3 + .../flutter_tools/lib/src/web/chrome.dart | 1 - packages/flutter_tools/pubspec.yaml | 4 +- .../general.shard/plugin_parsing_test.dart | 8 +- .../test/general.shard/web/web_fs_test.dart | 5 + packages/flutter_web_plugins/BUILD.gn | 18 +++ .../lib/flutter_web_plugins.dart | 5 + .../lib/src/plugin_registry.dart | 121 ++++++++++++++++++ packages/flutter_web_plugins/pubspec.yaml | 43 +++++++ .../test/plugin_registry_test.dart | 61 +++++++++ .../pubspec.yaml | 4 +- 42 files changed, 462 insertions(+), 70 deletions(-) create mode 100644 packages/flutter_web_plugins/BUILD.gn create mode 100644 packages/flutter_web_plugins/lib/flutter_web_plugins.dart create mode 100644 packages/flutter_web_plugins/lib/src/plugin_registry.dart create mode 100644 packages/flutter_web_plugins/pubspec.yaml create mode 100644 packages/flutter_web_plugins/test/plugin_registry_test.dart diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml index 0b9f8e82073..8f8f5bc29eb 100644 --- a/dev/benchmarks/complex_layout/pubspec.yaml +++ b/dev/benchmarks/complex_layout/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: collection: 1.14.11 # 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -86,4 +86,4 @@ flutter: - packages/flutter_gallery_assets/people/square/ali.png - packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png -# PUBSPEC CHECKSUM: 4c13 +# PUBSPEC CHECKSUM: 20df diff --git a/dev/benchmarks/macrobenchmarks/pubspec.yaml b/dev/benchmarks/macrobenchmarks/pubspec.yaml index a92c34b4deb..6b29c21be61 100644 --- a/dev/benchmarks/macrobenchmarks/pubspec.yaml +++ b/dev/benchmarks/macrobenchmarks/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: collection: 1.14.11 # 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -83,4 +83,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 4c13 +# PUBSPEC CHECKSUM: 20df diff --git a/dev/bots/pubspec.yaml b/dev/bots/pubspec.yaml index f30137be16e..705fd503327 100644 --- a/dev/bots/pubspec.yaml +++ b/dev/bots/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: googleapis: 0.54.0 googleapis_auth: 0.2.10 - _discoveryapis_commons: 0.1.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + _discoveryapis_commons: 0.1.8+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -26,7 +26,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dev_dependencies: mockito: 4.1.0 test_api: 0.2.5 -# PUBSPEC CHECKSUM: 0eb3 +# PUBSPEC CHECKSUM: f181 diff --git a/dev/bots/test.dart b/dev/bots/test.dart index d3ced31bb05..27cbde9f959 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -474,6 +474,7 @@ Future _runWebTests() async { // 'test/widgets/', // 'test/material/', ]); + await _runFlutterWebTest(path.join(flutterRoot, 'packages', 'flutter_web_plugins'), tests: ['test']); } Future _runCoverage() async { diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml index 6a889a0d805..a989703e305 100644 --- a/dev/devicelab/pubspec.yaml +++ b/dev/devicelab/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: args: 1.5.2 - file: 5.0.8+1 + file: 5.0.10 image: 2.1.4 meta: 1.1.7 path: 1.6.4 @@ -73,4 +73,4 @@ dev_dependencies: watcher: 0.9.7+12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: c82c +# PUBSPEC CHECKSUM: 9cf8 diff --git a/dev/integration_tests/android_semantics_testing/pubspec.yaml b/dev/integration_tests/android_semantics_testing/pubspec.yaml index b7b70ece8ab..0207e13444f 100644 --- a/dev/integration_tests/android_semantics_testing/pubspec.yaml +++ b/dev/integration_tests/android_semantics_testing/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 22cd +# PUBSPEC CHECKSUM: 4e9a diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml index 3179a4b10ae..d5fb628e7cd 100644 --- a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml @@ -51,7 +51,7 @@ dev_dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -133,4 +133,4 @@ flutter: # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages -# PUBSPEC CHECKSUM: 19b8 +# PUBSPEC CHECKSUM: 0a85 diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml index 2eaf773727b..3750f785a32 100644 --- a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml @@ -51,7 +51,7 @@ dev_dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -133,4 +133,4 @@ flutter: # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages -# PUBSPEC CHECKSUM: 19b8 +# PUBSPEC CHECKSUM: 0a85 diff --git a/dev/integration_tests/android_views/pubspec.yaml b/dev/integration_tests/android_views/pubspec.yaml index d9b0818d063..c9ef8a13f14 100644 --- a/dev/integration_tests/android_views/pubspec.yaml +++ b/dev/integration_tests/android_views/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -80,4 +80,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 45da +# PUBSPEC CHECKSUM: 7fa7 diff --git a/dev/integration_tests/channels/pubspec.yaml b/dev/integration_tests/channels/pubspec.yaml index c54c4b611fa..a3ad1dd6d19 100644 --- a/dev/integration_tests/channels/pubspec.yaml +++ b/dev/integration_tests/channels/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 22cd +# PUBSPEC CHECKSUM: 4e9a diff --git a/dev/integration_tests/codegen/pubspec.yaml b/dev/integration_tests/codegen/pubspec.yaml index fde3bb401ea..b0af2dfafb0 100644 --- a/dev/integration_tests/codegen/pubspec.yaml +++ b/dev/integration_tests/codegen/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: collection: 1.14.11 # 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -74,4 +74,4 @@ builders: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 22cd +# PUBSPEC CHECKSUM: 4e9a diff --git a/dev/integration_tests/external_ui/pubspec.yaml b/dev/integration_tests/external_ui/pubspec.yaml index e5cf70efbd0..6b68ce2a863 100644 --- a/dev/integration_tests/external_ui/pubspec.yaml +++ b/dev/integration_tests/external_ui/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 22cd +# PUBSPEC CHECKSUM: 4e9a diff --git a/dev/integration_tests/flavors/pubspec.yaml b/dev/integration_tests/flavors/pubspec.yaml index 646e8c9ed66..1825cf1dc7c 100644 --- a/dev/integration_tests/flavors/pubspec.yaml +++ b/dev/integration_tests/flavors/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 22cd +# PUBSPEC CHECKSUM: 4e9a diff --git a/dev/integration_tests/platform_interaction/pubspec.yaml b/dev/integration_tests/platform_interaction/pubspec.yaml index db4d0fbf73c..b1442fb28fc 100644 --- a/dev/integration_tests/platform_interaction/pubspec.yaml +++ b/dev/integration_tests/platform_interaction/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 22cd +# PUBSPEC CHECKSUM: 4e9a diff --git a/dev/integration_tests/ui/pubspec.yaml b/dev/integration_tests/ui/pubspec.yaml index 24b163e59fd..a38f4da8ac9 100644 --- a/dev/integration_tests/ui/pubspec.yaml +++ b/dev/integration_tests/ui/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 2b14 +# PUBSPEC CHECKSUM: 65e0 diff --git a/dev/tools/pubspec.yaml b/dev/tools/pubspec.yaml index c443d653b1c..d6b6cd47572 100644 --- a/dev/tools/pubspec.yaml +++ b/dev/tools/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: collection: 1.14.11 # 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" platform: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -37,4 +37,4 @@ dev_dependencies: 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: 8220 +# PUBSPEC CHECKSUM: 9cec diff --git a/examples/catalog/pubspec.yaml b/examples/catalog/pubspec.yaml index de2fe437cb3..1d23ca99041 100644 --- a/examples/catalog/pubspec.yaml +++ b/examples/catalog/pubspec.yaml @@ -31,7 +31,7 @@ dev_dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+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: 2b14 +# PUBSPEC CHECKSUM: 65e0 diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml index bcb554256c4..e02d5a4eeea 100644 --- a/examples/flutter_gallery/pubspec.yaml +++ b/examples/flutter_gallery/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: collection: 1.14.11 device_info: 0.4.0+2 intl: 0.15.8 - connectivity: 0.4.3+7 + connectivity: 0.4.4 string_scanner: 1.0.5 url_launcher: 5.1.2 cupertino_icons: 0.1.2 @@ -46,7 +46,7 @@ dev_dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -258,4 +258,4 @@ flutter: - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf -# PUBSPEC CHECKSUM: 2aad +# PUBSPEC CHECKSUM: 3f19 diff --git a/examples/platform_channel/pubspec.yaml b/examples/platform_channel/pubspec.yaml index 3299c49845c..eeafd174dd6 100644 --- a/examples/platform_channel/pubspec.yaml +++ b/examples/platform_channel/pubspec.yaml @@ -29,7 +29,7 @@ dev_dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # 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: 2b14 +# PUBSPEC CHECKSUM: 65e0 diff --git a/examples/platform_channel_swift/pubspec.yaml b/examples/platform_channel_swift/pubspec.yaml index 97525656fdc..6ccbcf898cf 100644 --- a/examples/platform_channel_swift/pubspec.yaml +++ b/examples/platform_channel_swift/pubspec.yaml @@ -29,7 +29,7 @@ dev_dependencies: convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # 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: 2b14 +# PUBSPEC CHECKSUM: 65e0 diff --git a/examples/stocks/pubspec.yaml b/examples/stocks/pubspec.yaml index 96e2a89f7b5..464c13c9fd3 100644 --- a/examples/stocks/pubspec.yaml +++ b/examples/stocks/pubspec.yaml @@ -50,7 +50,7 @@ dev_dependencies: archive: 2.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" image: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.1.0 # 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" @@ -65,4 +65,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: ded4 +# PUBSPEC CHECKSUM: 27a1 diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index 0cc81227107..4844cff334e 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -31,7 +31,7 @@ dev_dependencies: 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" image: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # 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" @@ -49,4 +49,4 @@ dev_dependencies: test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 8060 +# PUBSPEC CHECKSUM: 012d diff --git a/packages/flutter_driver/pubspec.yaml b/packages/flutter_driver/pubspec.yaml index 5e21ce318fd..9d22c0fbca5 100644 --- a/packages/flutter_driver/pubspec.yaml +++ b/packages/flutter_driver/pubspec.yaml @@ -8,7 +8,7 @@ environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" dependencies: - file: 5.0.8+1 + file: 5.0.10 json_rpc_2: 2.1.0 meta: 1.1.7 path: 1.6.4 @@ -51,4 +51,4 @@ dev_dependencies: mockito: 4.1.0 quiver: 2.0.5 -# PUBSPEC CHECKSUM: 70d0 +# PUBSPEC CHECKSUM: 8a9d diff --git a/packages/flutter_goldens/pubspec.yaml b/packages/flutter_goldens/pubspec.yaml index f8292e74fad..0787987ba07 100644 --- a/packages/flutter_goldens/pubspec.yaml +++ b/packages/flutter_goldens/pubspec.yaml @@ -8,7 +8,7 @@ dependencies: # To update these, use "flutter update-packages --force-upgrade". flutter_test: sdk: flutter - file: 5.0.8+1 + file: 5.0.10 meta: 1.1.7 platform: 2.2.1 process: 3.0.11 @@ -43,4 +43,4 @@ dependencies: dev_dependencies: mockito: 4.1.0 -# PUBSPEC CHECKSUM: 8060 +# PUBSPEC CHECKSUM: 012d diff --git a/packages/flutter_goldens_client/pubspec.yaml b/packages/flutter_goldens_client/pubspec.yaml index 851d5c4acdb..b08c9436cbc 100644 --- a/packages/flutter_goldens_client/pubspec.yaml +++ b/packages/flutter_goldens_client/pubspec.yaml @@ -6,7 +6,7 @@ environment: dependencies: # To update these, use "flutter update-packages --force-upgrade". - file: 5.0.8+1 + file: 5.0.10 platform: 2.2.1 process: 3.0.11 @@ -18,4 +18,4 @@ dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: 4cbd +# PUBSPEC CHECKSUM: 2f8a diff --git a/packages/flutter_test/pubspec.yaml b/packages/flutter_test/pubspec.yaml index 3dd32da6d66..64fdf03f535 100644 --- a/packages/flutter_test/pubspec.yaml +++ b/packages/flutter_test/pubspec.yaml @@ -50,8 +50,8 @@ dependencies: xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: - file: 5.0.8+1 + file: 5.0.10 intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 9be7 +# PUBSPEC CHECKSUM: b5b4 diff --git a/packages/flutter_tools/lib/src/build_runner/build_script.dart b/packages/flutter_tools/lib/src/build_runner/build_script.dart index 3c69efe1e28..433abd816b6 100644 --- a/packages/flutter_tools/lib/src/build_runner/build_script.dart +++ b/packages/flutter_tools/lib/src/build_runner/build_script.dart @@ -86,7 +86,10 @@ final List builders = [ core.apply( 'flutter_tools:shell', [ - (BuilderOptions options) => const FlutterWebShellBuilder(), + (BuilderOptions options) { + final bool hasPlugins = options.config['hasPlugins'] == true; + return FlutterWebShellBuilder(hasPlugins: hasPlugins); + } ], core.toRoot(), hideOutput: true, @@ -342,7 +345,9 @@ void setStackTraceMapper(StackTraceMapper mapper) { /// A shell builder which generates the web specific entrypoint. class FlutterWebShellBuilder implements Builder { - const FlutterWebShellBuilder(); + const FlutterWebShellBuilder({this.hasPlugins = false}); + + final bool hasPlugins; @override Future build(BuildStep buildStep) async { @@ -352,16 +357,33 @@ class FlutterWebShellBuilder implements Builder { return; } final AssetId outputId = buildStep.inputId.changeExtension('_web_entrypoint.dart'); - await buildStep.writeAsString(outputId, ''' + if (hasPlugins) { + await buildStep.writeAsString(outputId, ''' import 'dart:ui' as ui; + +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +import 'generated_plugin_registrant.dart'; +import "${path.url.basename(buildStep.inputId.path)}" as entrypoint; + +Future main() async { + registerPlugins(webPluginRegistry); + await ui.webOnlyInitializePlatform(); + entrypoint.main(); +} +'''); + } else { + await buildStep.writeAsString(outputId, ''' +import 'dart:ui' as ui; + import "${path.url.basename(buildStep.inputId.path)}" as entrypoint; Future main() async { await ui.webOnlyInitializePlatform(); entrypoint.main(); } - '''); + } } @override diff --git a/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart b/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart index a62eccba41e..60d8be39a50 100644 --- a/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart +++ b/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart @@ -57,6 +57,7 @@ class BuildRunnerWebCompilationProxy extends WebCompilationProxy { _packageUriMapper = PackageUriMapper( path.absolute('lib/main.dart'), PackageMap.globalPackagesPath, null, null); _packageGraph = core.PackageGraph.forPath(projectDirectory.path); + final core.BuildEnvironment buildEnvironment = core.OverrideableEnvironment( core.IOEnvironment(_packageGraph), onLog: (LogRecord record) { if (record.level == Level.SEVERE || record.level == Level.SHOUT) { diff --git a/packages/flutter_tools/lib/src/build_runner/web_fs.dart b/packages/flutter_tools/lib/src/build_runner/web_fs.dart index 0222ab81c64..6e5a114e22b 100644 --- a/packages/flutter_tools/lib/src/build_runner/web_fs.dart +++ b/packages/flutter_tools/lib/src/build_runner/web_fs.dart @@ -31,6 +31,8 @@ import '../bundle.dart'; import '../cache.dart'; import '../dart/package_map.dart'; import '../globals.dart'; +import '../platform_plugins.dart'; +import '../plugins.dart'; import '../project.dart'; import '../web/chrome.dart'; @@ -38,7 +40,7 @@ import '../web/chrome.dart'; const String kBuildTargetName = 'web'; /// A factory for creating a [Dwds] instance. -DwdsFactory get dwdsFactpory => context.get() ?? Dwds.start; +DwdsFactory get dwdsFactory => context.get() ?? Dwds.start; /// The [BuildDaemonCreator] instance. BuildDaemonCreator get buildDaemonCreator => context.get() ?? const BuildDaemonCreator(); @@ -49,10 +51,10 @@ WebFsFactory get webFsFactory => context.get() ?? WebFs.start; /// A factory for creating an [HttpMultiServer] instance. HttpMultiServerFactory get httpMultiServerFactory => context.get() ?? HttpMultiServer.bind; -/// A function with the same signature as [HttpMultiServier.bind]. +/// A function with the same signature as [HttpMultiServer.bind]. typedef HttpMultiServerFactory = Future Function(dynamic address, int port); -/// A function with the same signatire as [Dwds.start]. +/// A function with the same signature as [Dwds.start]. typedef DwdsFactory = Future Function({ @required int applicationPort, @required int assetServerPort, @@ -144,9 +146,11 @@ class WebFs { if (!flutterProject.dartTool.existsSync()) { flutterProject.dartTool.createSync(recursive: true); } + + final bool hasWebPlugins = findPlugins(flutterProject).any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey)); // Start the build daemon and run an initial build. final BuildDaemonClient client = await buildDaemonCreator - .startBuildDaemon(fs.currentDirectory.path, release: buildInfo.isRelease, profile: buildInfo.isProfile); + .startBuildDaemon(fs.currentDirectory.path, release: buildInfo.isRelease, profile: buildInfo.isProfile, hasPlugins: hasWebPlugins); client.startBuild(); // Only provide relevant build results final Stream filteredBuildResults = client.buildResults @@ -163,7 +167,7 @@ class WebFs { // Initialize the dwds server. final int port = await os.findFreePort(); - final Dwds dwds = await dwdsFactpory( + final Dwds dwds = await dwdsFactory( hostname: _kHostName, applicationPort: port, applicationTarget: kBuildTargetName, @@ -307,12 +311,13 @@ class BuildDaemonCreator { static const String _ignoredLine3 = 'have your dependencies specified fully in your pubspec.yaml'; /// Start a build daemon and register the web targets. - Future startBuildDaemon(String workingDirectory, {bool release = false, bool profile = false }) async { + Future startBuildDaemon(String workingDirectory, {bool release = false, bool profile = false, bool hasPlugins = false}) async { try { final BuildDaemonClient client = await _connectClient( workingDirectory, release: release, profile: profile, + hasPlugins: hasPlugins, ); _registerBuildTargets(client); return client; @@ -339,7 +344,7 @@ class BuildDaemonCreator { Future _connectClient( String workingDirectory, - { bool release, bool profile } + { bool release, bool profile, bool hasPlugins } ) { final String flutterToolsPackages = fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools', '.packages'); final String buildScript = fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools', 'lib', 'src', 'build_runner', 'build_script.dart'); @@ -360,6 +365,7 @@ class BuildDaemonCreator { '--define', 'flutter_tools:entrypoint=release=$release', '--define', 'flutter_tools:entrypoint=profile=$profile', '--define', 'flutter_tools:shell=flutterWebSdk=$flutterWebSdk', + '--define', 'flutter_tools:shell=hasPlugins=$hasPlugins', ], logHandler: (ServerLog serverLog) { switch (serverLog.level) { @@ -392,4 +398,4 @@ class BuildDaemonCreator { final String portFilePath = fs.path.join(daemonWorkspace(workingDirectory.path), '.asset_server_port'); return int.tryParse(fs.file(portFilePath).readAsStringSync()); } -} \ No newline at end of file +} diff --git a/packages/flutter_tools/lib/src/platform_plugins.dart b/packages/flutter_tools/lib/src/platform_plugins.dart index ed9b4eaf3d0..aeaab302a1f 100644 --- a/packages/flutter_tools/lib/src/platform_plugins.dart +++ b/packages/flutter_tools/lib/src/platform_plugins.dart @@ -139,3 +139,54 @@ class MacOSPlugin extends PluginPlatform { }; } } + +/// Contains the parameters to template a web plugin. +/// +/// The required fields include: [name] of the plugin, the [pluginClass] that will +/// be the entry point to the plugin's implementation, and the [fileName] +/// containing the code. +class WebPlugin extends PluginPlatform { + const WebPlugin({ + @required this.name, + @required this.pluginClass, + @required this.fileName, + }); + + factory WebPlugin.fromYaml(String name, YamlMap yaml) { + assert(validate(yaml)); + return WebPlugin( + name: name, + pluginClass: yaml['pluginClass'], + fileName: yaml['fileName'], + ); + } + + static bool validate(YamlMap yaml) { + if (yaml == null) { + return false; + } + return yaml['pluginClass'] is String && yaml['fileName'] is String; + } + + static const String kConfigKey = 'web'; + + /// The name of the plugin. + final String name; + + /// The class containing the plugin implementation details. + /// + /// This class should have a static `registerWith` method defined. + final String pluginClass; + + /// The name of the file containing the class implementation above. + final String fileName; + + @override + Map toMap() { + return { + 'name': name, + 'class': pluginClass, + 'file': fileName, + }; + } +} diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart index a274c7ee8c5..fe6475c264d 100644 --- a/packages/flutter_tools/lib/src/plugins.dart +++ b/packages/flutter_tools/lib/src/plugins.dart @@ -89,6 +89,11 @@ class Plugin { MacOSPlugin.fromYaml(name, platformsYaml[MacOSPlugin.kConfigKey]); } + if (platformsYaml[WebPlugin.kConfigKey] != null) { + platforms[WebPlugin.kConfigKey] = + WebPlugin.fromYaml(name, platformsYaml[WebPlugin.kConfigKey]); + } + return Plugin( name: name, path: path, @@ -384,6 +389,25 @@ Depends on all your plugins, and provides a function to register them. end '''; +const String _dartPluginRegistryTemplate = '''// +// Generated file. Do not edit. +// +import 'dart:ui'; + +{{#plugins}} +import 'package:{{name}}/{{file}}'; +{{/plugins}} + +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +void registerPlugins(PluginRegistry registry) { +{{#plugins}} + {{class}}.registerWith(registry.registrarFor({{class}})); +{{/plugins}} + registry.registerMessageHandler(); +} +'''; + Future _writeIOSPluginRegistrant(FlutterProject project, List plugins) async { final List> iosPlugins = _extractPlatformMaps(plugins, IOSPlugin.kConfigKey); final Map context = { @@ -439,6 +463,29 @@ Future _writeMacOSPluginRegistrant(FlutterProject project, List pl ); } +Future _writeWebPluginRegistrant(FlutterProject project, List plugins) async { + final List> webPlugins = _extractPlatformMaps(plugins, WebPlugin.kConfigKey); + final Map context = { + 'plugins': webPlugins, + }; + final String registryDirectory = project.web.libDirectory.path; + final String filePath = fs.path.join(registryDirectory, 'generated_plugin_registrant.dart'); + if (webPlugins.isEmpty) { + final File file = fs.file(filePath); + file.createSync(recursive: true); + file.writeAsStringSync(''' +// Generated file. Intentionally left empty due to no web plugins registered. +void registerPlugins(ignored) {} +'''); + } else { + _renderTemplateToFile( + _dartPluginRegistryTemplate, + context, + filePath, + ); + } +} + /// Rewrites the `.flutter-plugins` file of [project] based on the plugin /// dependencies declared in `pubspec.yaml`. /// @@ -490,6 +537,9 @@ Future injectPlugins(FlutterProject project, {bool checkProjects = false}) } } } + if (featureFlags.isWebEnabled && project.web.existsSync()) { + await _writeWebPluginRegistrant(project, plugins); + } } /// Returns whether the specified Flutter [project] has any plugin dependencies. diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index e33f679fa7f..e53d18723da 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -623,6 +623,9 @@ class WebProject { && indexFile.existsSync(); } + /// The 'lib' directory for the application. + Directory get libDirectory => parent.directory.childDirectory('lib'); + /// The html file used to host the flutter web application. File get indexFile => parent.directory .childDirectory('web') diff --git a/packages/flutter_tools/lib/src/web/chrome.dart b/packages/flutter_tools/lib/src/web/chrome.dart index 1ea6168c804..34e5ecf64b2 100644 --- a/packages/flutter_tools/lib/src/web/chrome.dart +++ b/packages/flutter_tools/lib/src/web/chrome.dart @@ -140,7 +140,6 @@ class ChromeLauncher { await chrome.chromeConnection.getTabs(); } catch (e) { await chrome.close(); - print('here'); throwToolExit( 'Unable to connect to Chrome debug port: ${chrome.debugPort}\n $e'); } diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 15b30644abc..84415390386 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: completion: 0.2.1+1 coverage: 0.13.2 crypto: 2.1.2 - file: 5.0.8+1 + file: 5.0.10 http: 0.12.0+2 intl: 0.15.8 json_rpc_2: 2.1.0 @@ -134,4 +134,4 @@ dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: fb35 +# PUBSPEC CHECKSUM: 0702 diff --git a/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart b/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart index 8c153103387..5ad720dfa6a 100644 --- a/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart +++ b/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart @@ -42,7 +42,10 @@ void main() { ' package: com.flutter.dev\n' ' pluginClass: ASamplePlugin\n' ' ios:\n' - ' pluginClass: ISamplePlugin\n'; + ' pluginClass: ISamplePlugin\n' + ' web:\n' + ' pluginClass: WSamplePlugin\n' + ' fileName: web_plugin.dart\n'; final dynamic pluginYaml = loadYaml(pluginYamlRaw); final Plugin plugin = @@ -53,6 +56,7 @@ void main() { final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey]; final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey]; + final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey]; final String androidPluginClass = androidPlugin.pluginClass; final String iosPluginClass = iosPlugin.pluginClass; @@ -61,6 +65,8 @@ void main() { expect(iosPlugin.classPrefix, ''); expect(androidPlugin.package, 'com.flutter.dev'); expect(macOSPlugin.pluginClass, 'MSamplePlugin'); + expect(webPlugin.pluginClass, 'WSamplePlugin'); + expect(webPlugin.fileName, 'web_plugin.dart'); }); }); } diff --git a/packages/flutter_tools/test/general.shard/web/web_fs_test.dart b/packages/flutter_tools/test/general.shard/web/web_fs_test.dart index 67a2609dfcc..7f761a46a20 100644 --- a/packages/flutter_tools/test/general.shard/web/web_fs_test.dart +++ b/packages/flutter_tools/test/general.shard/web/web_fs_test.dart @@ -46,6 +46,11 @@ void main() { }); when(mockBuildDaemonCreator.assetServerPort(any)).thenReturn(4321); testbed = Testbed( + setup: () { + // Create an empty .packages file so we can read it when we check for + // plugins on WebFs.start() + fs.file('.packages').createSync(); + }, overrides: { OperatingSystemUtils: () => mockOperatingSystemUtils, BuildDaemonCreator: () => mockBuildDaemonCreator, diff --git a/packages/flutter_web_plugins/BUILD.gn b/packages/flutter_web_plugins/BUILD.gn new file mode 100644 index 00000000000..4c87e84c1e5 --- /dev/null +++ b/packages/flutter_web_plugins/BUILD.gn @@ -0,0 +1,18 @@ +# 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("//build/dart/dart_library.gni") + +dart_library("flutter_web_plugins") { + package_name = "flutter_web_plugins" + + # Can be left empty as analysis is disabled. + sources = [] + + disable_analysis = true + + deps = [ + "../flutter", + ] +} diff --git a/packages/flutter_web_plugins/lib/flutter_web_plugins.dart b/packages/flutter_web_plugins/lib/flutter_web_plugins.dart new file mode 100644 index 00000000000..626e74c2685 --- /dev/null +++ b/packages/flutter_web_plugins/lib/flutter_web_plugins.dart @@ -0,0 +1,5 @@ +// 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. + +export 'src/plugin_registry.dart'; diff --git a/packages/flutter_web_plugins/lib/src/plugin_registry.dart b/packages/flutter_web_plugins/lib/src/plugin_registry.dart new file mode 100644 index 00000000000..df79e4c9ff8 --- /dev/null +++ b/packages/flutter_web_plugins/lib/src/plugin_registry.dart @@ -0,0 +1,121 @@ +// 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:ui' as ui; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +typedef _MessageHandler = Future Function(ByteData); + +/// This class registers web platform plugins. +class PluginRegistry { + /// Creates a plugin registry. + PluginRegistry(this._binaryMessenger); + + final BinaryMessenger _binaryMessenger; + + /// Creates a registrar for the given plugin implementation class. + Registrar registrarFor(Type key) => Registrar(_binaryMessenger); + + /// Registers this plugin handler with the engine, so that unrecognized + /// platform messages are forwarded to the registry, where they can be + /// correctly dispatched to one of the registered plugins. + void registerMessageHandler() { + // The function below is only defined in the Web dart:ui. + // ignore: undefined_function + ui.webOnlySetPluginHandler(_binaryMessenger.handlePlatformMessage); + } +} + +/// A registrar for a particular plugin. +/// +/// Gives access to a [BinaryMessenger] which has been configured to receive +/// platform messages from the framework side. +class Registrar { + /// Creates a registrar with the given [BinaryMessenger]. + Registrar(this.messenger); + + /// A [BinaryMessenger] configured to receive platform messages from the + /// framework side. + /// + /// Use this [BinaryMessenger] when creating platform channels in order for + /// them to receive messages from the platform side. For example: + /// + /// + /// class MyPlugin { + /// static void registerWith(Registrar registrar) { + /// final MethodChannel channel = MethodChannel( + /// 'com.my_plugin/my_plugin', + /// const StandardMethodCodec(), + /// registrar.messenger); + /// final MyPlugin instance = MyPlugin(); + /// channel.setMethodCallHandler(instance.handleMethodCall); + /// } + /// ... + /// } + final BinaryMessenger messenger; +} + +/// The default plugin registry for the web. +final PluginRegistry webPluginRegistry = PluginRegistry(pluginBinaryMessenger); + +/// A [BinaryMessenger] which does the inverse of the default framework +/// messenger. +/// +/// Instead of sending messages from the framework to the engine, this +/// receives messages from the framework and dispatches them to registered +/// plugins. +class _PlatformBinaryMessenger extends BinaryMessenger { + final Map _handlers = {}; + + /// Receives a platform message from the framework. + @override + Future handlePlatformMessage(String channel, ByteData data, + ui.PlatformMessageResponseCallback callback) async { + ByteData response; + try { + final MessageHandler handler = _handlers[channel]; + if (handler != null) { + response = await handler(data); + } + } catch (exception, stack) { + FlutterError.reportError(FlutterErrorDetails( + exception: exception, + stack: stack, + library: 'flutter web shell', + context: ErrorDescription('during a plugin platform message call'), + )); + } finally { + callback(response); + } + } + + /// Sends a platform message from the platform side back to the framework. + @override + Future send(String channel, ByteData message) { + throw FlutterError( + 'Cannot send messages from the platform side to the framework.'); + } + + @override + void setMessageHandler( + String channel, Future Function(ByteData message) handler) { + if (handler == null) + _handlers.remove(channel); + else + _handlers[channel] = handler; + } + + @override + void setMockMessageHandler( + String channel, Future Function(ByteData message) handler) { + throw FlutterError( + 'Setting mock handlers is not supported on the platform side.'); + } +} + +/// The default [BinaryMessenger] for Flutter Web plugins. +final BinaryMessenger pluginBinaryMessenger = _PlatformBinaryMessenger(); diff --git a/packages/flutter_web_plugins/pubspec.yaml b/packages/flutter_web_plugins/pubspec.yaml new file mode 100644 index 00000000000..72edd04ae5d --- /dev/null +++ b/packages/flutter_web_plugins/pubspec.yaml @@ -0,0 +1,43 @@ +name: flutter_web_plugins +description: Library to register Flutter Web plugins +author: Flutter Authors +homepage: http://flutter.dev + +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + meta: 1.1.7 # 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" + vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +dev_dependencies: + flutter_test: + sdk: flutter + + archive: 2.0.10 # 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.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + boolean_selector: 1.0.5 # 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" + crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + image: 2.1.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" + path: 1.6.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + petitparser: 2.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + quiver: 2.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_span: 1.5.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" + string_scanner: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + 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" + xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +# PUBSPEC CHECKSUM: 5c57 diff --git a/packages/flutter_web_plugins/test/plugin_registry_test.dart b/packages/flutter_web_plugins/test/plugin_registry_test.dart new file mode 100644 index 00000000000..b9ef72f872f --- /dev/null +++ b/packages/flutter_web_plugins/test/plugin_registry_test.dart @@ -0,0 +1,61 @@ +// 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. + +@TestOn('chrome') // Uses web-only Flutter SDK + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +class TestPlugin { + static void registerWith(Registrar registrar) { + final MethodChannel channel = MethodChannel( + 'test_plugin', + const StandardMethodCodec(), + registrar.messenger, + ); + final TestPlugin testPlugin = TestPlugin(); + channel.setMethodCallHandler(testPlugin.handleMethodCall); + } + + static final List calledMethods = []; + + Future handleMethodCall(MethodCall call) async { + calledMethods.add(call.method); + } +} + +void main() { + group('Plugin Registry', () { + setUp(() { + TestWidgetsFlutterBinding.ensureInitialized(); + webPluginRegistry.registerMessageHandler(); + }); + + test('Can register a plugin', () { + TestPlugin.calledMethods.clear(); + + final Registrar registrar = webPluginRegistry.registrarFor(TestPlugin); + TestPlugin.registerWith(registrar); + + const MethodChannel frameworkChannel = + MethodChannel('test_plugin', StandardMethodCodec()); + frameworkChannel.invokeMethod('test1'); + + expect(TestPlugin.calledMethods, ['test1']); + }); + + test('Throws when trying to send a platform message to the framework', () { + expect(() => pluginBinaryMessenger.send('test', ByteData(0)), + throwsFlutterError); + }); + + test('Throws when trying to set a mock handler', () { + expect( + () => pluginBinaryMessenger.setMockMessageHandler( + 'test', (ByteData data) async => ByteData(0)), + throwsFlutterError); + }); + }); +} diff --git a/packages/fuchsia_remote_debug_protocol/pubspec.yaml b/packages/fuchsia_remote_debug_protocol/pubspec.yaml index ebbd7d29319..cd69e9f8143 100644 --- a/packages/fuchsia_remote_debug_protocol/pubspec.yaml +++ b/packages/fuchsia_remote_debug_protocol/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: collection: 1.14.11 # 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" crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" image: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # 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" @@ -49,4 +49,4 @@ dependencies: dev_dependencies: mockito: 4.1.0 -# PUBSPEC CHECKSUM: 70d0 +# PUBSPEC CHECKSUM: 8a9d