From 2df6e9157aefb0bd446fd70ecc4dcef045c7574d Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 29 Mar 2019 14:54:53 -0700 Subject: [PATCH] Introduce unit tests and refactor web dart:ui into "package" (flutter/engine#8346) --- .../ci/licenses_golden/licenses_flutter | 31 ++++++------ engine/src/flutter/web_sdk/BUILD.gn | 47 ++++++++++++------- engine/src/flutter/web_sdk/sdk_rewriter.dart | 41 ++++++++++++++++ .../web_sdk/test/api_conform_test.dart | 4 +- 4 files changed, 88 insertions(+), 35 deletions(-) create mode 100644 engine/src/flutter/web_sdk/sdk_rewriter.dart diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index 09b0fa10055..eb96631316d 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -246,21 +246,21 @@ FILE: ../../../flutter/lib/io/dart_io.cc FILE: ../../../flutter/lib/io/dart_io.h FILE: ../../../flutter/lib/snapshot/libraries.json FILE: ../../../flutter/lib/snapshot/snapshot.h -FILE: ../../../flutter/lib/stub_ui/compositing.dart -FILE: ../../../flutter/lib/stub_ui/geometry.dart -FILE: ../../../flutter/lib/stub_ui/hash_codes.dart -FILE: ../../../flutter/lib/stub_ui/hooks.dart -FILE: ../../../flutter/lib/stub_ui/isolate_name_server.dart -FILE: ../../../flutter/lib/stub_ui/lerp.dart -FILE: ../../../flutter/lib/stub_ui/natives.dart -FILE: ../../../flutter/lib/stub_ui/painting.dart -FILE: ../../../flutter/lib/stub_ui/plugins.dart -FILE: ../../../flutter/lib/stub_ui/pointer.dart -FILE: ../../../flutter/lib/stub_ui/semantics.dart -FILE: ../../../flutter/lib/stub_ui/text.dart -FILE: ../../../flutter/lib/stub_ui/ui.dart -FILE: ../../../flutter/lib/stub_ui/versions.dart -FILE: ../../../flutter/lib/stub_ui/window.dart +FILE: ../../../flutter/lib/stub_ui/lib/compositing.dart +FILE: ../../../flutter/lib/stub_ui/lib/geometry.dart +FILE: ../../../flutter/lib/stub_ui/lib/hash_codes.dart +FILE: ../../../flutter/lib/stub_ui/lib/hooks.dart +FILE: ../../../flutter/lib/stub_ui/lib/isolate_name_server.dart +FILE: ../../../flutter/lib/stub_ui/lib/lerp.dart +FILE: ../../../flutter/lib/stub_ui/lib/natives.dart +FILE: ../../../flutter/lib/stub_ui/lib/painting.dart +FILE: ../../../flutter/lib/stub_ui/lib/plugins.dart +FILE: ../../../flutter/lib/stub_ui/lib/pointer.dart +FILE: ../../../flutter/lib/stub_ui/lib/semantics.dart +FILE: ../../../flutter/lib/stub_ui/lib/text.dart +FILE: ../../../flutter/lib/stub_ui/lib/ui.dart +FILE: ../../../flutter/lib/stub_ui/lib/versions.dart +FILE: ../../../flutter/lib/stub_ui/lib/window.dart FILE: ../../../flutter/lib/ui/compositing.dart FILE: ../../../flutter/lib/ui/compositing/scene.cc FILE: ../../../flutter/lib/ui/compositing/scene.h @@ -751,6 +751,7 @@ FILE: ../../../flutter/web_sdk/flutter_kernel_sdk.dart FILE: ../../../flutter/web_sdk/libraries.dart FILE: ../../../flutter/web_sdk/libraries.json FILE: ../../../flutter/web_sdk/make_combined_sdk.dart +FILE: ../../../flutter/web_sdk/sdk_rewriter.dart ---------------------------------------------------------------------------------------------------- Copyright 2013 The Flutter Authors. All rights reserved. diff --git a/engine/src/flutter/web_sdk/BUILD.gn b/engine/src/flutter/web_sdk/BUILD.gn index 7382b8a6b6d..82b502a5cf6 100644 --- a/engine/src/flutter/web_sdk/BUILD.gn +++ b/engine/src/flutter/web_sdk/BUILD.gn @@ -9,21 +9,21 @@ sdk_dill = "$root_out_dir/flutter_web_sdk/kernel/flutter_ddc_sdk.dill" sdk_libraries_json = "$flutter_root/web_sdk/libraries.json" web_ui_sources = [ - "$flutter_root/lib/stub_ui/compositing.dart", - "$flutter_root/lib/stub_ui/geometry.dart", - "$flutter_root/lib/stub_ui/hash_codes.dart", - "$flutter_root/lib/stub_ui/hooks.dart", - "$flutter_root/lib/stub_ui/isolate_name_server.dart", - "$flutter_root/lib/stub_ui/lerp.dart", - "$flutter_root/lib/stub_ui/natives.dart", - "$flutter_root/lib/stub_ui/painting.dart", - "$flutter_root/lib/stub_ui/plugins.dart", - "$flutter_root/lib/stub_ui/pointer.dart", - "$flutter_root/lib/stub_ui/semantics.dart", - "$flutter_root/lib/stub_ui/text.dart", - "$flutter_root/lib/stub_ui/ui.dart", - "$flutter_root/lib/stub_ui/versions.dart", - "$flutter_root/lib/stub_ui/window.dart", + "$flutter_root/lib/stub_ui/lib/compositing.dart", + "$flutter_root/lib/stub_ui/lib/geometry.dart", + "$flutter_root/lib/stub_ui/lib/hash_codes.dart", + "$flutter_root/lib/stub_ui/lib/hooks.dart", + "$flutter_root/lib/stub_ui/lib/isolate_name_server.dart", + "$flutter_root/lib/stub_ui/lib/lerp.dart", + "$flutter_root/lib/stub_ui/lib/natives.dart", + "$flutter_root/lib/stub_ui/lib/painting.dart", + "$flutter_root/lib/stub_ui/lib/plugins.dart", + "$flutter_root/lib/stub_ui/lib/pointer.dart", + "$flutter_root/lib/stub_ui/lib/semantics.dart", + "$flutter_root/lib/stub_ui/lib/text.dart", + "$flutter_root/lib/stub_ui/lib/ui.dart", + "$flutter_root/lib/stub_ui/lib/versions.dart", + "$flutter_root/lib/stub_ui/lib/window.dart", ] group("web_sdk") { @@ -33,12 +33,23 @@ group("web_sdk") { ] } -copy("web_ui_sources") { - sources = web_ui_sources +prebuilt_dart_action("web_ui_sources") { + inputs = web_ui_sources + [ "sdk_rewriter.dart" ] + + packages = "//third_party/dart/.packages" + script = "sdk_rewriter.dart" + output_dir = rebase_path("$root_out_dir/flutter_web_sdk/lib/ui/") + + args = [ "--output-dir=$output_dir" ] outputs = [ - "$root_out_dir/flutter_web_sdk/lib/ui/{{source_file_part}}", + "$root_out_dir/flutter_web_sdk_stamp", ] + + foreach(source_file, web_ui_sources) { + path = rebase_path(source_file) + args += [ "--input=$path" ] + } } copy("web_ui_library") { diff --git a/engine/src/flutter/web_sdk/sdk_rewriter.dart b/engine/src/flutter/web_sdk/sdk_rewriter.dart new file mode 100644 index 00000000000..e44350e76aa --- /dev/null +++ b/engine/src/flutter/web_sdk/sdk_rewriter.dart @@ -0,0 +1,41 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:path/path.dart' as path; + +final ArgParser argParser = ArgParser() + ..addOption('output-dir') + ..addMultiOption('input'); + +const Pattern packageLibraryName = 'library ui;'; +const Pattern packagePartName = 'part of ui;'; +const Pattern coreLibraryName = 'library dart.ui;'; +const Pattern corePartName = 'part of dart.ui;'; + +// Rewrites the "package"-style web ui library into a dart:ui implementation. +// So far this only requires a replace of the library declarations. +void main(List arguments) { + final ArgResults results = argParser.parse(arguments); + final Directory directory = Directory(results['output-dir']); + if (!directory.existsSync()) { + directory.createSync(recursive: true); + } + for (String inputFilePath in results['input']) { + final File inputFile = File(inputFilePath); + final String fileName = path.split(inputFilePath).last; + final File outputFile = File(path.join(directory.path, fileName)) + ..createSync(); + String source; + if (fileName == 'ui.dart') { + source = inputFile.readAsStringSync().replaceFirst(packageLibraryName, coreLibraryName); + outputFile.writeAsStringSync(source); + } else { + source = inputFile.readAsStringSync().replaceFirst(packagePartName, corePartName); + } + outputFile.writeAsStringSync(source); + } +} diff --git a/engine/src/flutter/web_sdk/test/api_conform_test.dart b/engine/src/flutter/web_sdk/test/api_conform_test.dart index 1a7f8c53a7c..bf4b6283038 100644 --- a/engine/src/flutter/web_sdk/test/api_conform_test.dart +++ b/engine/src/flutter/web_sdk/test/api_conform_test.dart @@ -8,7 +8,7 @@ int main() { // These files just contain imports to the part files; final CompilationUnit uiUnit = parseDartFile('lib/ui/ui.dart', parseFunctionBodies: false, suppressErrors: false); - final CompilationUnit webUnit = parseDartFile('lib/stub_ui/ui.dart', + final CompilationUnit webUnit = parseDartFile('lib/stub_ui/lib/ui.dart', parseFunctionBodies: false, suppressErrors: false); final Map uiClasses = {}; final Map webClasses = {}; @@ -16,7 +16,7 @@ int main() { // Gather all public classes from each library. For now we are skiping // other top level members. _collectPublicClasses(uiUnit, uiClasses, 'lib/ui/'); - _collectPublicClasses(webUnit, webClasses, 'lib/stub_ui/'); + _collectPublicClasses(webUnit, webClasses, 'lib/stub_ui/lib/'); if (uiClasses.isEmpty || webClasses.isEmpty) { print('Warning: did not resolve any classes.');