From ec02d37ef264fb6aa27a5d94e0ea10771656d3b4 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 7 Apr 2021 09:40:51 -0700 Subject: [PATCH 1/4] [web] Start splitting the engine into smaller libs --- lib/web_ui/lib/src/engine.dart | 81 ++++++--- lib/web_ui/lib/src/engine/alarm_clock.dart | 4 +- .../lib/src/engine/browser_detection.dart | 4 +- lib/web_ui/lib/src/engine/mouse_cursor.dart | 2 +- .../lib/src/engine/navigation/history.dart | 9 +- .../engine/navigation/js_url_strategy.dart | 8 +- .../src/engine/navigation/url_strategy.dart | 7 +- lib/web_ui/lib/src/engine/plugins.dart | 4 +- .../lib/src/engine/pointer_binding.dart | 11 +- .../lib/src/engine/pointer_converter.dart | 2 +- .../lib/src/engine/services/buffers.dart | 3 +- .../src/engine/services/message_codec.dart | 4 +- .../src/engine/services/message_codecs.dart | 6 +- .../src/engine/services/serialization.dart | 4 +- lib/web_ui/lib/src/engine/shadow.dart | 6 +- lib/web_ui/lib/src/engine/test_embedding.dart | 7 +- lib/web_ui/lib/src/engine/ulps.dart | 3 +- lib/web_ui/lib/src/engine/validators.dart | 4 +- lib/web_ui/lib/src/engine/vector_math.dart | 5 +- .../lib/src/engine/web_experiments.dart | 4 +- lib/web_ui/test/alarm_clock_test.dart | 2 +- lib/web_ui/test/browser_detect_test.dart | 2 +- lib/web_ui/test/engine/history_test.dart | 8 +- .../test/engine/pointer_binding_test.dart | 4 +- lib/web_ui/test/engine/ulps_test.dart | 2 +- .../test/engine/web_experiments_test.dart | 2 +- web_sdk/sdk_rewriter.dart | 159 +++++++++++++----- 27 files changed, 274 insertions(+), 83 deletions(-) diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart index 9e2537f8a7097..87a56cb6643ed 100644 --- a/lib/web_ui/lib/src/engine.dart +++ b/lib/web_ui/lib/src/engine.dart @@ -8,6 +8,8 @@ library engine; import 'dart:async'; import 'dart:collection' + // Some of these names are used in services/buffers.dart for example. + // ignore: unused_shown_name show ListBase, IterableBase, DoubleLinkedQueue, DoubleLinkedQueueEntry; import 'dart:convert' hide Codec; import 'dart:developer' as developer; @@ -22,10 +24,68 @@ import 'package:meta/meta.dart'; import '../ui.dart' as ui; -part 'engine/alarm_clock.dart'; +import 'engine/alarm_clock.dart'; +export 'engine/alarm_clock.dart'; + +import 'engine/browser_detection.dart'; +export 'engine/browser_detection.dart'; + +import 'engine/mouse_cursor.dart'; +export 'engine/mouse_cursor.dart'; + +import 'engine/navigation/history.dart'; +export 'engine/navigation/history.dart'; + +import 'engine/navigation/js_url_strategy.dart'; +export 'engine/navigation/js_url_strategy.dart'; + +import 'engine/navigation/url_strategy.dart'; +export 'engine/navigation/url_strategy.dart'; + +import 'engine/plugins.dart'; +export 'engine/plugins.dart'; + +import 'engine/pointer_binding.dart'; +export 'engine/pointer_binding.dart'; + +// This import is intentionally commented out because the analyzer says it's unused. +// import 'engine/pointer_converter.dart'; +export 'engine/pointer_converter.dart'; + +// This import is intentionally commented out because the analyzer says it's unused. +// import 'engine/services/buffers.dart'; +export 'engine/services/buffers.dart'; + +import 'engine/services/message_codec.dart'; +export 'engine/services/message_codec.dart'; + +import 'engine/services/message_codecs.dart'; +export 'engine/services/message_codecs.dart'; + +// This import is intentionally commented out because the analyzer says it's unused. +// import 'engine/services/serialization.dart'; +export 'engine/services/serialization.dart'; + +import 'engine/shadow.dart'; +export 'engine/shadow.dart'; + +import 'engine/test_embedding.dart'; +export 'engine/test_embedding.dart'; + +import 'engine/ulps.dart'; +export 'engine/ulps.dart'; + +import 'engine/validators.dart'; +export 'engine/validators.dart'; + +import 'engine/vector_math.dart'; +export 'engine/vector_math.dart'; + +import 'engine/web_experiments.dart'; +export 'engine/web_experiments.dart'; + part 'engine/assets.dart'; part 'engine/bitmap_canvas.dart'; -part 'engine/browser_detection.dart'; part 'engine/canvaskit/canvas.dart'; part 'engine/canvaskit/canvaskit_canvas.dart'; part 'engine/canvaskit/canvaskit_api.dart'; @@ -64,9 +124,6 @@ part 'engine/dom_canvas.dart'; part 'engine/dom_renderer.dart'; part 'engine/engine_canvas.dart'; part 'engine/frame_reference.dart'; -part 'engine/navigation/history.dart'; -part 'engine/navigation/js_url_strategy.dart'; -part 'engine/navigation/url_strategy.dart'; part 'engine/html/backdrop_filter.dart'; part 'engine/html/canvas.dart'; part 'engine/html/clip.dart'; @@ -102,14 +159,10 @@ part 'engine/html_image_codec.dart'; part 'engine/keyboard_binding.dart'; part 'engine/keyboard.dart'; part 'engine/key_map.dart'; -part 'engine/mouse_cursor.dart'; part 'engine/onscreen_logging.dart'; part 'engine/picture.dart'; part 'engine/platform_dispatcher.dart'; part 'engine/platform_views.dart'; -part 'engine/plugins.dart'; -part 'engine/pointer_binding.dart'; -part 'engine/pointer_converter.dart'; part 'engine/profiler.dart'; part 'engine/rrect_renderer.dart'; part 'engine/semantics/accessibility.dart'; @@ -123,12 +176,6 @@ part 'engine/semantics/semantics.dart'; part 'engine/semantics/semantics_helper.dart'; part 'engine/semantics/tappable.dart'; part 'engine/semantics/text_field.dart'; -part 'engine/services/buffers.dart'; -part 'engine/services/message_codec.dart'; -part 'engine/services/message_codecs.dart'; -part 'engine/services/serialization.dart'; -part 'engine/shadow.dart'; -part 'engine/test_embedding.dart'; part 'engine/text/font_collection.dart'; part 'engine/text/layout_service.dart'; part 'engine/text/line_break_properties.dart'; @@ -145,11 +192,7 @@ part 'engine/text_editing/autofill_hint.dart'; part 'engine/text_editing/input_type.dart'; part 'engine/text_editing/text_capitalization.dart'; part 'engine/text_editing/text_editing.dart'; -part 'engine/ulps.dart'; part 'engine/util.dart'; -part 'engine/validators.dart'; -part 'engine/vector_math.dart'; -part 'engine/web_experiments.dart'; part 'engine/window.dart'; // The mode the app is running in. diff --git a/lib/web_ui/lib/src/engine/alarm_clock.dart b/lib/web_ui/lib/src/engine/alarm_clock.dart index 1a9c384f2c898..0dc69462fd35f 100644 --- a/lib/web_ui/lib/src/engine/alarm_clock.dart +++ b/lib/web_ui/lib/src/engine/alarm_clock.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:async'; + +import 'package:ui/ui.dart' as ui; /// A function that returns current system time. typedef TimestampFunction = DateTime Function(); diff --git a/lib/web_ui/lib/src/engine/browser_detection.dart b/lib/web_ui/lib/src/engine/browser_detection.dart index 3bcf63640081f..5fc9728cd4332 100644 --- a/lib/web_ui/lib/src/engine/browser_detection.dart +++ b/lib/web_ui/lib/src/engine/browser_detection.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:html' as html; + +import 'package:meta/meta.dart'; /// The HTML engine used by the current browser. enum BrowserEngine { diff --git a/lib/web_ui/lib/src/engine/mouse_cursor.dart b/lib/web_ui/lib/src/engine/mouse_cursor.dart index ad926e4a6c4bf..fad04d0e4f950 100644 --- a/lib/web_ui/lib/src/engine/mouse_cursor.dart +++ b/lib/web_ui/lib/src/engine/mouse_cursor.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'package:ui/src/engine.dart' show domRenderer, DomRenderer; /// Provides mouse cursor bindings, such as the `flutter/mousecursor` channel. class MouseCursor { diff --git a/lib/web_ui/lib/src/engine/navigation/history.dart b/lib/web_ui/lib/src/engine/navigation/history.dart index 3d5ea02569c0f..734bea3f78dec 100644 --- a/lib/web_ui/lib/src/engine/navigation/history.dart +++ b/lib/web_ui/lib/src/engine/navigation/history.dart @@ -3,7 +3,14 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:html' as html; + +import 'package:ui/src/engine.dart' show EnginePlatformDispatcher; +import 'package:ui/ui.dart' as ui; + +import '../services/message_codec.dart'; +import '../services/message_codecs.dart'; +import 'url_strategy.dart'; /// An abstract class that provides the API for [EngineWindow] to delegate its /// navigating events. diff --git a/lib/web_ui/lib/src/engine/navigation/js_url_strategy.dart b/lib/web_ui/lib/src/engine/navigation/js_url_strategy.dart index 1592d9451c974..41c7c90f759ab 100644 --- a/lib/web_ui/lib/src/engine/navigation/js_url_strategy.dart +++ b/lib/web_ui/lib/src/engine/navigation/js_url_strategy.dart @@ -3,7 +3,13 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +@JS() +library js_url_strategy; + +import 'dart:html' as html; + +import 'package:js/js.dart'; +import 'package:ui/ui.dart' as ui; typedef _PathGetter = String Function(); diff --git a/lib/web_ui/lib/src/engine/navigation/url_strategy.dart b/lib/web_ui/lib/src/engine/navigation/url_strategy.dart index 0cf1470050512..49ae240c4245e 100644 --- a/lib/web_ui/lib/src/engine/navigation/url_strategy.dart +++ b/lib/web_ui/lib/src/engine/navigation/url_strategy.dart @@ -3,7 +3,12 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:async'; +import 'dart:html' as html; + +import 'package:ui/ui.dart' as ui; + +import 'js_url_strategy.dart'; /// Represents and reads route state from the browser's URL. /// diff --git a/lib/web_ui/lib/src/engine/plugins.dart b/lib/web_ui/lib/src/engine/plugins.dart index 1f7361be83347..5233fb1e8aff5 100644 --- a/lib/web_ui/lib/src/engine/plugins.dart +++ b/lib/web_ui/lib/src/engine/plugins.dart @@ -3,6 +3,8 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:typed_data'; + +import 'package:ui/ui.dart' as ui; Future Function(String, ByteData?, ui.PlatformMessageResponseCallback?)? pluginMessageCallHandler; diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index d2a44b87f7954..bf76e01b51750 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -3,7 +3,16 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:html' as html; +import 'dart:js' as js; +import 'dart:js_util' as js_util; +import 'dart:math' as math; + +import 'package:meta/meta.dart'; +import 'package:ui/src/engine.dart'; +import 'package:ui/ui.dart' as ui; + +import 'pointer_converter.dart'; /// Set this flag to true to see all the fired events in the console. const bool _debugLogPointerEvents = false; diff --git a/lib/web_ui/lib/src/engine/pointer_converter.dart b/lib/web_ui/lib/src/engine/pointer_converter.dart index c2370d8ea187e..0aaf464c20477 100644 --- a/lib/web_ui/lib/src/engine/pointer_converter.dart +++ b/lib/web_ui/lib/src/engine/pointer_converter.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'package:ui/ui.dart' as ui; const bool _debugLogPointerConverter = false; diff --git a/lib/web_ui/lib/src/engine/services/buffers.dart b/lib/web_ui/lib/src/engine/services/buffers.dart index 33455825f05af..e5708ab1decf8 100644 --- a/lib/web_ui/lib/src/engine/services/buffers.dart +++ b/lib/web_ui/lib/src/engine/services/buffers.dart @@ -3,7 +3,8 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:collection'; +import 'dart:typed_data'; abstract class _TypedDataBuffer extends ListBase { static const int _initialLength = 8; diff --git a/lib/web_ui/lib/src/engine/services/message_codec.dart b/lib/web_ui/lib/src/engine/services/message_codec.dart index 1ae695210c8e4..032b16b74b893 100644 --- a/lib/web_ui/lib/src/engine/services/message_codec.dart +++ b/lib/web_ui/lib/src/engine/services/message_codec.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:typed_data'; + +import 'package:meta/meta.dart'; /// A message encoding/decoding mechanism. /// diff --git a/lib/web_ui/lib/src/engine/services/message_codecs.dart b/lib/web_ui/lib/src/engine/services/message_codecs.dart index 768a744fa2f3f..5dd32df395a8e 100644 --- a/lib/web_ui/lib/src/engine/services/message_codecs.dart +++ b/lib/web_ui/lib/src/engine/services/message_codecs.dart @@ -3,7 +3,11 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:convert'; +import 'dart:typed_data'; + +import 'message_codec.dart'; +import 'serialization.dart'; /// [MessageCodec] with unencoded binary messages represented using [ByteData]. /// diff --git a/lib/web_ui/lib/src/engine/services/serialization.dart b/lib/web_ui/lib/src/engine/services/serialization.dart index 2fc103a31c288..d27c4e7e909b1 100644 --- a/lib/web_ui/lib/src/engine/services/serialization.dart +++ b/lib/web_ui/lib/src/engine/services/serialization.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:typed_data'; + +import 'buffers.dart'; /// Write-only buffer for incrementally building a [ByteData] instance. /// diff --git a/lib/web_ui/lib/src/engine/shadow.dart b/lib/web_ui/lib/src/engine/shadow.dart index fb5dbec217701..4a2a2c659131e 100644 --- a/lib/web_ui/lib/src/engine/shadow.dart +++ b/lib/web_ui/lib/src/engine/shadow.dart @@ -3,7 +3,11 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:html' as html; +import 'dart:math' as math; + +import 'package:meta/meta.dart'; +import 'package:ui/ui.dart' as ui; /// How far is the light source from the surface of the UI. /// diff --git a/lib/web_ui/lib/src/engine/test_embedding.dart b/lib/web_ui/lib/src/engine/test_embedding.dart index 17c582605b32e..d10db9e280d01 100644 --- a/lib/web_ui/lib/src/engine/test_embedding.dart +++ b/lib/web_ui/lib/src/engine/test_embedding.dart @@ -3,7 +3,12 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:async'; +import 'dart:html' as html; + +import 'package:ui/ui.dart' as ui; + +import 'navigation/url_strategy.dart'; const bool _debugLogHistoryActions = false; diff --git a/lib/web_ui/lib/src/engine/ulps.dart b/lib/web_ui/lib/src/engine/ulps.dart index e65792d5db9bf..53b61bb517278 100644 --- a/lib/web_ui/lib/src/engine/ulps.dart +++ b/lib/web_ui/lib/src/engine/ulps.dart @@ -3,7 +3,8 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:math' as math; +import 'dart:typed_data'; // This is a small library to handle stability for floating point operations. // diff --git a/lib/web_ui/lib/src/engine/validators.dart b/lib/web_ui/lib/src/engine/validators.dart index d90acc59c4201..ecec9e8268572 100644 --- a/lib/web_ui/lib/src/engine/validators.dart +++ b/lib/web_ui/lib/src/engine/validators.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:typed_data'; + +import 'package:ui/ui.dart' as ui; bool rectIsValid(ui.Rect rect) { assert(rect != null, 'Rect argument was null.'); // ignore: unnecessary_null_comparison diff --git a/lib/web_ui/lib/src/engine/vector_math.dart b/lib/web_ui/lib/src/engine/vector_math.dart index fe0b3cd5fd67d..4e9b9d7d1f544 100644 --- a/lib/web_ui/lib/src/engine/vector_math.dart +++ b/lib/web_ui/lib/src/engine/vector_math.dart @@ -3,7 +3,10 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:math' as math; +import 'dart:typed_data'; + +import 'package:ui/src/engine.dart' show assertionsEnabled; class Matrix4 { final Float32List _m4storage; diff --git a/lib/web_ui/lib/src/engine/web_experiments.dart b/lib/web_ui/lib/src/engine/web_experiments.dart index 058600987bf0f..96092439cb727 100644 --- a/lib/web_ui/lib/src/engine/web_experiments.dart +++ b/lib/web_ui/lib/src/engine/web_experiments.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. // @dart = 2.12 -part of engine; +import 'dart:js' as js; + +import 'package:ui/src/engine.dart' show registerHotRestartListener; /// A bag of all experiment flags in the web engine. /// diff --git a/lib/web_ui/test/alarm_clock_test.dart b/lib/web_ui/test/alarm_clock_test.dart index b56d0dc27d798..f4e2676448fd3 100644 --- a/lib/web_ui/test/alarm_clock_test.dart +++ b/lib/web_ui/test/alarm_clock_test.dart @@ -8,7 +8,7 @@ import 'package:test/test.dart'; import 'package:quiver/testing/async.dart'; import 'package:quiver/time.dart'; -import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine/alarm_clock.dart'; void main() { internalBootstrapBrowserTest(() => testMain); diff --git a/lib/web_ui/test/browser_detect_test.dart b/lib/web_ui/test/browser_detect_test.dart index 501a764f251dd..d45159c20a072 100644 --- a/lib/web_ui/test/browser_detect_test.dart +++ b/lib/web_ui/test/browser_detect_test.dart @@ -5,7 +5,7 @@ // @dart = 2.12 import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; -import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine/browser_detection.dart'; void main() { internalBootstrapBrowserTest(() => testMain); diff --git a/lib/web_ui/test/engine/history_test.dart b/lib/web_ui/test/engine/history_test.dart index 920cce6e6cfd3..a4cc9514f1176 100644 --- a/lib/web_ui/test/engine/history_test.dart +++ b/lib/web_ui/test/engine/history_test.dart @@ -11,7 +11,13 @@ import 'dart:html' as html; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; -import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine.dart' show window; +import 'package:ui/src/engine/browser_detection.dart'; +import 'package:ui/src/engine/navigation/history.dart'; +import 'package:ui/src/engine/navigation/url_strategy.dart'; +import 'package:ui/src/engine/services/message_codec.dart'; +import 'package:ui/src/engine/services/message_codecs.dart'; +import 'package:ui/src/engine/test_embedding.dart'; import '../spy.dart'; diff --git a/lib/web_ui/test/engine/pointer_binding_test.dart b/lib/web_ui/test/engine/pointer_binding_test.dart index 15a7eeee9ea7c..8b85d0bda615d 100644 --- a/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/lib/web_ui/test/engine/pointer_binding_test.dart @@ -9,7 +9,9 @@ import 'dart:js_util' as js_util; import 'package:meta/meta.dart'; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; -import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine.dart' show domRenderer, window; +import 'package:ui/src/engine/browser_detection.dart'; +import 'package:ui/src/engine/pointer_binding.dart'; import 'package:ui/ui.dart' as ui; const int _kNoButtonChange = -1; diff --git a/lib/web_ui/test/engine/ulps_test.dart b/lib/web_ui/test/engine/ulps_test.dart index d0a26c45faad7..42ea75c38778b 100644 --- a/lib/web_ui/test/engine/ulps_test.dart +++ b/lib/web_ui/test/engine/ulps_test.dart @@ -5,7 +5,7 @@ import 'dart:typed_data'; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; -import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine/ulps.dart'; void main() { internalBootstrapBrowserTest(() => testMain); diff --git a/lib/web_ui/test/engine/web_experiments_test.dart b/lib/web_ui/test/engine/web_experiments_test.dart index c38de84767e7e..18a665b2249f8 100644 --- a/lib/web_ui/test/engine/web_experiments_test.dart +++ b/lib/web_ui/test/engine/web_experiments_test.dart @@ -8,7 +8,7 @@ import 'dart:js_util' as js_util; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; -import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine/web_experiments.dart'; const bool _defaultUseCanvasText = true; const bool _defaultUseCanvasRichText = true; diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index 78122e9a3fe49..c0d894188fdcd 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -17,78 +17,159 @@ final ArgParser argParser = ArgParser() ..addMultiOption('input') ..addOption('stamp'); -const List> uiPatterns = >[ - ['library ui;', 'library dart.ui;'], - ['part of ui;', 'part of dart.ui;'], - [ - r''' +final List uiPatterns = [ + AllReplacer('library ui;', 'library dart.ui;'), + AllReplacer('part of ui;', 'part of dart.ui;'), + AllReplacer(r''' import 'src/engine.dart' as engine; -''', - r''' +''', r''' import 'dart:_engine' as engine; -''' - ], - [ +'''), + AllReplacer( r''' export 'src/engine.dart' ''', r''' export 'dart:_engine' ''', - ], + ), ]; -const List> enginePatterns = >[ - ['library engine;', 'library dart._engine;'], - ['part of engine;', 'part of dart._engine;'], - [ - r''' +final List engineLibraryPatterns = [ + AllReplacer('library engine;', 'library dart._engine;'), + AllReplacer(r''' import '../ui.dart' as ui; -''', - r''' +''', r''' +import 'dart:ui' as ui; +'''), + AllReplacer(r''' +import 'package:ui/ui.dart' as ui; +''', r''' import 'dart:ui' as ui; -''' - ], - [ +'''), + // Remove imports of engine part files. + AllReplacer(RegExp(r"import 'engine/.*';"), ''), + // Replace exports of engine files with "part" directives. + MappedReplacer(RegExp(r''' +export 'engine/(.*)'; +'''), (Match match) => ''' +part 'engine/${match.group(1)}'; +'''), + AllReplacer( 'import \'package:js/js.dart\'', 'import \'dart:_js_annotations\'', - ], + ), ]; -const List> sharedPatterns = >[ - ["import 'package:meta/meta.dart';", ''], - ['@required', ''], - ['@protected', ''], - ['@mustCallSuper', ''], - ['@immutable', ''], - ['@visibleForTesting', ''] +final List enginePartsPatterns = [ + AllReplacer('part of engine;', 'part of dart._engine;'), + // Remove library-level JS annotations. + AllReplacer(RegExp(r'\n@JS(.*)\nlibrary .+;'), ''), + // Remove library directives. + AllReplacer(RegExp(r'\nlibrary .+;'), ''), + // Remove imports/exports from all engine parts. + AllReplacer(RegExp(r'import .*'), ''), + AllReplacer(RegExp(r'export .*'), ''), +]; + +final List sharedPatterns = [ + AllReplacer("import 'package:meta/meta.dart';", ''), + AllReplacer('@required', ''), + AllReplacer('@protected', ''), + AllReplacer('@mustCallSuper', ''), + AllReplacer('@immutable', ''), + AllReplacer('@visibleForTesting', ''), ]; // 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']); - final String inputDirectoryPath = results['input-dir']; - for (String inputFilePath in results['input']) { + final Directory directory = Directory(results['output-dir'] as String); + final String inputDirectoryPath = results['input-dir'] as String; + for (final String inputFilePath in results['input'] as Iterable) { final File inputFile = File(inputFilePath); final File outputFile = File(path.join( directory.path, inputFile.path.substring(inputDirectoryPath.length))) ..createSync(recursive: true); String source = inputFile.readAsStringSync(); - final List> replacementPatterns = >[]; + final List replacementPatterns = []; replacementPatterns.addAll(sharedPatterns); - if (results['ui']) { + if (results['ui'] as bool) { replacementPatterns.addAll(uiPatterns); - } else if (results['engine']) { - replacementPatterns.addAll(enginePatterns); + } else if (results['engine'] as bool) { + if (inputFilePath.endsWith('lib/src/engine.dart')) { + replacementPatterns.addAll(engineLibraryPatterns); + } else { + source = _preprocessEnginePartFile(source); + replacementPatterns.addAll(enginePartsPatterns); + } } - for (List patterns in replacementPatterns) { - source = source.replaceAll(patterns.first, patterns.last); + for (final Replacer replacer in replacementPatterns) { + source = replacer.perform(source); } outputFile.writeAsStringSync(source); if (results['stamp'] != null) { - File(results['stamp']).writeAsStringSync("stamp"); + File(results['stamp'] as String).writeAsStringSync('stamp'); } } } + +final RegExp _dartLangVersion = RegExp(r'\n// @dart = (.*)'); + +String _preprocessEnginePartFile(String source) { + if (source.contains('\npart of engine;')) { + // The file hasn't been migrated yet. + // Do nothing. + } else if (_dartLangVersion.hasMatch(source)) { + // The file contains a dart language version. We should insert the part + // directive after it. + source = source.replaceFirstMapped(_dartLangVersion, (Match match) { + return '${match.group(0)}\npart of engine;'; + }); + } else { + // The file doesn't have a dart language version, so we just insert the part + // directive at the beginning. + source = 'part of engine;\n' + source; + } + return source; +} + +/// Responsible for performing string replacements. +abstract class Replacer { + /// Performs the replacement in the provided [text]. + String perform(String text); +} + +/// Replaces all occurrences of a pattern with a fixed string. +class AllReplacer implements Replacer { + /// Creates a new tuple with the given [pattern] and [replacement] string. + AllReplacer(this._pattern, this._replacement); + + /// The pattern to be replaced. + final Pattern _pattern; + + /// The replacement string. + final String _replacement; + + @override + String perform(String text) { + return text.replaceAll(_pattern, _replacement); + } +} + +/// Uses a callback to replace each occurrence of a pattern. +class MappedReplacer implements Replacer { + MappedReplacer(this._pattern, this._replace); + + /// The pattern to be replaced. + final RegExp _pattern; + + /// A callback to replace each occurrence of [_pattern]. + final String Function(Match match) _replace; + + @override + String perform(String text) { + return text.replaceAllMapped(_pattern, _replace); + } +} From 30e445560364b4658143ddf01b5bc018d57cb99b Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 14 Apr 2021 09:58:15 -0700 Subject: [PATCH 2/4] add navigation.dart and services.dart --- lib/web_ui/lib/src/engine/navigation.dart | 8 ++++++++ lib/web_ui/lib/src/engine/services.dart | 9 +++++++++ lib/web_ui/test/engine/history_test.dart | 6 ++---- 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 lib/web_ui/lib/src/engine/navigation.dart create mode 100644 lib/web_ui/lib/src/engine/services.dart diff --git a/lib/web_ui/lib/src/engine/navigation.dart b/lib/web_ui/lib/src/engine/navigation.dart new file mode 100644 index 0000000000000..cd9b9de1d2d4e --- /dev/null +++ b/lib/web_ui/lib/src/engine/navigation.dart @@ -0,0 +1,8 @@ +// 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. + +// @dart = 2.12 +export 'navigation/history.dart'; +export 'navigation/js_url_strategy.dart'; +export 'navigation/url_strategy.dart'; \ No newline at end of file diff --git a/lib/web_ui/lib/src/engine/services.dart b/lib/web_ui/lib/src/engine/services.dart new file mode 100644 index 0000000000000..e15100973e2b1 --- /dev/null +++ b/lib/web_ui/lib/src/engine/services.dart @@ -0,0 +1,9 @@ +// 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. + +// @dart = 2.12 +export 'services/buffers.dart'; +export 'services/message_codec.dart'; +export 'services/message_codecs.dart'; +export 'services/serialization.dart'; \ No newline at end of file diff --git a/lib/web_ui/test/engine/history_test.dart b/lib/web_ui/test/engine/history_test.dart index a4cc9514f1176..5a54daefbbb09 100644 --- a/lib/web_ui/test/engine/history_test.dart +++ b/lib/web_ui/test/engine/history_test.dart @@ -13,10 +13,8 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart' show window; import 'package:ui/src/engine/browser_detection.dart'; -import 'package:ui/src/engine/navigation/history.dart'; -import 'package:ui/src/engine/navigation/url_strategy.dart'; -import 'package:ui/src/engine/services/message_codec.dart'; -import 'package:ui/src/engine/services/message_codecs.dart'; +import 'package:ui/src/engine/navigation.dart'; +import 'package:ui/src/engine/services.dart'; import 'package:ui/src/engine/test_embedding.dart'; import '../spy.dart'; From 05fe551895ebdc1417350f99655b0895f62e97c0 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 14 Apr 2021 10:43:26 -0700 Subject: [PATCH 3/4] licenses + explanation of transformations --- ci/licenses_golden/licenses_flutter | 2 ++ lib/web_ui/lib/src/engine.dart | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 093f8c362cfd8..0b331014078dd 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -514,6 +514,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/key_map.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_binding.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/mouse_cursor.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation/history.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation/js_url_strategy.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation/url_strategy.dart @@ -537,6 +538,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/semantics/semantics.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/semantics/tappable.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/semantics/text_field.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/services.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/buffers.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codec.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart index 87a56cb6643ed..699270fc1c4e0 100644 --- a/lib/web_ui/lib/src/engine.dart +++ b/lib/web_ui/lib/src/engine.dart @@ -6,6 +6,15 @@ @JS() library engine; +// This file is transformed during the build process in order to make it a +// single library. Some notable transformations: +// +// 1. Imports of engine/* files are stripped out. +// 2. Exports of engine/* files are replaced with a part directive. +// +// The code that performs the transformations lives in: +// - https://github.com/flutter/engine/blob/master/web_sdk/sdk_rewriter.dart + import 'dart:async'; import 'dart:collection' // Some of these names are used in services/buffers.dart for example. From 8e1abd0218e257ab60cf09076991b1b52dd4eb36 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Mon, 19 Apr 2021 12:15:49 -0700 Subject: [PATCH 4/4] remove the dart language check --- web_sdk/sdk_rewriter.dart | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index c0d894188fdcd..dfa63e2652d6d 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -115,21 +115,12 @@ void main(List arguments) { } } -final RegExp _dartLangVersion = RegExp(r'\n// @dart = (.*)'); - String _preprocessEnginePartFile(String source) { if (source.contains('\npart of engine;')) { // The file hasn't been migrated yet. // Do nothing. - } else if (_dartLangVersion.hasMatch(source)) { - // The file contains a dart language version. We should insert the part - // directive after it. - source = source.replaceFirstMapped(_dartLangVersion, (Match match) { - return '${match.group(0)}\npart of engine;'; - }); } else { - // The file doesn't have a dart language version, so we just insert the part - // directive at the beginning. + // Insert the part directive at the beginning of the file. source = 'part of engine;\n' + source; } return source;