From 66025240405b38c7130ff95af25eca2d023cf0e1 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 28 Jun 2024 20:28:03 -0700 Subject: [PATCH 1/3] ad omit_local_variable_types lint --- lib/web_ui/analysis_options.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/web_ui/analysis_options.yaml b/lib/web_ui/analysis_options.yaml index 0938119b50664..084372f9d5899 100644 --- a/lib/web_ui/analysis_options.yaml +++ b/lib/web_ui/analysis_options.yaml @@ -16,3 +16,4 @@ linter: public_member_api_docs: false unawaited_futures: true use_setters_to_change_properties: false + omit_local_variable_types: true From 5a7f146506a9d2da2b9a5b3e0b49b2842236f72f Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 28 Jun 2024 20:29:27 -0700 Subject: [PATCH 2/3] remove unnecessary types --- lib/web_ui/dev/analyze.dart | 2 +- lib/web_ui/dev/browser_process.dart | 12 +- lib/web_ui/dev/build.dart | 6 +- lib/web_ui/dev/chrome.dart | 50 +- lib/web_ui/dev/chrome_installer.dart | 41 +- lib/web_ui/dev/cipd.dart | 12 +- lib/web_ui/dev/clean.dart | 4 +- lib/web_ui/dev/edge.dart | 8 +- lib/web_ui/dev/edge_installation.dart | 6 +- lib/web_ui/dev/environment.dart | 26 +- lib/web_ui/dev/felt.dart | 6 +- lib/web_ui/dev/felt_config.dart | 82 +- lib/web_ui/dev/firefox.dart | 12 +- lib/web_ui/dev/firefox_installer.dart | 68 +- lib/web_ui/dev/generate_builder_json.dart | 2 +- lib/web_ui/dev/licenses.dart | 12 +- lib/web_ui/dev/package_lock.dart | 4 +- lib/web_ui/dev/package_roller.dart | 66 +- lib/web_ui/dev/pipeline.dart | 18 +- lib/web_ui/dev/roll_fallback_fonts.dart | 178 ++--- lib/web_ui/dev/steps/compile_bundle_step.dart | 62 +- lib/web_ui/dev/steps/copy_artifacts_step.dart | 88 +-- lib/web_ui/dev/steps/run_suite_step.dart | 37 +- lib/web_ui/dev/test_platform.dart | 158 ++-- lib/web_ui/dev/test_runner.dart | 92 +-- lib/web_ui/dev/utils.dart | 22 +- lib/web_ui/dev/webdriver_browser.dart | 8 +- lib/web_ui/lib/src/engine/alarm_clock.dart | 6 +- .../lib/src/engine/browser_detection.dart | 8 +- lib/web_ui/lib/src/engine/canvas_pool.dart | 188 ++--- .../lib/src/engine/canvaskit/canvas.dart | 14 +- .../src/engine/canvaskit/canvaskit_api.dart | 78 +- .../engine/canvaskit/canvaskit_canvas.dart | 30 +- .../src/engine/canvaskit/color_filter.dart | 22 +- .../canvaskit/display_canvas_factory.dart | 8 +- .../src/engine/canvaskit/embedded_views.dart | 172 ++--- .../lib/src/engine/canvaskit/fonts.dart | 68 +- .../lib/src/engine/canvaskit/image.dart | 30 +- .../src/engine/canvaskit/image_filter.dart | 10 +- .../engine/canvaskit/image_wasm_codecs.dart | 14 +- .../engine/canvaskit/image_web_codecs.dart | 54 +- .../lib/src/engine/canvaskit/layer.dart | 46 +- .../engine/canvaskit/layer_scene_builder.dart | 6 +- .../lib/src/engine/canvaskit/layer_tree.dart | 18 +- .../lib/src/engine/canvaskit/mask_filter.dart | 2 +- .../canvaskit/multi_surface_rasterizer.dart | 8 +- .../src/engine/canvaskit/n_way_canvas.dart | 24 +- .../src/engine/canvaskit/native_memory.dart | 4 +- .../offscreen_canvas_rasterizer.dart | 2 +- .../canvaskit/overlay_scene_optimizer.dart | 32 +- .../lib/src/engine/canvaskit/painting.dart | 16 +- lib/web_ui/lib/src/engine/canvaskit/path.dart | 26 +- .../src/engine/canvaskit/path_metrics.dart | 7 +- .../lib/src/engine/canvaskit/picture.dart | 17 +- .../engine/canvaskit/picture_recorder.dart | 13 +- .../lib/src/engine/canvaskit/rasterizer.dart | 8 +- .../src/engine/canvaskit/render_canvas.dart | 8 +- .../lib/src/engine/canvaskit/renderer.dart | 36 +- .../lib/src/engine/canvaskit/shader.dart | 4 +- .../lib/src/engine/canvaskit/surface.dart | 40 +- lib/web_ui/lib/src/engine/canvaskit/text.dart | 157 ++-- .../src/engine/canvaskit/text_fragmenter.dart | 24 +- lib/web_ui/lib/src/engine/canvaskit/util.dart | 38 +- .../lib/src/engine/canvaskit/vertices.dart | 2 +- lib/web_ui/lib/src/engine/clipboard.dart | 16 +- lib/web_ui/lib/src/engine/configuration.dart | 8 +- lib/web_ui/lib/src/engine/display.dart | 8 +- lib/web_ui/lib/src/engine/dom.dart | 64 +- lib/web_ui/lib/src/engine/engine_canvas.dart | 16 +- lib/web_ui/lib/src/engine/font_fallbacks.dart | 98 +-- lib/web_ui/lib/src/engine/fonts.dart | 18 +- .../lib/src/engine/frame_reference.dart | 8 +- .../lib/src/engine/frame_timing_recorder.dart | 4 +- .../lib/src/engine/html/backdrop_filter.dart | 22 +- .../lib/src/engine/html/bitmap_canvas.dart | 206 ++--- lib/web_ui/lib/src/engine/html/canvas.dart | 58 +- lib/web_ui/lib/src/engine/html/clip.dart | 8 +- .../lib/src/engine/html/color_filter.dart | 42 +- .../html/debug_canvas_reuse_overlay.dart | 2 +- .../lib/src/engine/html/dom_canvas.dart | 36 +- lib/web_ui/lib/src/engine/html/image.dart | 8 +- .../lib/src/engine/html/image_filter.dart | 8 +- lib/web_ui/lib/src/engine/html/offset.dart | 2 +- lib/web_ui/lib/src/engine/html/opacity.dart | 8 +- lib/web_ui/lib/src/engine/html/painting.dart | 10 +- .../lib/src/engine/html/path/conic.dart | 266 +++---- .../lib/src/engine/html/path/cubic.dart | 218 +++--- lib/web_ui/lib/src/engine/html/path/path.dart | 458 +++++------ .../src/engine/html/path/path_iterator.dart | 24 +- .../src/engine/html/path/path_metrics.dart | 232 +++--- .../lib/src/engine/html/path/path_ref.dart | 232 +++--- .../lib/src/engine/html/path/path_to_svg.dart | 27 +- .../lib/src/engine/html/path/path_utils.dart | 56 +- .../src/engine/html/path/path_windings.dart | 134 ++-- .../lib/src/engine/html/path/tangent.dart | 128 ++-- .../lib/src/engine/html/path_to_svg_clip.dart | 10 +- lib/web_ui/lib/src/engine/html/picture.dart | 127 ++- .../lib/src/engine/html/recording_canvas.dart | 424 +++++----- .../lib/src/engine/html/render_vertices.dart | 176 ++--- lib/web_ui/lib/src/engine/html/renderer.dart | 16 +- .../lib/src/engine/html/resource_manager.dart | 6 +- lib/web_ui/lib/src/engine/html/scene.dart | 4 +- .../lib/src/engine/html/scene_builder.dart | 6 +- .../lib/src/engine/html/shader_mask.dart | 28 +- .../src/engine/html/shaders/image_shader.dart | 70 +- .../html/shaders/normalized_gradient.dart | 58 +- .../lib/src/engine/html/shaders/shader.dart | 202 ++--- .../engine/html/shaders/shader_builder.dart | 16 +- .../engine/html/shaders/vertex_shaders.dart | 12 +- lib/web_ui/lib/src/engine/html/surface.dart | 174 ++--- .../lib/src/engine/html/surface_stats.dart | 92 +-- lib/web_ui/lib/src/engine/html/transform.dart | 6 +- .../src/engine/html_image_element_codec.dart | 16 +- lib/web_ui/lib/src/engine/image_decoder.dart | 44 +- lib/web_ui/lib/src/engine/initialization.dart | 12 +- .../lib/src/engine/keyboard_binding.dart | 64 +- lib/web_ui/lib/src/engine/layers.dart | 44 +- lib/web_ui/lib/src/engine/mouse/cursor.dart | 2 +- .../lib/src/engine/navigation/history.dart | 18 +- .../lib/src/engine/onscreen_logging.dart | 16 +- .../lib/src/engine/platform_dispatcher.dart | 92 +-- .../app_lifecycle_state.dart | 4 +- .../view_focus_binding.dart | 8 +- .../platform_views/content_manager.dart | 8 +- .../lib/src/engine/platform_views/slots.dart | 6 +- .../lib/src/engine/pointer_binding.dart | 134 ++-- .../event_position_helper.dart | 25 +- .../lib/src/engine/pointer_converter.dart | 28 +- lib/web_ui/lib/src/engine/profiler.dart | 16 +- lib/web_ui/lib/src/engine/raw_keyboard.dart | 16 +- lib/web_ui/lib/src/engine/rrect_renderer.dart | 26 +- .../lib/src/engine/safe_browser_api.dart | 72 +- lib/web_ui/lib/src/engine/scene_builder.dart | 14 +- lib/web_ui/lib/src/engine/scene_view.dart | 84 +- .../src/engine/semantics/accessibility.dart | 22 +- .../lib/src/engine/semantics/dialog.dart | 10 +- .../lib/src/engine/semantics/focusable.dart | 10 +- .../src/engine/semantics/incrementable.dart | 14 +- .../src/engine/semantics/label_and_value.dart | 48 +- lib/web_ui/lib/src/engine/semantics/link.dart | 2 +- .../lib/src/engine/semantics/scrollable.dart | 14 +- .../lib/src/engine/semantics/semantics.dart | 205 +++-- .../engine/semantics/semantics_helper.dart | 32 +- .../lib/src/engine/semantics/tappable.dart | 2 +- .../lib/src/engine/semantics/text_field.dart | 2 +- .../lib/src/engine/services/buffers.dart | 28 +- .../src/engine/services/message_codecs.dart | 42 +- .../src/engine/services/serialization.dart | 32 +- lib/web_ui/lib/src/engine/shader_data.dart | 38 +- lib/web_ui/lib/src/engine/shadow.dart | 28 +- .../src/engine/skwasm/skwasm_impl/canvas.dart | 38 +- .../src/engine/skwasm/skwasm_impl/codecs.dart | 6 +- .../engine/skwasm/skwasm_impl/filters.dart | 6 +- .../skwasm/skwasm_impl/font_collection.dart | 74 +- .../src/engine/skwasm/skwasm_impl/image.dart | 22 +- .../src/engine/skwasm/skwasm_impl/paint.dart | 18 +- .../engine/skwasm/skwasm_impl/paragraph.dart | 174 ++--- .../src/engine/skwasm/skwasm_impl/path.dart | 14 +- .../skwasm/skwasm_impl/path_metrics.dart | 8 +- .../engine/skwasm/skwasm_impl/picture.dart | 4 +- .../skwasm/skwasm_impl/raw/raw_memory.dart | 74 +- .../skwasm/skwasm_impl/raw/raw_skstring.dart | 12 +- .../engine/skwasm/skwasm_impl/renderer.dart | 22 +- .../engine/skwasm/skwasm_impl/shaders.dart | 62 +- .../engine/skwasm/skwasm_impl/surface.dart | 32 +- .../engine/skwasm/skwasm_impl/vertices.dart | 20 +- lib/web_ui/lib/src/engine/svg.dart | 2 +- lib/web_ui/lib/src/engine/test_embedding.dart | 8 +- .../lib/src/engine/text/canvas_paragraph.dart | 60 +- .../lib/src/engine/text/font_collection.dart | 20 +- .../src/engine/text/layout_fragmenter.dart | 80 +- .../lib/src/engine/text/layout_service.dart | 164 ++-- .../lib/src/engine/text/line_breaker.dart | 32 +- .../lib/src/engine/text/measurement.dart | 4 +- .../lib/src/engine/text/paint_service.dart | 24 +- lib/web_ui/lib/src/engine/text/paragraph.dart | 126 +-- lib/web_ui/lib/src/engine/text/ruler.dart | 22 +- .../lib/src/engine/text/text_direction.dart | 20 +- .../lib/src/engine/text/unicode_range.dart | 48 +- .../lib/src/engine/text/word_breaker.dart | 10 +- .../text_editing/composition_aware_mixin.dart | 2 +- .../text_editing/text_capitalization.dart | 6 +- .../src/engine/text_editing/text_editing.dart | 173 +++-- lib/web_ui/lib/src/engine/util.dart | 54 +- lib/web_ui/lib/src/engine/vector_math.dart | 370 ++++----- .../custom_element_dimensions_provider.dart | 4 +- .../full_page_dimensions_provider.dart | 16 +- .../src/engine/view_embedder/dom_manager.dart | 14 +- .../full_page_embedding_strategy.dart | 4 +- .../view_embedder/flutter_view_manager.dart | 18 +- .../view_embedder/global_html_attributes.dart | 2 +- .../hot_restart_cache_handler.dart | 6 +- .../engine/view_embedder/style_manager.dart | 2 +- lib/web_ui/lib/src/engine/window.dart | 32 +- .../lib/ui_web/src/ui_web/asset_manager.dart | 8 +- .../ui_web/src/ui_web/browser_detection.dart | 8 +- .../lib/ui_web/src/ui_web/initialization.dart | 4 +- .../src/ui_web/navigation/url_strategy.dart | 4 +- lib/web_ui/lib/ui_web/src/ui_web/testing.dart | 4 +- .../backdrop_filter_golden_test.dart | 64 +- .../test/canvaskit/canvas_golden_test.dart | 92 +-- .../test/canvaskit/canvaskit_api_test.dart | 310 ++++---- .../canvaskit/canvaskit_api_tt_on_test.dart | 4 +- .../canvaskit/color_filter_golden_test.dart | 92 +-- lib/web_ui/test/canvaskit/common.dart | 22 +- .../configuration_canvaskit_variant_test.dart | 2 +- .../display_canvas_factory_test.dart | 24 +- .../test/canvaskit/embedded_views_test.dart | 150 ++-- lib/web_ui/test/canvaskit/filter_test.dart | 74 +- .../flutter_tester_emulation_golden_test.dart | 10 +- .../test/canvaskit/fragment_program_test.dart | 25 +- .../test/canvaskit/hot_restart_test.dart | 2 +- .../test/canvaskit/image_golden_test.dart | 262 +++---- lib/web_ui/test/canvaskit/image_test.dart | 29 +- .../initialization/services_vs_ui_test.dart | 8 +- .../initialization/stores_config_test.dart | 2 +- lib/web_ui/test/canvaskit/layer_test.dart | 48 +- .../linear_gradient_golden_test.dart | 16 +- .../test/canvaskit/multi_view_test.dart | 12 +- .../test/canvaskit/native_memory_test.dart | 36 +- .../no_create_image_bitmap_test.dart | 8 +- lib/web_ui/test/canvaskit/painting_test.dart | 2 +- lib/web_ui/test/canvaskit/path_test.dart | 46 +- lib/web_ui/test/canvaskit/picture_test.dart | 57 +- .../canvaskit/platform_dispatcher_test.dart | 4 +- .../test/canvaskit/render_canvas_test.dart | 12 +- lib/web_ui/test/canvaskit/renderer_test.dart | 60 +- lib/web_ui/test/canvaskit/scene_test.dart | 18 +- .../canvaskit/shader_mask_golden_test.dart | 36 +- lib/web_ui/test/canvaskit/shader_test.dart | 30 +- .../canvaskit/skia_font_collection_test.dart | 24 +- lib/web_ui/test/canvaskit/surface_test.dart | 82 +- .../canvaskit/sweep_gradient_golden_test.dart | 8 +- .../test/canvaskit/text_fragmenter_test.dart | 43 +- lib/web_ui/test/canvaskit/text_test.dart | 38 +- .../test/common/fake_asset_manager.dart | 10 +- lib/web_ui/test/common/matchers.dart | 80 +- lib/web_ui/test/common/spy.dart | 2 +- .../test/common/test_initialization.dart | 6 +- lib/web_ui/test/engine/alarm_clock_test.dart | 31 +- .../test/engine/app_bootstrap_test.dart | 46 +- lib/web_ui/test/engine/assets_test.dart | 22 +- .../test/engine/browser_detect_test.dart | 6 +- lib/web_ui/test/engine/canvas_test.dart | 18 +- .../test/engine/channel_buffers_test.dart | 126 +-- lib/web_ui/test/engine/clipboard_test.dart | 28 +- lib/web_ui/test/engine/composition_test.dart | 72 +- .../test/engine/configuration_test.dart | 18 +- lib/web_ui/test/engine/display_test.dart | 4 +- .../test/engine/dom_http_fetch_test.dart | 41 +- .../engine/engine_browser_detect_test.dart | 4 +- .../test/engine/frame_reference_test.dart | 34 +- lib/web_ui/test/engine/geometry_test.dart | 22 +- .../test/engine/gesture_settings_test.dart | 16 +- .../test/engine/global_styles_test.dart | 28 +- lib/web_ui/test/engine/hash_codes_test.dart | 8 +- lib/web_ui/test/engine/history_test.dart | 80 +- .../image/html_image_element_codec_test.dart | 44 +- lib/web_ui/test/engine/image/image_test.dart | 20 +- .../test/engine/image_to_byte_data_test.dart | 19 +- .../test/engine/initialization_test.dart | 4 +- .../test/engine/keyboard_converter_test.dart | 94 +-- lib/web_ui/test/engine/lerp_test.dart | 4 +- lib/web_ui/test/engine/lru_cache_test.dart | 8 +- lib/web_ui/test/engine/matchers_test.dart | 6 +- .../test/engine/mouse/context_menu_test.dart | 24 +- lib/web_ui/test/engine/mouse/cursor_test.dart | 8 +- lib/web_ui/test/engine/navigation_test.dart | 6 +- .../app_lifecycle_state_test.dart | 4 +- ...application_switcher_description_test.dart | 8 +- .../platform_dispatcher_test.dart | 74 +- .../system_ui_overlay_style_test.dart | 4 +- .../view_focus_binding_test.dart | 40 +- .../platform_views/content_manager_test.dart | 50 +- .../platform_views/message_handler_test.dart | 52 +- .../engine/platform_views/slots_test.dart | 8 +- .../event_position_helper_test.dart | 9 +- .../test/engine/pointer_binding_test.dart | 138 ++-- lib/web_ui/test/engine/profiler_test.dart | 18 +- lib/web_ui/test/engine/raw_keyboard_test.dart | 54 +- .../test/engine/recording_canvas_test.dart | 50 +- lib/web_ui/test/engine/routing_test.dart | 26 +- .../test/engine/scene_builder_test.dart | 74 +- lib/web_ui/test/engine/scene_view_test.dart | 56 +- .../semantics_announcement_test.dart | 2 +- .../engine/semantics/semantics_api_test.dart | 12 +- .../semantics/semantics_auto_enable_test.dart | 4 +- .../semantics/semantics_helper_test.dart | 16 +- .../semantics/semantics_multi_view_test.dart | 12 +- .../semantics_placeholder_enable_test.dart | 4 +- .../test/engine/semantics/semantics_test.dart | 348 ++++----- .../engine/semantics/semantics_tester.dart | 12 +- .../engine/semantics/semantics_text_test.dart | 34 +- .../engine/semantics/text_field_test.dart | 60 +- .../engine/services/serialization_test.dart | 50 +- .../surface/filters/image_filter_test.dart | 27 +- .../surface/path/path_iterator_test.dart | 26 +- .../surface/path/path_winding_test.dart | 82 +- .../engine/surface/platform_view_test.dart | 16 +- .../engine/surface/scene_builder_test.dart | 256 +++---- .../shaders/normalized_gradient_test.dart | 32 +- .../surface/shaders/shader_builder_test.dart | 34 +- .../test/engine/surface/surface_test.dart | 142 ++-- lib/web_ui/test/engine/text_editing_test.dart | 722 +++++++++--------- lib/web_ui/test/engine/util_test.dart | 8 +- lib/web_ui/test/engine/vector_math_test.dart | 10 +- .../engine/view/view_constraints_test.dart | 12 +- ...stom_element_dimensions_provider_test.dart | 26 +- .../dimensions_provider_test.dart | 6 +- .../full_page_dimensions_provider_test.dart | 20 +- .../display_dpr_stream_test.dart | 3 +- .../view_embedder/dom_manager_test.dart | 26 +- ...ustom_element_embedding_strategy_test.dart | 6 +- .../embedding_strategy_test.dart | 6 +- .../full_page_embedding_strategy_test.dart | 16 +- .../flutter_view_manager_test.dart | 70 +- .../flutter_views_proxy_test.dart | 20 +- .../global_html_attributes_test.dart | 6 +- .../hot_restart_cache_handler_test.dart | 14 +- .../view_embedder/style_manager_test.dart | 14 +- lib/web_ui/test/engine/window_test.dart | 88 +-- .../test/html/bitmap_canvas_golden_test.dart | 44 +- .../html/canvas_clip_path_golden_test.dart | 62 +- .../test/html/canvas_context_golden_test.dart | 20 +- .../test/html/canvas_reuse_golden_test.dart | 26 +- .../html/canvas_winding_rule_golden_test.dart | 10 +- lib/web_ui/test/html/clip_op_golden_test.dart | 28 +- .../backdrop_filter_golden_test.dart | 54 +- .../compositing/canvas_blend_golden_test.dart | 14 +- .../canvas_image_blend_mode_golden_test.dart | 42 +- .../canvas_image_filter_golden_test.dart | 10 +- .../canvas_mask_filter_golden_test.dart | 34 +- .../compositing/color_filter_golden_test.dart | 28 +- .../compositing/compositing_golden_test.dart | 102 +-- .../dom_mask_filter_golden_test.dart | 6 +- lib/web_ui/test/html/dom_canvas_test.dart | 8 +- .../html/drawing/canvas_arc_golden_test.dart | 14 +- .../canvas_draw_color_golden_test.dart | 18 +- .../canvas_draw_image_golden_test.dart | 177 +++-- .../canvas_draw_picture_golden_test.dart | 28 +- .../drawing/canvas_lines_golden_test.dart | 32 +- .../html/drawing/canvas_rect_golden_test.dart | 2 +- .../drawing/canvas_rrect_golden_test.dart | 26 +- .../canvas_stroke_joins_golden_test.dart | 24 +- .../canvas_stroke_rects_golden_test.dart | 2 +- .../test/html/drawing/conic_golden_test.dart | 40 +- .../drawing/dom_clip_stroke_golden_test.dart | 18 +- .../drawing/draw_vertices_golden_test.dart | 64 +- lib/web_ui/test/html/image_test.dart | 34 +- .../test/html/paragraph/bidi_golden_test.dart | 140 ++-- .../html/paragraph/general_golden_test.dart | 140 ++-- lib/web_ui/test/html/paragraph/helper.dart | 14 +- .../html/paragraph/justify_golden_test.dart | 76 +- .../html/paragraph/overflow_golden_test.dart | 14 +- .../paragraph/placeholders_golden_test.dart | 44 +- .../html/paragraph/shadows_golden_test.dart | 4 +- .../test/html/paragraph/text_goldens.dart | 10 +- .../text_multiline_clipping_golden_test.dart | 20 +- .../paragraph/text_overflow_golden_test.dart | 4 +- .../text_placeholders_golden_test.dart | 22 +- .../test/html/path_metrics_golden_test.dart | 122 +-- lib/web_ui/test/html/path_ref_test.dart | 32 +- lib/web_ui/test/html/path_test.dart | 136 ++-- .../test/html/path_to_svg_golden_test.dart | 50 +- .../test/html/path_transform_golden_test.dart | 62 +- lib/web_ui/test/html/picture_golden_test.dart | 6 +- .../html/recording_canvas_golden_test.dart | 158 ++-- .../test/html/resource_manager_test.dart | 12 +- lib/web_ui/test/html/screenshot.dart | 4 +- .../html/shaders/gradient_golden_test.dart | 186 ++--- .../shaders/image_shader_golden_test.dart | 28 +- .../shaders/linear_gradient_golden_test.dart | 62 +- .../shaders/radial_gradient_golden_test.dart | 20 +- .../html/shaders/shader_mask_golden_test.dart | 48 +- lib/web_ui/test/html/shadow_golden_test.dart | 32 +- .../text/canvas_paragraph_builder_test.dart | 82 +- .../test/html/text/canvas_paragraph_test.dart | 58 +- .../test/html/text/font_collection_test.dart | 50 +- .../test/html/text/font_loading_test.dart | 24 +- .../html/text/layout_fragmenter_test.dart | 18 +- .../test/html/text/layout_service_helper.dart | 10 +- .../html/text/layout_service_plain_test.dart | 46 +- .../html/text/layout_service_rich_test.dart | 28 +- .../test/html/text/line_breaker_test.dart | 46 +- .../html/text/line_breaker_test_helper.dart | 36 +- .../test/html/text/word_breaker_test.dart | 26 +- lib/web_ui/test/html/text_test.dart | 124 +-- .../test/ui/canvas_curves_golden_test.dart | 14 +- .../ui/canvas_draw_points_golden_test.dart | 24 +- .../test/ui/canvas_lines_golden_test.dart | 44 +- lib/web_ui/test/ui/canvas_test.dart | 134 ++-- lib/web_ui/test/ui/color_test.dart | 24 +- .../test/ui/draw_atlas_golden_test.dart | 80 +- .../test/ui/fallback_fonts_golden_test.dart | 56 +- lib/web_ui/test/ui/filters_test.dart | 30 +- lib/web_ui/test/ui/font_collection_test.dart | 32 +- lib/web_ui/test/ui/fragment_shader_test.dart | 16 +- lib/web_ui/test/ui/frame_timings_test.dart | 8 +- lib/web_ui/test/ui/gradient_golden_test.dart | 18 +- lib/web_ui/test/ui/image_golden_test.dart | 142 ++-- lib/web_ui/test/ui/line_metrics_test.dart | 58 +- lib/web_ui/test/ui/paint_test.dart | 6 +- .../test/ui/paragraph_builder_test.dart | 44 +- lib/web_ui/test/ui/paragraph_style_test.dart | 56 +- lib/web_ui/test/ui/path_metrics_test.dart | 178 ++--- lib/web_ui/test/ui/path_test.dart | 114 +-- lib/web_ui/test/ui/picture_test.dart | 20 +- lib/web_ui/test/ui/platform_view_test.dart | 32 +- lib/web_ui/test/ui/rect_test.dart | 34 +- lib/web_ui/test/ui/rrect_test.dart | 22 +- lib/web_ui/test/ui/scene_builder_test.dart | 46 +- lib/web_ui/test/ui/shadow_test.dart | 10 +- lib/web_ui/test/ui/strut_style_test.dart | 56 +- lib/web_ui/test/ui/text_golden_test.dart | 46 +- lib/web_ui/test/ui/text_style_test.dart | 74 +- .../test/ui/text_style_test_env_test.dart | 8 +- lib/web_ui/test/ui/url_strategy_test.dart | 2 +- lib/web_ui/test/ui/utils.dart | 6 +- lib/web_ui/test/ui/vertices_test.dart | 14 +- 419 files changed, 9686 insertions(+), 9710 deletions(-) diff --git a/lib/web_ui/dev/analyze.dart b/lib/web_ui/dev/analyze.dart index b7038480720ed..294539f8ff98d 100644 --- a/lib/web_ui/dev/analyze.dart +++ b/lib/web_ui/dev/analyze.dart @@ -19,7 +19,7 @@ class AnalyzeCommand extends Command with ArgUtils { @override FutureOr run() async { - final Pipeline buildPipeline = Pipeline(steps: [ + final buildPipeline = Pipeline(steps: [ PubGetStep(), AnalyzeStep(), ]); diff --git a/lib/web_ui/dev/browser_process.dart b/lib/web_ui/dev/browser_process.dart index 104dafc51c893..399954bbff11e 100644 --- a/lib/web_ui/dev/browser_process.dart +++ b/lib/web_ui/dev/browser_process.dart @@ -21,10 +21,10 @@ class BrowserProcess { // for the process to actually start. They should just wait for the HTTP // request instead. runZonedGuarded(() async { - final Process process = await startBrowser(); + final process = await startBrowser(); _processCompleter.complete(process); - final Uint8Buffer output = Uint8Buffer(); + final output = Uint8Buffer(); void drainOutput(Stream> stream) { try { _ioSubscriptions @@ -36,7 +36,7 @@ class BrowserProcess { drainOutput(process.stdout); drainOutput(process.stderr); - final int exitCode = await process.exitCode; + final exitCode = await process.exitCode; // This hack dodges an otherwise intractable race condition. When the user // presses Control-C, the signal is sent to the browser and the test @@ -53,8 +53,8 @@ class BrowserProcess { } if (!_closed && exitCode != 0) { - final String outputString = utf8.decode(output); - String message = 'Browser process failed with exit code $exitCode.'; + final outputString = utf8.decode(output); + var message = 'Browser process failed with exit code $exitCode.'; if (outputString.isNotEmpty) { message += '\nStandard output:\n$outputString'; } @@ -113,7 +113,7 @@ class BrowserProcess { // If we don't manually close the stream the test runner can hang. // For example this happens with Chrome Headless. // See SDK issue: https://github.com/dart-lang/sdk/issues/31264 - for (final StreamSubscription stream in _ioSubscriptions) { + for (final stream in _ioSubscriptions) { unawaited(stream.cancel()); } diff --git a/lib/web_ui/dev/build.dart b/lib/web_ui/dev/build.dart index 1b6fcf3cbe5f6..918b020abbc91 100644 --- a/lib/web_ui/dev/build.dart +++ b/lib/web_ui/dev/build.dart @@ -72,8 +72,8 @@ class BuildCommand extends Command with ArgUtils { if (embedDwarf && runtimeMode != RuntimeMode.debug) { throw ToolExit('Embedding DWARF data requires debug runtime mode.'); } - final FilePath libPath = FilePath.fromWebUi('lib'); - final List steps = [ + final libPath = FilePath.fromWebUi('lib'); + final steps = [ GnPipelineStep( host: host, runtimeMode: runtimeMode, @@ -85,7 +85,7 @@ class BuildCommand extends Command with ArgUtils { targets: targets.map((String target) => targetAliases[target] ?? target), ), ]; - final Pipeline buildPipeline = Pipeline(steps: steps); + final buildPipeline = Pipeline(steps: steps); await buildPipeline.run(); if (isWatchMode) { diff --git a/lib/web_ui/dev/chrome.dart b/lib/web_ui/dev/chrome.dart index d6ecd3d2daafd..7ebfacfda6845 100644 --- a/lib/web_ui/dev/chrome.dart +++ b/lib/web_ui/dev/chrome.dart @@ -48,7 +48,7 @@ class ChromeEnvironment implements BrowserEnvironment { @override Future prepare() async { - final String version = packageLock.chromeLock.version; + final version = packageLock.chromeLock.version; _installation = await getOrInstallChrome( version, infoLog: isCi ? stdout : DevNull(), @@ -81,7 +81,7 @@ class Chrome extends Browser { required bool debug, required bool useDwarf, }) { - final Completer remoteDebuggerCompleter = Completer.sync(); + final remoteDebuggerCompleter = Completer.sync(); return Chrome._(BrowserProcess(() async { // A good source of various Chrome CLI options: // https://peter.sh/experiments/chromium-command-line-switches/ @@ -93,10 +93,10 @@ class Chrome extends Browser { // --disable-gpu // --disallow-non-exact-resource-reuse // --disable-font-subpixel-positioning - final bool isChromeNoSandbox = + final isChromeNoSandbox = Platform.environment['CHROME_NO_SANDBOX'] == 'true'; - final String dir = await generateUserDirectory(installation, useDwarf); - final List args = [ + final dir = await generateUserDirectory(installation, useDwarf); + final args = [ '--user-data-dir=$dir', url.toString(), if (!debug) @@ -136,7 +136,7 @@ class Chrome extends Browser { '--use-angle=metal', ]; - final Process process = + final process = await _spawnChromiumProcess(installation.executable, args); remoteDebuggerCompleter.complete( @@ -155,7 +155,7 @@ class Chrome extends Browser { BrowserInstallation installation, bool useDwarf ) async { - final String userDirectoryPath = environment + final userDirectoryPath = environment .webUiDartToolDir .createTempSync('test_chrome_user_data_') .resolveSymbolicLinksSync(); @@ -166,11 +166,11 @@ class Chrome extends Browser { // Using DWARF debugging info requires installation of a Chrome extension. // We can prompt for this, but in order to avoid prompting on every single // browser launch, we cache the user directory after it has been installed. - final Directory baselineUserDirectory = Directory(path.join( + final baselineUserDirectory = Directory(path.join( environment.webUiDartToolDir.path, 'chrome_user_data_base', )); - final Directory dwarfExtensionInstallDirectory = Directory(path.join( + final dwarfExtensionInstallDirectory = Directory(path.join( baselineUserDirectory.path, 'Default', 'Extensions', @@ -183,7 +183,7 @@ class Chrome extends Browser { if (!dwarfExtensionInstallDirectory.existsSync()) { print('DWARF debugging requested. Launching Chrome. Please install the ' 'extension and then exit Chrome when the installation is complete...'); - final Process addExtension = await Process.start( + final addExtension = await Process.start( installation.executable, [ '--user-data-dir=${baselineUserDirectory.path}', @@ -197,9 +197,9 @@ class Chrome extends Browser { ); await addExtension.exitCode; } - for (final FileSystemEntity input in baselineUserDirectory.listSync(recursive: true)) { - final String relative = path.relative(input.path, from: baselineUserDirectory.path); - final String outputPath = path.join(userDirectoryPath, relative); + for (final input in baselineUserDirectory.listSync(recursive: true)) { + final relative = path.relative(input.path, from: baselineUserDirectory.path); + final outputPath = path.join(userDirectoryPath, relative); if (input is Directory) { await Directory(outputPath).create(recursive: true); } else if (input is File) { @@ -237,16 +237,16 @@ class Chrome extends Browser { // TODO(yjbanov): extends tests to Window, https://github.com/flutter/flutter/issues/65673 @override Future captureScreenshot(math.Rectangle? region) async { - final wip.ChromeConnection chromeConnection = + final chromeConnection = wip.ChromeConnection('localhost', kDevtoolsPort); - final wip.ChromeTab? chromeTab = await chromeConnection.getTab( + final chromeTab = await chromeConnection.getTab( (wip.ChromeTab chromeTab) => chromeTab.url.contains('localhost')); if (chromeTab == null) { throw StateError( 'Failed locate Chrome tab with the test page', ); } - final wip.WipConnection wipConnection = await chromeTab.connect(); + final wipConnection = await chromeTab.connect(); Map? captureScreenshotParameters; if (region != null) { @@ -273,10 +273,10 @@ class Chrome extends Browser { 'deviceScaleFactor': 1, 'mobile': false, }); - final wip.WipResponse response = await wipConnection.sendCommand( + final response = await wipConnection.sendCommand( 'Page.captureScreenshot', captureScreenshotParameters); - final Image screenshot = + final screenshot = decodePng(base64.decode(response.result!['data'] as String))!; return screenshot; @@ -301,7 +301,7 @@ Future _spawnChromiumProcess(String executable, List args, { St // - Chrome launched successfully, in which case we just return from the loop. // - The tool detected an unretriable Chrome error, in which case we throw ToolExit. while (true) { - final Process process = await Process.start(executable, args, workingDirectory: workingDirectory); + final process = await Process.start(executable, args, workingDirectory: workingDirectory); process.stdout .transform(utf8.decoder) @@ -312,7 +312,7 @@ Future _spawnChromiumProcess(String executable, List args, { St // Wait until the DevTools are listening before trying to connect. This is // only required for flutter_test --platform=chrome and not flutter run. - bool hitGlibcBug = false; + var hitGlibcBug = false; await process.stderr .transform(utf8.decoder) .transform(const LineSplitter()) @@ -325,7 +325,7 @@ Future _spawnChromiumProcess(String executable, List args, { St }) .firstWhere((String line) => line.startsWith('DevTools listening'), orElse: () { if (hitGlibcBug) { - const String message = 'Encountered glibc bug ' + const message = 'Encountered glibc bug ' 'https://sourceware.org/bugzilla/show_bug.cgi?id=19329. ' 'Will try launching browser again.'; print(message); @@ -366,10 +366,10 @@ Future _spawnChromiumProcess(String executable, List args, { St /// page. Future getRemoteDebuggerUrl(Uri base) async { try { - final HttpClient client = HttpClient(); - final HttpClientRequest request = await client.getUrl(base.resolve('/json/list')); - final HttpClientResponse response = await request.close(); - final List? jsonObject = + final client = HttpClient(); + final request = await client.getUrl(base.resolve('/json/list')); + final response = await request.close(); + final jsonObject = await json.fuse(utf8).decoder.bind(response).single as List?; return base.resolve((jsonObject!.first as Map)['devtoolsFrontendUrl'] as String); } catch (_) { diff --git a/lib/web_ui/dev/chrome_installer.dart b/lib/web_ui/dev/chrome_installer.dart index e8dda99b8d152..5e8f30c4d2efb 100644 --- a/lib/web_ui/dev/chrome_installer.dart +++ b/lib/web_ui/dev/chrome_installer.dart @@ -4,7 +4,6 @@ import 'dart:async'; import 'dart:io' as io; -import 'dart:typed_data'; import 'package:archive/archive.dart'; import 'package:archive/archive_io.dart'; @@ -66,7 +65,7 @@ Future getOrInstallChrome( } else { infoLog.writeln('Installing Chrome version: ${installer.version}'); await installer.install(); - final BrowserInstallation installation = installer.getInstallation()!; + final installation = installer.getInstallation()!; infoLog.writeln( 'Installations complete. To launch it run ${installation.executable}'); } @@ -77,7 +76,7 @@ Future getOrInstallChrome( } Future _findSystemChromeExecutable() async { - final io.ProcessResult which = + final which = await io.Process.run('which', ['google-chrome']); if (which.exitCode != 0) { @@ -101,10 +100,10 @@ class ChromeInstaller { throw BrowserInstallerException( 'Expected a concrete Chromer version, but got $version. Maybe use ChromeInstaller.latest()?'); } - final io.Directory chromeInstallationDir = io.Directory( + final chromeInstallationDir = io.Directory( path.join(environment.webUiDartToolDir.path, 'chrome'), ); - final io.Directory versionDir = io.Directory( + final versionDir = io.Directory( path.join(chromeInstallationDir.path, version), ); return ChromeInstaller._( @@ -121,7 +120,7 @@ class ChromeInstaller { }); static Future latest() async { - final String latestVersion = await fetchLatestChromeVersion(); + final latestVersion = await fetchLatestChromeVersion(); return ChromeInstaller(version: latestVersion); } @@ -165,15 +164,15 @@ class ChromeInstaller { } versionDir.createSync(recursive: true); - final String url = PlatformBinding.instance.getChromeDownloadUrl(version); + final url = PlatformBinding.instance.getChromeDownloadUrl(version); print('Downloading Chrome from $url'); - final StreamedResponse download = await client.send(Request( + final download = await client.send(Request( 'GET', Uri.parse(url), )); - final io.File downloadedFile = + final downloadedFile = io.File(path.join(versionDir.path, 'chrome.zip')); await download.stream.pipe(downloadedFile.openWrite()); @@ -185,18 +184,18 @@ class ChromeInstaller { /// from dart. /// See: https://github.com/dart-lang/sdk/issues/15078. if (io.Platform.isWindows) { - final Stopwatch stopwatch = Stopwatch()..start(); + final stopwatch = Stopwatch()..start(); // Read the Zip file from disk. - final Uint8List bytes = downloadedFile.readAsBytesSync(); + final bytes = downloadedFile.readAsBytesSync(); - final Archive archive = ZipDecoder().decodeBytes(bytes); + final archive = ZipDecoder().decodeBytes(bytes); // Extract the contents of the Zip archive to disk. - for (final ArchiveFile file in archive) { - final String filename = file.name; + for (final file in archive) { + final filename = file.name; if (file.isFile) { - final List data = file.content as List; + final data = file.content as List; io.File(path.joinAll([ versionDir.path, // Remove the "chrome-win/" path prefix, which is the Windows @@ -218,9 +217,9 @@ class ChromeInstaller { // version directory. However, the zip file contains a top-level directory // named e.g. 'chrome-linux'. We need to copy the files out of that // directory and into the version directory. - final io.Directory tmpDir = await io.Directory.systemTemp.createTemp(); - final io.Directory unzipDir = tmpDir; - final io.ProcessResult unzipResult = + final tmpDir = await io.Directory.systemTemp.createTemp(); + final unzipDir = tmpDir; + final unzipResult = await io.Process.run('unzip', [ downloadedFile.path, '-d', @@ -233,7 +232,7 @@ class ChromeInstaller { 'The unzip process exited with code ${unzipResult.exitCode}.'); } - final io.Directory topLevelDir = + final topLevelDir = await tmpDir.list().single as io.Directory; await for (final io.FileSystemEntity entity in topLevelDir.list()) { await entity @@ -252,9 +251,9 @@ class ChromeInstaller { /// Fetches the latest available Chrome build version. Future fetchLatestChromeVersion() async { - final Client client = Client(); + final client = Client(); try { - final Response response = await client.get(Uri.parse( + final response = await client.get(Uri.parse( 'https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2FLAST_CHANGE?alt=media')); if (response.statusCode != 200) { throw BrowserInstallerException( diff --git a/lib/web_ui/dev/cipd.dart b/lib/web_ui/dev/cipd.dart index 70a17b170acef..38b6daf1bcf84 100644 --- a/lib/web_ui/dev/cipd.dart +++ b/lib/web_ui/dev/cipd.dart @@ -19,8 +19,8 @@ Future cipdKnowsPackageVersion({ // $package:CIPD_PACKAGE_ID // or: // No matching instances. - final String logLevel = isVerbose ? 'debug' : 'warning'; - final String stdout = await evalProcess('cipd', [ + final logLevel = isVerbose ? 'debug' : 'warning'; + final stdout = await evalProcess('cipd', [ 'search', package, '--tag', @@ -43,7 +43,7 @@ Future uploadDirectoryToCipd({ bool isDryRun = false, bool isVerbose = false, }) async { - final String cipdConfig = ''' + final cipdConfig = ''' package: $packageName description: $description preserve_writable: true @@ -53,12 +53,12 @@ data: '''; // Create the config manifest to upload to CIPD - final io.File configFile = io.File(path.join(directory.path, configFileName)); + final configFile = io.File(path.join(directory.path, configFileName)); await configFile.writeAsString(cipdConfig); - final String cipdCommand = isDryRun ? 'pkg-build' : 'create'; + final cipdCommand = isDryRun ? 'pkg-build' : 'create'; // CIPD won't fully shut up even in 'error' mode - final String logLevel = isVerbose ? 'debug' : 'warning'; + final logLevel = isVerbose ? 'debug' : 'warning'; return runProcess('cipd', [ cipdCommand, '--pkg-def', diff --git a/lib/web_ui/dev/clean.dart b/lib/web_ui/dev/clean.dart index 48584c7b81be2..5152e764628b1 100644 --- a/lib/web_ui/dev/clean.dart +++ b/lib/web_ui/dev/clean.dart @@ -38,8 +38,8 @@ class CleanCommand extends Command with ArgUtils { @override FutureOr run() async { // This is the old path that tests used to be built into. Clean this path too. - final String legacyBuildPath = path.join(environment.webUiRootDir.path, 'build'); - final List thingsToBeCleaned = [ + final legacyBuildPath = path.join(environment.webUiRootDir.path, 'build'); + final thingsToBeCleaned = [ environment.webUiDartToolDir, environment.webUiBuildDir, io.Directory(legacyBuildPath), diff --git a/lib/web_ui/dev/edge.dart b/lib/web_ui/dev/edge.dart index b27a401b42594..61ffaac091ed4 100644 --- a/lib/web_ui/dev/edge.dart +++ b/lib/web_ui/dev/edge.dart @@ -50,19 +50,19 @@ class Edge extends Browser { /// [Uri] or a [String]. factory Edge(Uri url) { return Edge._(BrowserProcess(() async { - final BrowserInstallation installation = await getEdgeInstallation( + final installation = await getEdgeInstallation( packageLock.edgeLock.launcherVersion, infoLog: DevNull(), ); // Debug is not a valid option for Edge. Remove it. - String pathToOpen = url.toString(); + var pathToOpen = url.toString(); if(pathToOpen.contains('debug')) { - final int index = pathToOpen.indexOf('debug'); + final index = pathToOpen.indexOf('debug'); pathToOpen = pathToOpen.substring(0, index-1); } - final Process process = await Process.start( + final process = await Process.start( installation.executable, [pathToOpen,'-k'], ); diff --git a/lib/web_ui/dev/edge_installation.dart b/lib/web_ui/dev/edge_installation.dart index 2f6f893777270..c5be19fe89292 100644 --- a/lib/web_ui/dev/edge_installation.dart +++ b/lib/web_ui/dev/edge_installation.dart @@ -40,7 +40,7 @@ Future getEdgeInstallation( // Since Edge is included in Windows, always assume there will be one on the // system. infoLog.writeln('Using the system version that is already installed.'); - final EdgeLauncher edgeLauncher = EdgeLauncher(); + final edgeLauncher = EdgeLauncher(); if (edgeLauncher.isInstalled) { infoLog.writeln('Launcher installation was skipped, already installed.'); } else { @@ -104,11 +104,11 @@ class EdgeLauncher { launcherInstallationDir.createSync(recursive: true); } - final Client client = Client(); + final client = Client(); try { // Download executable from Github. - final StreamedResponse download = await client.send(Request( + final download = await client.send(Request( 'GET', Uri.parse(windowsEdgeLauncherDownloadUrl), )); diff --git a/lib/web_ui/dev/environment.dart b/lib/web_ui/dev/environment.dart index 061994dfa3cb7..511596a742a07 100644 --- a/lib/web_ui/dev/environment.dart +++ b/lib/web_ui/dev/environment.dart @@ -19,28 +19,28 @@ Environment? _environment; /// Contains various environment variables, such as common file paths and command-line options. class Environment { factory Environment() { - final bool isMacosArm = ffi.Abi.current() == ffi.Abi.macosArm64; - final io.File dartExecutable = io.File(io.Platform.resolvedExecutable); - final io.File self = io.File.fromUri(io.Platform.script); + final isMacosArm = ffi.Abi.current() == ffi.Abi.macosArm64; + final dartExecutable = io.File(io.Platform.resolvedExecutable); + final self = io.File.fromUri(io.Platform.script); - final io.Directory engineSrcDir = self.parent.parent.parent.parent.parent; - final io.Directory engineToolsDir = + final engineSrcDir = self.parent.parent.parent.parent.parent; + final engineToolsDir = io.Directory(pathlib.join(engineSrcDir.path, 'flutter', 'tools')); - final io.Directory outDir = + final outDir = io.Directory(pathlib.join(engineSrcDir.path, 'out')); - final io.Directory wasmReleaseOutDir = + final wasmReleaseOutDir = io.Directory(pathlib.join(outDir.path, 'wasm_release')); - final io.Directory wasmProfileOutDir = + final wasmProfileOutDir = io.Directory(pathlib.join(outDir.path, 'wasm_profile')); - final io.Directory wasmDebugUnoptOutDir = + final wasmDebugUnoptOutDir = io.Directory(pathlib.join(outDir.path, 'wasm_debug_unopt')); - final io.Directory hostDebugUnoptDir = + final hostDebugUnoptDir = io.Directory(pathlib.join(outDir.path, 'host_debug_unopt')); - final io.Directory dartSdkDir = dartExecutable.parent.parent; - final io.Directory webUiRootDir = io.Directory( + final dartSdkDir = dartExecutable.parent.parent; + final webUiRootDir = io.Directory( pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui')); - for (final io.Directory expectedDirectory in [ + for (final expectedDirectory in [ engineSrcDir, webUiRootDir ]) { diff --git a/lib/web_ui/dev/felt.dart b/lib/web_ui/dev/felt.dart index 0db0771ee2ba3..43915d5b4c185 100644 --- a/lib/web_ui/dev/felt.dart +++ b/lib/web_ui/dev/felt.dart @@ -28,7 +28,7 @@ CommandRunner runner = CommandRunner( Future main(List rawArgs) async { // Remove --clean from the list as that's processed by the wrapper script. - final List args = rawArgs.where((String arg) => arg != '--clean').toList(); + final args = rawArgs.where((String arg) => arg != '--clean').toList(); if (args.isEmpty) { // The felt tool was invoked with no arguments. Print usage. @@ -38,9 +38,9 @@ Future main(List rawArgs) async { _listenToShutdownSignals(); - int exitCode = -1; + var exitCode = -1; try { - final bool? result = await runner.run(args); + final result = await runner.run(args); if (result != true) { print('Sub-command failed: `${args.join(' ')}`'); exitCode = 1; diff --git a/lib/web_ui/dev/felt_config.dart b/lib/web_ui/dev/felt_config.dart index 31f873938a830..abcc27800698e 100644 --- a/lib/web_ui/dev/felt_config.dart +++ b/lib/web_ui/dev/felt_config.dart @@ -115,17 +115,17 @@ class FeltConfig { ); factory FeltConfig.fromFile(String filePath) { - final io.File configFile = io.File(filePath); - final YamlMap yaml = loadYaml(configFile.readAsStringSync()) as YamlMap; + final configFile = io.File(filePath); + final yaml = loadYaml(configFile.readAsStringSync()) as YamlMap; - final List compileConfigs = []; - final Map compileConfigsByName = {}; + final compileConfigs = []; + final compileConfigsByName = {}; for (final dynamic node in yaml['compile-configs'] as YamlList) { - final YamlMap configYaml = node as YamlMap; - final String name = configYaml['name'] as String; - final Compiler compiler = Compiler.values.byName(configYaml['compiler'] as String); - final Renderer renderer = Renderer.values.byName(configYaml['renderer'] as String); - final CompileConfiguration config = CompileConfiguration(name, compiler, renderer); + final configYaml = node as YamlMap; + final name = configYaml['name'] as String; + final compiler = Compiler.values.byName(configYaml['compiler'] as String); + final renderer = Renderer.values.byName(configYaml['renderer'] as String); + final config = CompileConfiguration(name, compiler, renderer); compileConfigs.add(config); if (compileConfigsByName.containsKey(name)) { throw AssertionError('Duplicate compile config name: $name'); @@ -133,13 +133,13 @@ class FeltConfig { compileConfigsByName[name] = config; } - final List testSets = []; - final Map testSetsByName = {}; + final testSets = []; + final testSetsByName = {}; for (final dynamic node in yaml['test-sets'] as YamlList) { - final YamlMap testSetYaml = node as YamlMap; - final String name = testSetYaml['name'] as String; - final String directory = testSetYaml['directory'] as String; - final TestSet testSet = TestSet(name, directory); + final testSetYaml = node as YamlMap; + final name = testSetYaml['name'] as String; + final directory = testSetYaml['directory'] as String; + final testSet = TestSet(name, directory); testSets.add(testSet); if (testSetsByName.containsKey(name)) { throw AssertionError('Duplicate test set name: $name'); @@ -147,13 +147,13 @@ class FeltConfig { testSetsByName[name] = testSet; } - final List testBundles = []; - final Map testBundlesByName = {}; + final testBundles = []; + final testBundlesByName = {}; for (final dynamic node in yaml['test-bundles'] as YamlList) { - final YamlMap testBundleYaml = node as YamlMap; - final String name = testBundleYaml['name'] as String; - final String testSetName = testBundleYaml['test-set'] as String; - final TestSet? testSet = testSetsByName[testSetName]; + final testBundleYaml = node as YamlMap; + final name = testBundleYaml['name'] as String; + final testSetName = testBundleYaml['test-set'] as String; + final testSet = testSetsByName[testSetName]; if (testSet == null) { throw AssertionError('Test set not found with name: `$testSetName` (referenced by test bundle: `$name`)'); } @@ -166,7 +166,7 @@ class FeltConfig { (dynamic configName) => compileConfigsByName[configName as String]! ).toList(); } - final TestBundle bundle = TestBundle(name, testSet, compileConfigs); + final bundle = TestBundle(name, testSet, compileConfigs); testBundles.add(bundle); if (testBundlesByName.containsKey(name)) { throw AssertionError('Duplicate test bundle name: $name'); @@ -174,17 +174,17 @@ class FeltConfig { testBundlesByName[name] = bundle; } - final List runConfigs = []; - final Map runConfigsByName = {}; + final runConfigs = []; + final runConfigsByName = {}; for (final dynamic node in yaml['run-configs'] as YamlList) { - final YamlMap runConfigYaml = node as YamlMap; - final String name = runConfigYaml['name'] as String; - final BrowserName browser = BrowserName.values.byName(runConfigYaml['browser'] as String); + final runConfigYaml = node as YamlMap; + final name = runConfigYaml['name'] as String; + final browser = BrowserName.values.byName(runConfigYaml['browser'] as String); final dynamic variantNode = runConfigYaml['canvaskit-variant']; - final CanvasKitVariant? variant = variantNode == null + final variant = variantNode == null ? null : CanvasKitVariant.values.byName(variantNode as String); - final RunConfiguration runConfig = RunConfiguration(name, browser, variant); + final runConfig = RunConfiguration(name, browser, variant); runConfigs.add(runConfig); if (runConfigsByName.containsKey(name)) { throw AssertionError('Duplicate run config name: $name'); @@ -192,23 +192,23 @@ class FeltConfig { runConfigsByName[name] = runConfig; } - final List testSuites = []; + final testSuites = []; for (final dynamic node in yaml['test-suites'] as YamlList) { - final YamlMap testSuiteYaml = node as YamlMap; - final String name = testSuiteYaml['name'] as String; - final String testBundleName = testSuiteYaml['test-bundle'] as String; - final TestBundle? bundle = testBundlesByName[testBundleName]; + final testSuiteYaml = node as YamlMap; + final name = testSuiteYaml['name'] as String; + final testBundleName = testSuiteYaml['test-bundle'] as String; + final bundle = testBundlesByName[testBundleName]; if (bundle == null) { throw AssertionError('Test bundle not found with name: `$testBundleName` (referenced by test suite: `$name`)'); } - final String runConfigName = testSuiteYaml['run-config'] as String; - final RunConfiguration? runConfig = runConfigsByName[runConfigName]; + final runConfigName = testSuiteYaml['run-config'] as String; + final runConfig = runConfigsByName[runConfigName]; if (runConfig == null) { throw AssertionError('Run config not found with name: `$runConfigName` (referenced by test suite: `$name`)'); } - bool canvasKit = false; - bool canvasKitChromium = false; - bool skwasm = false; + var canvasKit = false; + var canvasKitChromium = false; + var skwasm = false; final dynamic depsNode = testSuiteYaml['artifact-deps']; if (depsNode != null) { for (final dynamic dep in depsNode as YamlList) { @@ -233,12 +233,12 @@ class FeltConfig { } } } - final ArtifactDependencies artifactDeps = ArtifactDependencies( + final artifactDeps = ArtifactDependencies( canvasKit: canvasKit, canvasKitChromium: canvasKitChromium, skwasm: skwasm ); - final TestSuite suite = TestSuite(name, bundle, runConfig, artifactDeps); + final suite = TestSuite(name, bundle, runConfig, artifactDeps); testSuites.add(suite); } return FeltConfig(compileConfigs, testSets, testBundles, runConfigs, testSuites); diff --git a/lib/web_ui/dev/firefox.dart b/lib/web_ui/dev/firefox.dart index 2495456019d39..e4b7c69c22ebd 100644 --- a/lib/web_ui/dev/firefox.dart +++ b/lib/web_ui/dev/firefox.dart @@ -58,16 +58,16 @@ class Firefox extends Browser { /// Starts a new instance of Firefox open to the given [url], which may be a /// [Uri] or a [String]. factory Firefox(Uri url, BrowserInstallation installation, {bool debug = false}) { - final Completer remoteDebuggerCompleter = Completer.sync(); + final remoteDebuggerCompleter = Completer.sync(); return Firefox._(BrowserProcess(() async { // Using a profile on opening will prevent popups related to profiles. - const String profile = ''' + const profile = ''' user_pref("browser.shell.checkDefaultBrowser", false); user_pref("dom.disable_open_during_load", false); user_pref("dom.max_script_run_time", 0); '''; - final Directory temporaryProfileDirectory = Directory( + final temporaryProfileDirectory = Directory( path.join(environment.webUiDartToolDir.path, 'firefox_profile')); // A good source of various Firefox Command Line options: @@ -80,8 +80,8 @@ user_pref("dom.max_script_run_time", 0); File(path.join(temporaryProfileDirectory.path, 'prefs.js')) .writeAsStringSync(profile); - final bool isMac = Platform.isMacOS; - final List args = [ + final isMac = Platform.isMacOS; + final args = [ url.toString(), '--profile', temporaryProfileDirectory.path, @@ -95,7 +95,7 @@ user_pref("dom.max_script_run_time", 0); '--start-debugger-server $kDevtoolsPort', ]; - final Process process = + final process = await Process.start(installation.executable, args); remoteDebuggerCompleter.complete( diff --git a/lib/web_ui/dev/firefox_installer.dart b/lib/web_ui/dev/firefox_installer.dart index e86433f93d3b1..4a171b9e4c2fc 100644 --- a/lib/web_ui/dev/firefox_installer.dart +++ b/lib/web_ui/dev/firefox_installer.dart @@ -69,7 +69,7 @@ Future getOrInstallFirefox( } else { infoLog.writeln('Installing Firefox version: ${installer.version}'); await installer.install(); - final BrowserInstallation installation = installer.getInstallation()!; + final installation = installer.getInstallation()!; infoLog.writeln( 'Installations complete. To launch it run ${installation.executable}'); } @@ -92,10 +92,10 @@ class FirefoxInstaller { throw BrowserInstallerException( 'Expected a concrete Firefox version, but got $version. Maybe use FirefoxInstaller.latest()?'); } - final io.Directory firefoxInstallationDir = io.Directory( + final firefoxInstallationDir = io.Directory( path.join(environment.webUiDartToolDir.path, 'firefox'), ); - final io.Directory versionDir = io.Directory( + final versionDir = io.Directory( path.join(firefoxInstallationDir.path, version), ); return FirefoxInstaller._( @@ -112,7 +112,7 @@ class FirefoxInstaller { }); static Future latest() async { - final String latestVersion = io.Platform.isLinux + final latestVersion = io.Platform.isLinux ? await fetchLatestFirefoxVersionLinux() : await fetchLatestFirefoxVersionMacOS(); return FirefoxInstaller(version: latestVersion); @@ -147,7 +147,7 @@ class FirefoxInstaller { /// Install the browser by downloading from the web. Future install() async { - final io.File downloadedFile = await _download(); + final downloadedFile = await _download(); if (io.Platform.isLinux) { await _uncompress(downloadedFile); } else if (io.Platform.isMacOS) { @@ -164,15 +164,15 @@ class FirefoxInstaller { } versionDir.createSync(recursive: true); - final String url = PlatformBinding.instance.getFirefoxDownloadUrl(version); - final StreamedResponse download = await client.send(Request( + final url = PlatformBinding.instance.getFirefoxDownloadUrl(version); + final download = await client.send(Request( 'GET', Uri.parse(url), )); - final io.File downloadedFile = + final downloadedFile = io.File(path.join(versionDir.path, PlatformBinding.instance.getFirefoxDownloadFilename(version))); - final io.IOSink sink = downloadedFile.openWrite(); + final sink = downloadedFile.openWrite(); await download.stream.pipe(sink); await sink.flush(); await sink.close(); @@ -184,7 +184,7 @@ class FirefoxInstaller { /// use a zip archive. /// See [version]. Future _uncompress(io.File downloadedFile) async { - final io.ProcessResult unzipResult = await io.Process.run('tar', [ + final unzipResult = await io.Process.run('tar', [ '-x', '-f', downloadedFile.path, @@ -202,12 +202,12 @@ class FirefoxInstaller { /// Mounts the dmg file using hdiutil, copies content of the volume to /// target path and then unmounts dmg ready for deletion. Future _mountDmgAndCopy(io.File dmgFile) async { - final String volumeName = await _hdiUtilMount(dmgFile); + final volumeName = await _hdiUtilMount(dmgFile); - final String sourcePath = '$volumeName/Firefox.app'; - final String targetPath = path.dirname(dmgFile.path); + final sourcePath = '$volumeName/Firefox.app'; + final targetPath = path.dirname(dmgFile.path); try { - final io.ProcessResult installResult = await io.Process.run('cp', [ + final installResult = await io.Process.run('cp', [ '-r', sourcePath, targetPath, @@ -225,7 +225,7 @@ class FirefoxInstaller { } Future _hdiUtilMount(io.File dmgFile) async { - final io.ProcessResult mountResult = await io.Process.run('hdiutil', [ + final mountResult = await io.Process.run('hdiutil', [ 'attach', '-readonly', dmgFile.path, @@ -236,8 +236,8 @@ class FirefoxInstaller { 'Exit code ${mountResult.exitCode}.\n${mountResult.stderr}'); } - final List processOutput = (mountResult.stdout as String).split('\n'); - final String? volumePath = _volumeFromMountResult(processOutput); + final processOutput = (mountResult.stdout as String).split('\n'); + final volumePath = _volumeFromMountResult(processOutput); if (volumePath == null) { throw BrowserInstallerException( 'Failed to parse mount dmg result ${processOutput.join('\n')}.\n' @@ -249,8 +249,8 @@ class FirefoxInstaller { // Parses volume from mount result. // Output is of form: {devicename} /Volumes/{name}. String? _volumeFromMountResult(List lines) { - for (final String line in lines) { - final int pos = line.indexOf('/Volumes'); + for (final line in lines) { + final pos = line.indexOf('/Volumes'); if (pos != -1) { return line.substring(pos); } @@ -259,7 +259,7 @@ class FirefoxInstaller { } Future _hdiUtilUnmount(String volumeName) async { - final io.ProcessResult unmountResult = await io.Process.run('hdiutil', [ + final unmountResult = await io.Process.run('hdiutil', [ 'unmount', volumeName, ]); @@ -276,10 +276,10 @@ class FirefoxInstaller { } Future _findSystemFirefoxExecutable() async { - final io.ProcessResult which = + final which = await io.Process.run('which', ['firefox']); - final bool found = which.exitCode != 0; - const String fireFoxDefaultInstallPath = + final found = which.exitCode != 0; + const fireFoxDefaultInstallPath = '/Applications/Firefox.app/Contents/MacOS/firefox'; if (!found) { if (io.Platform.isMacOS && @@ -294,30 +294,30 @@ Future _findSystemFirefoxExecutable() async { /// Fetches the latest available Firefox build version on Linux. Future fetchLatestFirefoxVersionLinux() async { - final RegExp forFirefoxVersion = RegExp('firefox-[0-9.]+[0-9]'); - final io.HttpClientRequest request = await io.HttpClient() + final forFirefoxVersion = RegExp('firefox-[0-9.]+[0-9]'); + final request = await io.HttpClient() .getUrl(Uri.parse(PlatformBinding.instance.getFirefoxLatestVersionUrl())); request.followRedirects = false; // We will parse the HttpHeaders to find the redirect location. - final io.HttpClientResponse response = await request.close(); + final response = await request.close(); - final String location = response.headers.value('location')!; - final String version = forFirefoxVersion.stringMatch(location)!; + final location = response.headers.value('location')!; + final version = forFirefoxVersion.stringMatch(location)!; return version.substring(version.lastIndexOf('-') + 1); } /// Fetches the latest available Firefox build version on Mac OS. Future fetchLatestFirefoxVersionMacOS() async { - final RegExp forFirefoxVersion = RegExp('firefox/releases/[0-9.]+[0-9]'); - final io.HttpClientRequest request = await io.HttpClient() + final forFirefoxVersion = RegExp('firefox/releases/[0-9.]+[0-9]'); + final request = await io.HttpClient() .getUrl(Uri.parse(PlatformBinding.instance.getFirefoxLatestVersionUrl())); request.followRedirects = false; // We will parse the HttpHeaders to find the redirect location. - final io.HttpClientResponse response = await request.close(); + final response = await request.close(); - final String location = response.headers.value('location')!; - final String version = forFirefoxVersion.stringMatch(location)!; + final location = response.headers.value('location')!; + final version = forFirefoxVersion.stringMatch(location)!; return version.substring(version.lastIndexOf('/') + 1); } @@ -334,7 +334,7 @@ Future getInstaller({String requestedVersion = 'latest'}) a } else { print('Installing Firefox version: ${installer.version}'); await installer.install(); - final BrowserInstallation installation = installer.getInstallation()!; + final installation = installer.getInstallation()!; print( 'Installations complete. To launch it run ${installation.executable}'); } diff --git a/lib/web_ui/dev/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index 6d9f5701a1ff2..d87c1ed421910 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -7,7 +7,7 @@ import 'dart:convert'; import 'felt_config.dart'; String generateBuilderJson(FeltConfig config) { - final Map outputJson = { + final outputJson = { '_comment': 'THIS IS A GENERATED FILE. Do not edit this file directly.', '_comment2': 'See `generate_builder_json.dart` for the generator code', 'builds': [ diff --git a/lib/web_ui/dev/licenses.dart b/lib/web_ui/dev/licenses.dart index 8ce8090d628cd..5dcf96dac8297 100644 --- a/lib/web_ui/dev/licenses.dart +++ b/lib/web_ui/dev/licenses.dart @@ -23,20 +23,20 @@ class LicensesCommand extends Command { } void _checkLicenseHeaders() { - final List allSourceFiles = + final allSourceFiles = _flatListSourceFiles(environment.webUiRootDir); _expect(allSourceFiles.isNotEmpty, 'Dart source listing of ${environment.webUiRootDir.path} must not be empty.'); - final List allDartPaths = + final allDartPaths = allSourceFiles.map((io.File f) => f.path).toList(); - for (final String expectedDirectory in const [ + for (final expectedDirectory in const [ 'lib', 'test', 'dev', ]) { - final String expectedAbsoluteDirectory = + final expectedAbsoluteDirectory = path.join(environment.webUiRootDir.path, expectedDirectory); _expect( allDartPaths @@ -54,7 +54,7 @@ class LicensesCommand extends Command { RegExp(r'// Copyright 2013 The Flutter Authors\. All rights reserved\.'); void _expectLicenseHeader(io.File file) { - final List head = file.readAsStringSync().split('\n').take(3).toList(); + final head = file.readAsStringSync().split('\n').take(3).toList(); _expect(head.length >= 3, 'File too short: ${file.path}'); _expect( @@ -81,7 +81,7 @@ class LicensesCommand extends Command { List _flatListSourceFiles(io.Directory directory) { // This is the old path that tests used to be built into. Ignore anything // within this path. - final String legacyBuildPath = path.join(environment.webUiRootDir.path, 'build'); + final legacyBuildPath = path.join(environment.webUiRootDir.path, 'build'); return directory.listSync(recursive: true).whereType().where((io.File f) { if (!f.path.endsWith('.dart') && !f.path.endsWith('.js')) { // Not a source file we're checking. diff --git a/lib/web_ui/dev/package_lock.dart b/lib/web_ui/dev/package_lock.dart index 9eb517f83175e..9a005fbc21000 100644 --- a/lib/web_ui/dev/package_lock.dart +++ b/lib/web_ui/dev/package_lock.dart @@ -16,10 +16,10 @@ final PackageLock packageLock = PackageLock(); /// Provides access to the contents of the `package_lock.yaml` file. class PackageLock { factory PackageLock() { - final io.File lockFile = io.File( + final lockFile = io.File( path.join(environment.webUiRootDir.path, 'dev', 'package_lock.yaml'), ); - final YamlMap yaml = loadYaml(lockFile.readAsStringSync()) as YamlMap; + final yaml = loadYaml(lockFile.readAsStringSync()) as YamlMap; return PackageLock._fromYaml(yaml); } diff --git a/lib/web_ui/dev/package_roller.dart b/lib/web_ui/dev/package_roller.dart index 4e0f19e47127b..4b72e558f6372 100644 --- a/lib/web_ui/dev/package_roller.dart +++ b/lib/web_ui/dev/package_roller.dart @@ -116,7 +116,7 @@ class _PackageRoller { // Roll Chromium and ChromeDriver for each of the Platforms. Future roll() async { - for (final _Platform platform in _platforms) { + for (final platform in _platforms) { await _rollChromium(platform); await _rollChromeDriver(platform); // For now, we only test Firefox on Linux. @@ -138,12 +138,12 @@ class _PackageRoller { // Download a file from the internet, and put it in a temporary location. Future _downloadTemporaryFile(String url) async { // Use the hash of the Url to temporarily store a file under tmp - final io.File downloadedFile = io.File(path.join( + final downloadedFile = io.File(path.join( io.Directory.systemTemp.path, 'download_${url.hashCode.toRadixString(16)}', )); vprint(' Downloading [$url] into [${downloadedFile.path}]'); - final StreamedResponse download = await _client.send( + final download = await _client.send( Request('GET', Uri.parse(url)), ); await download.stream.pipe(downloadedFile.openWrite()); @@ -168,7 +168,7 @@ class _PackageRoller { // Uncompresses a `file` into a `destination` Directory (must exist). Future _uncompressAndDeleteFile(io.File tarFile, io.Directory destination) async { vprint(' Uncompressing [${tarFile.path}] into [$destination]'); - final io.ProcessResult unzipResult = await io.Process.run('tar', [ + final unzipResult = await io.Process.run('tar', [ '-x', '-f', tarFile.path, @@ -191,7 +191,7 @@ class _PackageRoller { // When uncompressing files, unzip might create some extra directories, but it // seems that our scripts want our CIPD packages to contain everything in the root. Future _locateContentRoot(io.Directory root) async { - final List children = root.listSync(followLinks: false); + final children = root.listSync(followLinks: false); assert(children.isNotEmpty); if (root.path.toLowerCase().endsWith('.app')) { // We've gone inside the .app bundle of the mac version! @@ -210,10 +210,10 @@ class _PackageRoller { // Downloads Chromium from the internet, packs it in the directory structure // that the LUCI script wants. The result of this will be then uploaded to CIPD. Future _rollChromium(_Platform platform) async { - final String version = _lock.chromeLock.version; - final String url = platform.binding.getChromeDownloadUrl(version); - final String cipdPackageName = 'flutter_internal/browsers/chrome/${platform.name}'; - final io.Directory platformDir = io.Directory(path.join(_rollDir.path, platform.name)); + final version = _lock.chromeLock.version; + final url = platform.binding.getChromeDownloadUrl(version); + final cipdPackageName = 'flutter_internal/browsers/chrome/${platform.name}'; + final platformDir = io.Directory(path.join(_rollDir.path, platform.name)); print('\nRolling Chromium for ${platform.name} (version:$version)'); // Bail out if CIPD already has version:$majorVersion for this package! if (!dryRun && await cipdKnowsPackageVersion( @@ -229,13 +229,13 @@ class _PackageRoller { await platformDir.create(recursive: true); vprint(' Created target directory [${platformDir.path}]'); - final io.File chromeDownload = await _downloadTemporaryFile(url); + final chromeDownload = await _downloadTemporaryFile(url); await _unzipAndDeleteFile(chromeDownload, platformDir); - final io.Directory? actualContentRoot = await _locateContentRoot(platformDir); + final actualContentRoot = await _locateContentRoot(platformDir); assert(actualContentRoot != null); - final String relativePlatformDirPath = path.relative(actualContentRoot!.path, from: _rollDir.path); + final relativePlatformDirPath = path.relative(actualContentRoot!.path, from: _rollDir.path); vprint(' Uploading Chromium (${platform.name}) to CIPD...'); await uploadDirectoryToCipd( @@ -253,10 +253,10 @@ class _PackageRoller { // Downloads Chromedriver from the internet, packs it in the directory structure // that the LUCI script wants. The result of this will be then uploaded to CIPD. Future _rollChromeDriver(_Platform platform) async { - final String version = _lock.chromeLock.version; - final String url = platform.binding.getChromeDriverDownloadUrl(version); - final String cipdPackageName = 'flutter_internal/browser-drivers/chrome/${platform.name}'; - final io.Directory platformDir = io.Directory(path.join(_rollDir.path, '${platform.name}_driver')); + final version = _lock.chromeLock.version; + final url = platform.binding.getChromeDriverDownloadUrl(version); + final cipdPackageName = 'flutter_internal/browser-drivers/chrome/${platform.name}'; + final platformDir = io.Directory(path.join(_rollDir.path, '${platform.name}_driver')); print('\nRolling Chromedriver for ${platform.os}-${platform.arch} (version:$version)'); // Bail out if CIPD already has version:$majorVersion for this package! if (!dryRun && await cipdKnowsPackageVersion( @@ -272,14 +272,14 @@ class _PackageRoller { await platformDir.create(recursive: true); vprint(' Created target directory [${platformDir.path}]'); - final io.File chromedriverDownload = await _downloadTemporaryFile(url); + final chromedriverDownload = await _downloadTemporaryFile(url); await _unzipAndDeleteFile(chromedriverDownload, platformDir); // Ensure the chromedriver executable is placed in the root of the bundle. - final io.Directory? actualContentRoot = await _locateContentRoot(platformDir); + final actualContentRoot = await _locateContentRoot(platformDir); assert(actualContentRoot != null); - final String relativePlatformDirPath = path.relative(actualContentRoot!.path, from: _rollDir.path); + final relativePlatformDirPath = path.relative(actualContentRoot!.path, from: _rollDir.path); vprint(' Uploading Chromedriver (${platform.name}) to CIPD...'); await uploadDirectoryToCipd( @@ -298,10 +298,10 @@ class _PackageRoller { // Downloads Firefox from the internet, packs it in the directory structure // that the LUCI script wants. The result of this will be then uploaded to CIPD. Future _rollFirefox(_Platform platform) async { - final String version = _lock.firefoxLock.version; - final String url = platform.binding.getFirefoxDownloadUrl(version); - final String cipdPackageName = 'flutter_internal/browsers/firefox/${platform.name}'; - final io.Directory platformDir = io.Directory(path.join(_rollDir.path, platform.name)); + final version = _lock.firefoxLock.version; + final url = platform.binding.getFirefoxDownloadUrl(version); + final cipdPackageName = 'flutter_internal/browsers/firefox/${platform.name}'; + final platformDir = io.Directory(path.join(_rollDir.path, platform.name)); print('\nRolling Firefox for ${platform.name} (version:$version)'); // Bail out if CIPD already has version:$majorVersion for this package! if (!dryRun && await cipdKnowsPackageVersion( @@ -317,13 +317,13 @@ class _PackageRoller { await platformDir.create(recursive: true); vprint(' Created target directory [${platformDir.path}]'); - final io.File firefoxDownload = await _downloadTemporaryFile(url); + final firefoxDownload = await _downloadTemporaryFile(url); await _uncompressAndDeleteFile(firefoxDownload, platformDir); - final io.Directory? actualContentRoot = await _locateContentRoot(platformDir); + final actualContentRoot = await _locateContentRoot(platformDir); assert(actualContentRoot != null); - final String relativePlatformDirPath = path.relative(actualContentRoot!.path, from: _rollDir.path); + final relativePlatformDirPath = path.relative(actualContentRoot!.path, from: _rollDir.path); vprint(' Uploading Firefox (${platform.name}) to CIPD...'); await uploadDirectoryToCipd( @@ -339,10 +339,10 @@ class _PackageRoller { } Future _rollEsbuild(_Platform platform) async { - final String version = _lock.esbuildLock.version; - final String url = platform.binding.getEsbuildDownloadUrl(version); - final String cipdPackageName = 'flutter/tools/esbuild/${platform.name}'; - final io.Directory platformDir = io.Directory(path.join(_rollDir.path, platform.name)); + final version = _lock.esbuildLock.version; + final url = platform.binding.getEsbuildDownloadUrl(version); + final cipdPackageName = 'flutter/tools/esbuild/${platform.name}'; + final platformDir = io.Directory(path.join(_rollDir.path, platform.name)); print('\nRolling esbuild for ${platform.name} (version:$version)'); // Bail out if CIPD already has version:$majorVersion for this package! if (!dryRun && await cipdKnowsPackageVersion( @@ -358,14 +358,14 @@ class _PackageRoller { await platformDir.create(recursive: true); vprint(' Created target directory [${platformDir.path}]'); - final io.File esbuildDownload = await _downloadTemporaryFile(url); + final esbuildDownload = await _downloadTemporaryFile(url); await _uncompressAndDeleteFile(esbuildDownload, platformDir); - final String packageDir = path.join(platformDir.path, 'package'); + final packageDir = path.join(platformDir.path, 'package'); // Write out the license file from the github repo. // Copied from https://github.com/evanw/esbuild/blob/main/LICENSE.md - final io.File licenseFile = io.File(path.join( + final licenseFile = io.File(path.join( packageDir, 'LICENSE.md', )); diff --git a/lib/web_ui/dev/pipeline.dart b/lib/web_ui/dev/pipeline.dart index e8e8a4d2e7f7b..8034e4f4b1315 100644 --- a/lib/web_ui/dev/pipeline.dart +++ b/lib/web_ui/dev/pipeline.dart @@ -73,7 +73,7 @@ abstract class ProcessStep implements PipelineStep { @override Future run() async { - final ProcessManager process = await createProcess(); + final process = await createProcess(); if (_isInterrupted) { // If the step was interrupted while creating the process, the @@ -127,8 +127,8 @@ class Pipeline { /// resolves. Future run() async { _status = PipelineStatus.started; - final List<_PipelineStepFailure> failures = <_PipelineStepFailure>[]; - for (final PipelineStep step in steps) { + final failures = <_PipelineStepFailure>[]; + for (final step in steps) { _currentStep = step; _currentStepFuture = step.run(); try { @@ -144,7 +144,7 @@ class Pipeline { } else { _status = PipelineStatus.error; print('Pipeline experienced the following failures:'); - for (final _PipelineStepFailure failure in failures) { + for (final failure in failures) { print(' "${failure.step.description}": ${failure.error}'); } throw ToolExit('Test pipeline failed.'); @@ -158,7 +158,7 @@ class Pipeline { /// interrupting the pipeline. Future stop() async { _status = PipelineStatus.stopping; - final PipelineStep? step = _currentStep; + final step = _currentStep; if (step == null) { _status = PipelineStatus.interrupted; return; @@ -223,8 +223,8 @@ class PipelineWatcher { }); await io.stdin.firstWhere((List event) { - const int qKeyCode = 113; - final bool qEntered = event.isNotEmpty && event.first == qKeyCode; + const qKeyCode = 113; + final qEntered = event.isNotEmpty && event.first == qKeyCode; return qEntered; }); print('Stopping felt'); @@ -239,7 +239,7 @@ class PipelineWatcher { return; } - final String relativePath = path.relative(event.path, from: dir); + final relativePath = path.relative(event.path, from: dir); print('- [${event.type}] $relativePath'); _pipelineRunCount++; @@ -261,7 +261,7 @@ class PipelineWatcher { await pipeline.stop(); } - final int runCount = _pipelineRunCount; + final runCount = _pipelineRunCount; try { await pipeline.run(); _pipelineSucceeded(runCount); diff --git a/lib/web_ui/dev/roll_fallback_fonts.dart b/lib/web_ui/dev/roll_fallback_fonts.dart index bdec667f556eb..33f8af6d5b44c 100644 --- a/lib/web_ui/dev/roll_fallback_fonts.dart +++ b/lib/web_ui/dev/roll_fallback_fonts.dart @@ -61,51 +61,51 @@ class RollFallbackFontsCommand extends Command if (apiKey.isEmpty) { throw UsageException('No Google Fonts API key provided', argParser.usage); } - final http.Client client = http.Client(); - final http.Response response = await client.get(Uri.parse( + final client = http.Client(); + final response = await client.get(Uri.parse( 'https://www.googleapis.com/webfonts/v1/webfonts?key=$apiKey')); if (response.statusCode != 200) { throw ToolExit('Failed to download Google Fonts list.'); } - final Map googleFontsResult = + final googleFontsResult = jsonDecode(response.body) as Map; - final List> fontDatas = + final fontDatas = (googleFontsResult['items'] as List) .cast>(); - final Map urlForFamily = {}; + final urlForFamily = {}; for (final Map fontData in fontDatas) { if (fallbackFonts.contains(fontData['family'])) { final files = fontData['files']! as Map; - final Uri uri = Uri.parse(files['regular']! as String) + final uri = Uri.parse(files['regular']! as String) .replace(scheme: 'https'); urlForFamily[fontData['family']! as String] = uri; } } - final Map charsetForFamily = {}; - final io.Directory fontDir = await io.Directory.systemTemp.createTemp('flutter_fallback_fonts'); + final charsetForFamily = {}; + final fontDir = await io.Directory.systemTemp.createTemp('flutter_fallback_fonts'); print('Downloading fonts into temp directory: ${fontDir.path}'); - final AccumulatorSink hashSink = AccumulatorSink(); - final ByteConversionSink hasher = crypto.sha256.startChunkedConversion(hashSink); - for (final String family in fallbackFonts) { + final hashSink = AccumulatorSink(); + final hasher = crypto.sha256.startChunkedConversion(hashSink); + for (final family in fallbackFonts) { print('Downloading $family...'); - final Uri? uri = urlForFamily[family]; + final uri = urlForFamily[family]; if (uri == null) { throw ToolExit('Unable to determine URL to download $family. ' 'Check if it is still hosted on Google Fonts.'); } - final http.Response fontResponse = await client.get(uri); + final fontResponse = await client.get(uri); if (fontResponse.statusCode != 200) { throw ToolExit('Failed to download font for $family'); } - final String urlString = uri.toString(); + final urlString = uri.toString(); if (!urlString.startsWith(expectedUrlPrefix)) { throw ToolExit('Unexpected url format received from Google Fonts API: $urlString.'); } - final String urlSuffix = urlString.substring(expectedUrlPrefix.length); - final io.File fontFile = + final urlSuffix = urlString.substring(expectedUrlPrefix.length); + final fontFile = io.File(path.join(fontDir.path, urlSuffix)); - final Uint8List bodyBytes = fontResponse.bodyBytes; + final bodyBytes = fontResponse.bodyBytes; if (!_checkForLicenseAttribution(bodyBytes)) { throw ToolExit( 'Expected license attribution not found in file: $urlString'); @@ -115,32 +115,32 @@ class RollFallbackFontsCommand extends Command await fontFile.create(recursive: true); await fontFile.writeAsBytes(bodyBytes, flush: true); - final io.ProcessResult fcQueryResult = + final fcQueryResult = await io.Process.run('fc-query', [ '--format=%{charset}', '--', fontFile.path, ]); - final String encodedCharset = fcQueryResult.stdout as String; + final encodedCharset = fcQueryResult.stdout as String; charsetForFamily[family] = encodedCharset; } - final StringBuffer sb = StringBuffer(); + final sb = StringBuffer(); - final List<_Font> fonts = <_Font>[]; + final fonts = <_Font>[]; - for (final String family in fallbackFonts) { - final List starts = []; - final List ends = []; - final String charset = charsetForFamily[family]!; - for (final String range in charset.split(' ')) { + for (final family in fallbackFonts) { + final starts = []; + final ends = []; + final charset = charsetForFamily[family]!; + for (final range in charset.split(' ')) { // Range is one hexadecimal number or two, separated by `-`. - final List parts = range.split('-'); + final parts = range.split('-'); if (parts.length != 1 && parts.length != 2) { throw ToolExit('Malformed charset range "$range"'); } - final int first = int.parse(parts.first, radix: 16); - final int last = int.parse(parts.last, radix: 16); + final first = int.parse(parts.first, radix: 16); + final last = int.parse(parts.last, radix: 16); starts.add(first); ends.add(last); } @@ -148,7 +148,7 @@ class RollFallbackFontsCommand extends Command fonts.add(_Font(family, fonts.length, starts, ends)); } - final String fontSetsCode = _computeEncodedFontSets(fonts); + final fontSetsCode = _computeEncodedFontSets(fonts); sb.writeln('// Copyright 2013 The Flutter Authors. All rights reserved.'); sb.writeln('// Use of this source code is governed by a BSD-style license ' @@ -161,28 +161,28 @@ class RollFallbackFontsCommand extends Command sb.writeln(); sb.writeln('List getFallbackFontList(bool useColorEmoji) => ['); - for (final _Font font in fonts) { - final String family = font.family; - String enabledArgument = ''; + for (final font in fonts) { + final family = font.family; + var enabledArgument = ''; if (family == 'Noto Emoji') { enabledArgument = 'enabled: !useColorEmoji, '; } if (family == 'Noto Color Emoji') { enabledArgument = 'enabled: useColorEmoji, '; } - final String urlString = urlForFamily[family]!.toString(); + final urlString = urlForFamily[family]!.toString(); if (!urlString.startsWith(expectedUrlPrefix)) { throw ToolExit( 'Unexpected url format received from Google Fonts API: $urlString.'); } - final String urlSuffix = urlString.substring(expectedUrlPrefix.length); + final urlSuffix = urlString.substring(expectedUrlPrefix.length); sb.writeln(" NotoFont('$family', $enabledArgument'$urlSuffix'),"); } sb.writeln('];'); sb.writeln(); sb.write(fontSetsCode); - final io.File fontDataFile = io.File(path.join( + final fontDataFile = io.File(path.join( environment.webUiRootDir.path, 'lib', 'src', @@ -191,11 +191,11 @@ class RollFallbackFontsCommand extends Command )); await fontDataFile.writeAsString(sb.toString()); - final io.File licenseFile = io.File(path.join( + final licenseFile = io.File(path.join( fontDir.path, 'LICENSE.txt', )); - const String licenseString = r''' + const licenseString = r''' © Copyright 2015-2021 Google LLC. All Rights Reserved. This Font Software is licensed under the SIL Open Font License, Version 1.1. @@ -296,9 +296,9 @@ OTHER DEALINGS IN THE FONT SOFTWARE. hasher.add(licenseData); hasher.close(); - final crypto.Digest digest = hashSink.events.single; - final String versionString = digest.toString(); - const String packageName = 'flutter/flutter_font_fallbacks'; + final digest = hashSink.events.single; + final versionString = digest.toString(); + const packageName = 'flutter/flutter_font_fallbacks'; if (await cipdKnowsPackageVersion( package: packageName, versionTag: versionString)) { @@ -317,7 +317,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE. } print('Setting new fallback fonts deps version to $versionString'); - final String depFilePath = path.join( + final depFilePath = path.join( environment.engineSrcDir.path, 'flutter', 'DEPS', @@ -479,13 +479,13 @@ const List fallbackFonts = [ ]; bool _checkForLicenseAttribution(Uint8List fontBytes) { - final ByteData fontData = fontBytes.buffer.asByteData(); - final int codePointCount = fontData.lengthInBytes ~/ 2; - const String attributionString = + final fontData = fontBytes.buffer.asByteData(); + final codePointCount = fontData.lengthInBytes ~/ 2; + const attributionString = 'This Font Software is licensed under the SIL Open Font License, Version 1.1.'; - for (int i = 0; i < codePointCount - attributionString.length; i++) { - bool match = true; - for (int j = 0; j < attributionString.length; j++) { + for (var i = 0; i < codePointCount - attributionString.length; i++) { + var match = true; + for (var j = 0; j < attributionString.length; j++) { if (fontData.getUint16((i + j) * 2) != attributionString.codeUnitAt(j)) { match = false; break; @@ -561,7 +561,7 @@ class _FontSet { late final int index; static int orderByDecreasingRangeCount(_FontSet a, _FontSet b) { - final int r = b.rangeCount.compareTo(a.rangeCount); + final r = b.rangeCount.compareTo(a.rangeCount); if (r != 0) { return r; } @@ -569,8 +569,8 @@ class _FontSet { } static int orderByLexicographicFontIndexes(_FontSet a, _FontSet b) { - for (int i = 0; i < a.length && i < b.length; i++) { - final int r = _Font.compare(a.fonts[i], b.fonts[i]); + for (var i = 0; i < a.length && i < b.length; i++) { + final r = _Font.compare(a.fonts[i], b.fonts[i]); if (r != 0) { return r; } @@ -603,8 +603,8 @@ class _TrieNode { /// trie and return the same node, canonicalizing the sequence to its /// representative node. _TrieNode insertSequenceAtRoot(Iterable<_Font> fonts) { - _TrieNode node = this; - for (final _Font font in fonts) { + var node = this; + for (final font in fonts) { node = node._children[font] ??= _TrieNode(); } return node; @@ -692,8 +692,8 @@ class _TrieNode { /// [1]: https://en.wikipedia.org/wiki/Variable-length_quantity String _computeEncodedFontSets(List<_Font> fonts) { - final List<_Range> ranges = <_Range>[]; - final List<_FontSet> allSets = <_FontSet>[]; + final ranges = <_Range>[]; + final allSets = <_FontSet>[]; { // The fonts have their supported code points provided as list of inclusive @@ -708,38 +708,38 @@ String _computeEncodedFontSets(List<_Font> fonts) { // the current set of fonts is canonicalized and recorded. // // There has to be a wiki article for this algorithm but I didn't find one. - final List<_Boundary> boundaries = <_Boundary>[]; - for (final _Font font in fonts) { - for (final int start in font.starts) { + final boundaries = <_Boundary>[]; + for (final font in fonts) { + for (final start in font.starts) { boundaries.add(_Boundary(start, true, font)); } - for (final int end in font.ends) { + for (final end in font.ends) { boundaries.add(_Boundary(end + 1, false, font)); } } boundaries.sort(_Boundary.compare); // The trie root represents the empty set of fonts. - final _TrieNode trieRoot = _TrieNode(); - final Set<_Font> currentElements = <_Font>{}; + final trieRoot = _TrieNode(); + final currentElements = <_Font>{}; void newRange(int start, int end) { // Ensure we are using the canonical font order. - final List<_Font> fonts = List<_Font>.of(currentElements) + final fonts = List<_Font>.of(currentElements) ..sort(_Font.compare); - final _TrieNode node = trieRoot.insertSequenceAtRoot(fonts); - final _FontSet fontSet = node.fontSet ??= _FontSet(fonts); + final node = trieRoot.insertSequenceAtRoot(fonts); + final fontSet = node.fontSet ??= _FontSet(fonts); if (fontSet.rangeCount == 0) { allSets.add(fontSet); } fontSet.rangeCount++; - final _Range range = _Range(start, end, fontSet); + final range = _Range(start, end, fontSet); ranges.add(range); } - int start = 0; - for (final _Boundary boundary in boundaries) { - final int value = boundary.value; + var start = 0; + for (final boundary in boundaries) { + final value = boundary.value; if (value > start) { // Boundary has changed, record the pending range `[start, value - 1]`, // and start a new range at `value`. `value` must be > 0 to get here. @@ -766,17 +766,17 @@ String _computeEncodedFontSets(List<_Font> fonts) { // makes the range table encoding smaller, by about half. allSets.sort(_FontSet.orderByDecreasingRangeCount); - for (int i = 0; i < allSets.length; i++) { + for (var i = 0; i < allSets.length; i++) { allSets[i].index = i; } - final StringBuffer code = StringBuffer(); + final code = StringBuffer(); - final StringBuffer sb = StringBuffer(); - int totalEncodedLength = 0; + final sb = StringBuffer(); + var totalEncodedLength = 0; void encode(int value, int radix, int firstDigitCode) { - final int prefix = value ~/ radix; + final prefix = value ~/ radix; assert(kPrefixDigit0 == '0'.codeUnitAt(0) && kPrefixRadix == 10); if (prefix != 0) { sb.write(prefix); @@ -784,21 +784,21 @@ String _computeEncodedFontSets(List<_Font> fonts) { sb.writeCharCode(firstDigitCode + value.remainder(radix)); } - for (final _FontSet fontSet in allSets) { - int previousFontIndex = -1; - for (final _Font font in fontSet.fonts) { - final int fontIndexDelta = font.index - previousFontIndex; + for (final fontSet in allSets) { + var previousFontIndex = -1; + for (final font in fontSet.fonts) { + final fontIndexDelta = font.index - previousFontIndex; previousFontIndex = font.index; encode(fontIndexDelta - 1, kFontIndexRadix, kFontIndexDigit0); } if (fontSet != allSets.last) { sb.write(','); } - final String fragment = sb.toString(); + final fragment = sb.toString(); sb.clear(); totalEncodedLength += fragment.length; - final int length = fontSet.fonts.length; + final length = fontSet.fonts.length; code.write(' // #${fontSet.index}: $length font'); if (length != 1) { code.write('s'); @@ -811,9 +811,9 @@ String _computeEncodedFontSets(List<_Font> fonts) { code.writeln(" '$fragment'"); } - final StringBuffer declarations = StringBuffer(); + final declarations = StringBuffer(); - final int references = + final references = allSets.fold(0, (int sum, _FontSet set) => sum + set.length); declarations ..writeln('// ${allSets.length} unique sets of fonts' @@ -827,11 +827,11 @@ String _computeEncodedFontSets(List<_Font> fonts) { code.clear(); totalEncodedLength = 0; - for (final _Range range in ranges) { - final int start = range.start; - final int end = range.end; - final int index = range.fontSet.index; - final int size = end - start + 1; + for (final range in ranges) { + final start = range.start; + final end = range.end; + final index = range.fontSet.index; + final size = end - start + 1; // Encode or for unit ranges. if (size >= 2) { @@ -839,18 +839,18 @@ String _computeEncodedFontSets(List<_Font> fonts) { } encode(index, kRangeValueRadix, kRangeValueDigit0); - final String encoding = sb.toString(); + final encoding = sb.toString(); sb.clear(); totalEncodedLength += encoding.length; - String description = start.toRadixString(16); + var description = start.toRadixString(16); if (end != start) { description = '$description-${end.toRadixString(16)}'; } if (range.fontSet.fonts.isNotEmpty) { description = '${description.padRight(12)} #$index'; } - final String encodingText = "'$encoding'".padRight(10); + final encodingText = "'$encoding'".padRight(10); code.writeln(' $encodingText // $description'); } diff --git a/lib/web_ui/dev/steps/compile_bundle_step.dart b/lib/web_ui/dev/steps/compile_bundle_step.dart index b87495020cf53..4cde473daf997 100644 --- a/lib/web_ui/dev/steps/compile_bundle_step.dart +++ b/lib/web_ui/dev/steps/compile_bundle_step.dart @@ -48,7 +48,7 @@ class CompileBundleStep implements PipelineStep { io.Directory get outputBundleDirectory => getBundleBuildDirectory(bundle); List _findTestFiles() { - final io.Directory testDirectory = testSetDirectory; + final testDirectory = testSetDirectory; if (!testDirectory.existsSync()) { throw ToolExit('Test directory "${testDirectory.path}" for bundle ${bundle.name.ansiMagenta} does not exist.'); } @@ -83,34 +83,34 @@ class CompileBundleStep implements PipelineStep { @override Future run() async { print('Compiling test bundle ${bundle.name.ansiMagenta}...'); - final List allTests = _findTestFiles(); - final List compilers = bundle.compileConfigs.map( + final allTests = _findTestFiles(); + final compilers = bundle.compileConfigs.map( (CompileConfiguration config) => _createCompiler(config) ).toList(); - final Stopwatch stopwatch = Stopwatch()..start(); - final String testSetDirectoryPath = testSetDirectory.path; + final stopwatch = Stopwatch()..start(); + final testSetDirectoryPath = testSetDirectory.path; // Clear out old bundle compilations, if they exist if (outputBundleDirectory.existsSync()) { outputBundleDirectory.deleteSync(recursive: true ); } - final List>> pendingResults = >>[]; - for (final TestCompiler compiler in compilers) { - for (final FilePath testFile in allTests) { - final String relativePath = pathlib.relative( + final pendingResults = >>[]; + for (final compiler in compilers) { + for (final testFile in allTests) { + final relativePath = pathlib.relative( testFile.absolute, from: testSetDirectoryPath); - final Future> result = compilePool.withResource(() async { + final result = compilePool.withResource(() async { if (testFiles != null && !testFiles!.contains(testFile)) { return MapEntry(relativePath, CompileResult.filtered); } - final bool success = await compiler.compileTest(testFile); - const int maxTestNameLength = 80; - final String truncatedPath = relativePath.length > maxTestNameLength + final success = await compiler.compileTest(testFile); + const maxTestNameLength = 80; + final truncatedPath = relativePath.length > maxTestNameLength ? relativePath.replaceRange(maxTestNameLength - 3, relativePath.length, '...') : relativePath; - final String expandedPath = truncatedPath.padRight(maxTestNameLength); + final expandedPath = truncatedPath.padRight(maxTestNameLength); io.stdout.write('\r ${success ? expandedPath.ansiGreen : expandedPath.ansiRed}'); return success ? MapEntry(relativePath, CompileResult.success) @@ -119,10 +119,10 @@ class CompileBundleStep implements PipelineStep { pendingResults.add(result); } } - final Map results = Map.fromEntries(await Future.wait(pendingResults)); + final results = Map.fromEntries(await Future.wait(pendingResults)); stopwatch.stop(); - final String resultsJson = const JsonEncoder.withIndent(' ').convert({ + final resultsJson = const JsonEncoder.withIndent(' ').convert({ 'name': bundle.name, 'directory': bundle.testSet.directory, 'builds': bundle.compileConfigs.map( @@ -133,12 +133,12 @@ class CompileBundleStep implements PipelineStep { 'compileTimeInMs': stopwatch.elapsedMilliseconds, 'results': results.map((String k, CompileResult v) => MapEntry(k, v.name)), }); - final io.File outputResultsFile = io.File(pathlib.join( + final outputResultsFile = io.File(pathlib.join( outputBundleDirectory.path, 'results.json', )); outputResultsFile.writeAsStringSync(resultsJson); - final List failedFiles = []; + final failedFiles = []; results.forEach((String fileName, CompileResult result) { if (result == CompileResult.compilationFailure) { failedFiles.add(fileName); @@ -149,7 +149,7 @@ class CompileBundleStep implements PipelineStep { } else { print('\rThe bundle ${bundle.name.ansiMagenta} compiled with some failures in ${stopwatch.elapsedMilliseconds}ms.'); print('Compilation failures:'); - for (final String fileName in failedFiles) { + for (final fileName in failedFiles) { print(' $fileName'); } throw ToolExit('Failed to compile ${bundle.name.ansiMagenta}.'); @@ -193,22 +193,22 @@ class Dart2JSCompiler extends TestCompiler { @override Future compileTest(FilePath input) async { - final String relativePath = pathlib.relative( + final relativePath = pathlib.relative( input.absolute, from: inputTestSetDirectory.path ); - final String targetFileName = pathlib.join( + final targetFileName = pathlib.join( outputTestBundleDirectory.path, '$relativePath.browser_test.dart.js', ); - final io.Directory outputDirectory = io.File(targetFileName).parent; + final outputDirectory = io.File(targetFileName).parent; if (!outputDirectory.existsSync()) { outputDirectory.createSync(recursive: true); } - final List arguments = [ + final arguments = [ 'compile', 'js', '--no-minify', @@ -228,14 +228,14 @@ class Dart2JSCompiler extends TestCompiler { relativePath, // current path. ]; - final ProcessManager process = await startProcess( + final process = await startProcess( environment.dartExecutable, arguments, workingDirectory: inputTestSetDirectory.path, failureIsSuccess: true, evalOutput: !isVerbose, ); - final int exitCode = await process.wait(); + final exitCode = await process.wait(); if (exitCode != 0) { io.stderr.writeln('ERROR: Failed to compile test $input. ' 'Dart2js exited with exit code $exitCode'); @@ -258,22 +258,22 @@ class Dart2WasmCompiler extends TestCompiler { @override Future compileTest(FilePath input) async { - final String relativePath = pathlib.relative( + final relativePath = pathlib.relative( input.absolute, from: inputTestSetDirectory.path ); - final String targetFileName = pathlib.join( + final targetFileName = pathlib.join( outputTestBundleDirectory.path, '$relativePath.browser_test.dart.wasm', ); - final io.Directory outputDirectory = io.File(targetFileName).parent; + final outputDirectory = io.File(targetFileName).parent; if (!outputDirectory.existsSync()) { outputDirectory.createSync(recursive: true); } - final List arguments = [ + final arguments = [ environment.dart2wasmSnapshotPath, '--libraries-spec=${environment.dartSdkDir.path}/lib/libraries.json', @@ -296,14 +296,14 @@ class Dart2WasmCompiler extends TestCompiler { targetFileName, // target path. ]; - final ProcessManager process = await startProcess( + final process = await startProcess( environment.dartAotRuntimePath, arguments, workingDirectory: inputTestSetDirectory.path, failureIsSuccess: true, evalOutput: !isVerbose, ); - final int exitCode = await process.wait(); + final exitCode = await process.wait(); if (exitCode != 0) { io.stderr.writeln('ERROR: Failed to compile test $input. ' diff --git a/lib/web_ui/dev/steps/copy_artifacts_step.dart b/lib/web_ui/dev/steps/copy_artifacts_step.dart index 7c7293bbd5fc6..eb6b2f45e6c75 100644 --- a/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -52,7 +52,7 @@ class CopyArtifactsStep implements PipelineStep { } Future copyTestFonts() async { - const Map testFonts = { + const testFonts = { 'Ahem': 'ahem.ttf', 'Roboto': 'Roboto-Regular.ttf', 'RobotoVariable': 'RobotoSlab-VariableFont_wght.ttf', @@ -60,7 +60,7 @@ class CopyArtifactsStep implements PipelineStep { 'Noto Color Emoji': 'NotoColorEmoji.ttf', }; - final String fontsPath = pathlib.join( + final fontsPath = pathlib.join( environment.flutterDirectory.path, 'third_party', 'txt', @@ -68,10 +68,10 @@ class CopyArtifactsStep implements PipelineStep { 'fonts', ); - final List fontManifest = []; - for (final MapEntry fontEntry in testFonts.entries) { - final String family = fontEntry.key; - final String fontFile = fontEntry.value; + final fontManifest = []; + for (final fontEntry in testFonts.entries) { + final family = fontEntry.key; + final fontFile = fontEntry.value; fontManifest.add({ 'family': family, @@ -82,8 +82,8 @@ class CopyArtifactsStep implements PipelineStep { ], }); - final io.File sourceTtf = io.File(pathlib.join(fontsPath, fontFile)); - final io.File destinationTtf = io.File(pathlib.join( + final sourceTtf = io.File(pathlib.join(fontsPath, fontFile)); + final destinationTtf = io.File(pathlib.join( environment.webTestsArtifactsDir.path, 'assets', 'fonts', @@ -93,7 +93,7 @@ class CopyArtifactsStep implements PipelineStep { await sourceTtf.copy(destinationTtf.path); } - final io.File fontManifestFile = io.File(pathlib.join( + final fontManifestFile = io.File(pathlib.join( environment.webTestsArtifactsDir.path, 'assets', 'FontManifest.json', @@ -103,22 +103,22 @@ class CopyArtifactsStep implements PipelineStep { const JsonEncoder.withIndent(' ').convert(fontManifest), ); - final io.Directory fallbackFontsSource = io.Directory(pathlib.join( + final fallbackFontsSource = io.Directory(pathlib.join( environment.engineSrcDir.path, 'flutter', 'third_party', 'google_fonts_for_unit_tests', )); - final String fallbackFontsDestinationPath = pathlib.join( + final fallbackFontsDestinationPath = pathlib.join( environment.webTestsArtifactsDir.path, 'assets', 'fallback_fonts', ); - for (final io.File file in + for (final file in fallbackFontsSource.listSync(recursive: true).whereType() ) { - final String relativePath = pathlib.relative(file.path, from: fallbackFontsSource.path); - final io.File destinationFile = io.File(pathlib.join(fallbackFontsDestinationPath, relativePath)); + final relativePath = pathlib.relative(file.path, from: fallbackFontsSource.path); + final destinationFile = io.File(pathlib.join(fallbackFontsDestinationPath, relativePath)); if (!destinationFile.parent.existsSync()) { destinationFile.parent.createSync(recursive: true); } @@ -127,7 +127,7 @@ class CopyArtifactsStep implements PipelineStep { } Future copySkiaTestImages() async { - final io.Directory testImagesDir = io.Directory(pathlib.join( + final testImagesDir = io.Directory(pathlib.join( environment.engineSrcDir.path, 'flutter', 'third_party', @@ -136,8 +136,8 @@ class CopyArtifactsStep implements PipelineStep { 'images', )); - for (final io.File imageFile in testImagesDir.listSync(recursive: true).whereType()) { - final io.File destination = io.File(pathlib.join( + for (final imageFile in testImagesDir.listSync(recursive: true).whereType()) { + final destination = io.File(pathlib.join( environment.webTestsArtifactsDir.path, 'test_images', pathlib.relative(imageFile.path, from: testImagesDir.path), @@ -148,29 +148,29 @@ class CopyArtifactsStep implements PipelineStep { } Future copyFlutterJsFiles() async { - final io.Directory flutterJsInputDirectory = io.Directory(pathlib.join( + final flutterJsInputDirectory = io.Directory(pathlib.join( outBuildPath, 'flutter_web_sdk', 'flutter_js', )); - final String targetDirectoryPath = pathlib.join( + final targetDirectoryPath = pathlib.join( environment.webTestsArtifactsDir.path, 'flutter_js', ); - for (final io.File sourceFile in flutterJsInputDirectory + for (final sourceFile in flutterJsInputDirectory .listSync(recursive: true) .whereType() ) { - final String relativePath = pathlib.relative( + final relativePath = pathlib.relative( sourceFile.path, from: flutterJsInputDirectory.path ); - final String targetPath = pathlib.join( + final targetPath = pathlib.join( targetDirectoryPath, relativePath, ); - final io.File targetFile = io.File(targetPath); + final targetFile = io.File(targetPath); if (!targetFile.parent.existsSync()) { targetFile.parent.createSync(recursive: true); } @@ -179,26 +179,26 @@ class CopyArtifactsStep implements PipelineStep { } Future copyCanvasKitFiles(String sourcePath, String destinationPath) async { - final String sourceDirectoryPath = pathlib.join( + final sourceDirectoryPath = pathlib.join( outBuildPath, sourcePath, ); - final String targetDirectoryPath = pathlib.join( + final targetDirectoryPath = pathlib.join( environment.webTestsArtifactsDir.path, destinationPath, ); - for (final String filename in [ + for (final filename in [ 'canvaskit.js', 'canvaskit.wasm', 'canvaskit.wasm.map', ]) { - final io.File sourceFile = io.File(pathlib.join( + final sourceFile = io.File(pathlib.join( sourceDirectoryPath, filename, )); - final io.File targetFile = io.File(pathlib.join( + final targetFile = io.File(pathlib.join( targetDirectoryPath, filename, )); @@ -219,20 +219,20 @@ class CopyArtifactsStep implements PipelineStep { String get outBuildPath => getBuildDirectoryForRuntimeMode(runtimeMode).path; Future copySkwasm() async { - final io.Directory targetDir = io.Directory(pathlib.join( + final targetDir = io.Directory(pathlib.join( environment.webTestsArtifactsDir.path, 'canvaskit', )); await targetDir.create(recursive: true); - for (final String fileName in [ + for (final fileName in [ 'skwasm.wasm', 'skwasm.wasm.map', 'skwasm.js', 'skwasm.worker.js', ]) { - final io.File sourceFile = io.File(pathlib.join( + final sourceFile = io.File(pathlib.join( outBuildPath, 'flutter_web_sdk', 'canvaskit', @@ -247,7 +247,7 @@ class CopyArtifactsStep implements PipelineStep { throw ToolExit('Built Skwasm artifact not found at path "$sourceFile".'); } } - final io.File targetFile = io.File(pathlib.join( + final targetFile = io.File(pathlib.join( targetDir.path, fileName, )); @@ -256,49 +256,49 @@ class CopyArtifactsStep implements PipelineStep { } Future buildHostPage() async { - final String hostDartPath = pathlib.join('lib', 'static', 'host.dart'); - final io.File hostDartFile = io.File(pathlib.join( + final hostDartPath = pathlib.join('lib', 'static', 'host.dart'); + final hostDartFile = io.File(pathlib.join( environment.webEngineTesterRootDir.path, hostDartPath, )); - final String targetDirectoryPath = pathlib.join( + final targetDirectoryPath = pathlib.join( environment.webTestsArtifactsDir.path, 'host', ); io.Directory(targetDirectoryPath).createSync(recursive: true); - final String targetFilePath = pathlib.join( + final targetFilePath = pathlib.join( targetDirectoryPath, 'host.dart', ); - const List staticFiles = [ + const staticFiles = [ 'favicon.ico', 'host.css', 'index.html', ]; - for (final String staticFilePath in staticFiles) { - final io.File source = io.File(pathlib.join( + for (final staticFilePath in staticFiles) { + final source = io.File(pathlib.join( environment.webEngineTesterRootDir.path, 'lib', 'static', staticFilePath, )); - final io.File destination = io.File(pathlib.join( + final destination = io.File(pathlib.join( targetDirectoryPath, staticFilePath, )); await source.copy(destination.path); } - final io.File timestampFile = io.File(pathlib.join( + final timestampFile = io.File(pathlib.join( environment.webEngineTesterRootDir.path, '$targetFilePath.js.timestamp', )); - final String timestamp = + final timestamp = hostDartFile.statSync().modified.millisecondsSinceEpoch.toString(); if (timestampFile.existsSync()) { - final String lastBuildTimestamp = timestampFile.readAsStringSync(); + final lastBuildTimestamp = timestampFile.readAsStringSync(); if (lastBuildTimestamp == timestamp) { // The file is still fresh. No need to rebuild. return; @@ -310,7 +310,7 @@ class CopyArtifactsStep implements PipelineStep { print('Building ${hostDartFile.path}.'); } - int exitCode = await runProcess( + var exitCode = await runProcess( environment.dartExecutable, [ 'pub', diff --git a/lib/web_ui/dev/steps/run_suite_step.dart b/lib/web_ui/dev/steps/run_suite_step.dart index e2992e23989a5..d678f4f655817 100644 --- a/lib/web_ui/dev/steps/run_suite_step.dart +++ b/lib/web_ui/dev/steps/run_suite_step.dart @@ -14,7 +14,6 @@ import 'package:test_api/backend.dart' as hack; import 'package:test_core/src/executable.dart' as test; // ignore: implementation_imports import 'package:test_core/src/runner/hack_register_platform.dart' as hack; // ignore: implementation_imports -import '../browser.dart'; import '../common.dart'; import '../environment.dart'; import '../exceptions.dart'; @@ -62,19 +61,19 @@ class RunSuiteStep implements PipelineStep { @override Future run() async { _prepareTestResultsDirectory(); - final BrowserEnvironment browserEnvironment = getBrowserEnvironment( + final browserEnvironment = getBrowserEnvironment( suite.runConfig.browser, useDwarf: useDwarf, ); await browserEnvironment.prepare(); - final SkiaGoldClient? skiaClient = await _createSkiaClient(); - final String configurationFilePath = pathlib.join( + final skiaClient = await _createSkiaClient(); + final configurationFilePath = pathlib.join( environment.webUiRootDir.path, browserEnvironment.packageTestConfigurationYamlFile, ); - final String bundleBuildPath = getBundleBuildDirectory(suite.testBundle).path; - final List testArgs = [ + final bundleBuildPath = getBundleBuildDirectory(suite.testBundle).path; + final testArgs = [ ...['-r', 'compact'], // Disable concurrency. Running with concurrency proved to be flaky. '--concurrency=1', @@ -106,7 +105,7 @@ class RunSuiteStep implements PipelineStep { print('[${suite.name.ansiCyan}] Running...'); // We want to run tests with the test set's directory as a working directory. - final io.Directory testSetDirectory = io.Directory(pathlib.join( + final testSetDirectory = io.Directory(pathlib.join( environment.webUiTestDir.path, suite.testBundle.testSet.directory, )); @@ -135,7 +134,7 @@ class RunSuiteStep implements PipelineStep { } io.Directory _prepareTestResultsDirectory() { - final io.Directory resultsDirectory = io.Directory(pathlib.join( + final resultsDirectory = io.Directory(pathlib.join( environment.webUiTestResultsDirectory.path, suite.name, )); @@ -147,21 +146,21 @@ class RunSuiteStep implements PipelineStep { } List _collectTestPaths() { - final io.Directory bundleBuild = getBundleBuildDirectory(suite.testBundle); - final io.File resultsJsonFile = io.File(pathlib.join( + final bundleBuild = getBundleBuildDirectory(suite.testBundle); + final resultsJsonFile = io.File(pathlib.join( bundleBuild.path, 'results.json', )); if (!resultsJsonFile.existsSync()) { throw ToolExit('Could not find built bundle ${suite.testBundle.name.ansiMagenta} for suite ${suite.name.ansiCyan}.'); } - final String jsonString = resultsJsonFile.readAsStringSync(); + final jsonString = resultsJsonFile.readAsStringSync(); final jsonContents = const JsonDecoder().convert(jsonString) as Map; final results = jsonContents['results']! as Map; - final List testPaths = []; + final testPaths = []; results.forEach((Object? k, Object? v) { - final String result = v! as String; - final String testPath = k! as String; + final result = v! as String; + final testPath = k! as String; if (testFiles != null) { if (!testFiles!.contains(FilePath.fromTestSet(suite.testBundle.testSet, testPath))) { return; @@ -185,14 +184,14 @@ class RunSuiteStep implements PipelineStep { // See https://github.com/flutter/flutter/issues/143591 return null; } - final Renderer renderer = suite.testBundle.compileConfigs.first.renderer; - final CanvasKitVariant? variant = suite.runConfig.variant; - final io.Directory workDirectory = getSkiaGoldDirectoryForSuite(suite); + final renderer = suite.testBundle.compileConfigs.first.renderer; + final variant = suite.runConfig.variant; + final workDirectory = getSkiaGoldDirectoryForSuite(suite); if (workDirectory.existsSync()) { workDirectory.deleteSync(recursive: true); } - final bool isWasm = suite.testBundle.compileConfigs.first.compiler == Compiler.dart2wasm; - final SkiaGoldClient skiaClient = SkiaGoldClient( + final isWasm = suite.testBundle.compileConfigs.first.compiler == Compiler.dart2wasm; + final skiaClient = SkiaGoldClient( workDirectory, dimensions: { 'Browser': suite.runConfig.browser.name, diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 34954329d30f7..4fa5d55b89049 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -57,7 +57,7 @@ class BrowserPlatform extends PlatformPlugin { required this.overridePathToCanvasKit, }) { // The cascade of request handlers. - final shelf.Cascade cascade = shelf.Cascade() + final cascade = shelf.Cascade() // The web socket that carries the test channels for running tests and // reporting restuls. See [_browserManagerFor] and [BrowserManager.start] // for details on how the channels are established. @@ -120,7 +120,7 @@ class BrowserPlatform extends PlatformPlugin { required String? overridePathToCanvasKit, required bool isVerbose, }) async { - final shelf_io.IOServer server = + final server = shelf_io.IOServer(await HttpMultiServer.loopback(0)); return BrowserPlatform._( suite, @@ -184,13 +184,13 @@ class BrowserPlatform extends PlatformPlugin { /// there instead of serving the default CanvasKit in the build/ directory. Future _canvasKitOverrideHandler( shelf.Request request) async { - final String? pathOverride = overridePathToCanvasKit; + final pathOverride = overridePathToCanvasKit; if (pathOverride == null || !request.url.path.startsWith('canvaskit/')) { return shelf.Response.notFound('Not a request for CanvasKit.'); } - final File file = File(p.joinAll([ + final file = File(p.joinAll([ pathOverride, ...p.split(request.url.path).skip(1), ])); @@ -199,11 +199,11 @@ class BrowserPlatform extends PlatformPlugin { return shelf.Response.notFound('File not found: ${request.url.path}'); } - final String extension = p.extension(file.path); - final String? contentType = contentTypes[extension]; + final extension = p.extension(file.path); + final contentType = contentTypes[extension]; if (contentType == null) { - final String error = + final error = 'Failed to determine Content-Type for "${request.url.path}".'; stderr.writeln(error); return shelf.Response.internalServerError(body: error); @@ -219,7 +219,7 @@ class BrowserPlatform extends PlatformPlugin { /// Lists available test images under `out/web_tests/test_images`. Future _testImageListingHandler(shelf.Request request) async { - const Map supportedImageTypes = { + const supportedImageTypes = { '.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', @@ -232,12 +232,12 @@ class BrowserPlatform extends PlatformPlugin { return shelf.Response.notFound('Not found.'); } - final Directory testImageDirectory = Directory(p.join( + final testImageDirectory = Directory(p.join( env.environment.webTestsArtifactsDir.path, 'test_images', )); - final List testImageFiles = testImageDirectory + final testImageFiles = testImageDirectory .listSync(recursive: true) .whereType() .map( @@ -262,17 +262,17 @@ class BrowserPlatform extends PlatformPlugin { } shelf.Handler _createSourceHandler() => (shelf.Request request) async { - final String path = p.fromUri(request.url); - final String extension = p.extension(path); - final bool isSource = + final path = p.fromUri(request.url); + final extension = p.extension(path); + final isSource = extension == '.dart' || extension == '.c' || extension == '.cc' || extension == '.cpp' || extension == '.h'; if (isSource && p.isRelative(path)) { - final String fullPath = p.join(env.environment.engineSrcDir.path, path); - final File file = File(fullPath); + final fullPath = p.join(env.environment.engineSrcDir.path, path); + final file = File(fullPath); if (file.existsSync()) { return shelf.Response.ok(file.openRead()); } @@ -313,24 +313,24 @@ class BrowserPlatform extends PlatformPlugin { /// other as prefixes. To actually read the file, the file system root is /// prepended before creating the file. shelf.Handler _createAbsolutePackageUrlHandler() { - final Map urlToPackage = {}; - for (final Package package in packageConfig.packages) { + final urlToPackage = {}; + for (final package in packageConfig.packages) { // Turns the URI as encoded in package_config.json to a file path. - final String configPath = p.fromUri(package.root); + final configPath = p.fromUri(package.root); // Strips drive letter and root prefix, if any, for example: // // C:\Users\user\AppData => Users\user\AppData // /home/user/path.dart => home/user/path.dart - final String rootRelativePath = + final rootRelativePath = p.relative(configPath, from: p.rootPrefix(configPath)); urlToPackage[p.toUri(rootRelativePath).path] = package; } return (shelf.Request request) async { - final String requestedPath = request.url.path; + final requestedPath = request.url.path; // The cast is needed because keys are non-null String, so there's no way // to return null for a mismatch. - final String? packagePath = urlToPackage.keys.cast().firstWhere( + final packagePath = urlToPackage.keys.cast().firstWhere( (String? packageUrl) => requestedPath.startsWith(packageUrl!), orElse: () => null, ); @@ -343,12 +343,12 @@ class BrowserPlatform extends PlatformPlugin { // // Users\user\AppData => C:\Users\user\AppData // home/user/path.dart => /home/user/path.dart - final Package package = urlToPackage[packagePath]!; - final String filePath = p.join( + final package = urlToPackage[packagePath]!; + final filePath = p.join( p.rootPrefix(p.fromUri(package.root.path)), p.fromUri(requestedPath), ); - final File fileInPackage = File(filePath); + final fileInPackage = File(filePath); if (!fileInPackage.existsSync()) { return shelf.Response.notFound('File not found: $requestedPath'); } @@ -362,17 +362,17 @@ class BrowserPlatform extends PlatformPlugin { 'This request is not handled by the test payload generator'); } - final int payloadLength = int.parse(request.requestedUri.queryParameters['length']!); - final int chunkLength = int.parse(request.requestedUri.queryParameters['chunk']!); + final payloadLength = int.parse(request.requestedUri.queryParameters['length']!); + final chunkLength = int.parse(request.requestedUri.queryParameters['chunk']!); - final StreamController> controller = StreamController>(); + final controller = StreamController>(); Future fillPayload() async { - int remainingByteCount = payloadLength; - int byteCounter = 0; + var remainingByteCount = payloadLength; + var byteCounter = 0; while (remainingByteCount > 0) { final int currentChunkLength = min(chunkLength, remainingByteCount); - final List chunk = List.generate( + final chunk = List.generate( currentChunkLength, (int i) => (byteCounter + i) & 0xFF, ); @@ -402,10 +402,10 @@ class BrowserPlatform extends PlatformPlugin { 'This request is not handled by the screenshot handler'); } - final String payload = await request.readAsString(); - final Map requestData = + final payload = await request.readAsString(); + final requestData = json.decode(payload) as Map; - final String filename = requestData['filename'] as String; + final filename = requestData['filename'] as String; if (!(await browserManager).supportsScreenshots) { if (isVerbose) { @@ -417,10 +417,10 @@ class BrowserPlatform extends PlatformPlugin { return shelf.Response.ok(json.encode('OK')); } - final Map region = + final region = requestData['region'] as Map; - final bool isCanvaskitTest = requestData['isCanvaskitTest'] as bool; - final String result = await _diffScreenshot(filename, region, isCanvaskitTest); + final isCanvaskitTest = requestData['isCanvaskitTest'] as bool; + final result = await _diffScreenshot(filename, region, isCanvaskitTest); return shelf.Response.ok(json.encode(result)); } @@ -429,7 +429,7 @@ class BrowserPlatform extends PlatformPlugin { Map region, bool isCanvaskitTest, ) async { - final Rectangle regionAsRectange = Rectangle( + final regionAsRectange = Rectangle( region['x'] as num, region['y'] as num, region['width'] as num, @@ -437,7 +437,7 @@ class BrowserPlatform extends PlatformPlugin { ); // Take screenshot. - final Image screenshot = + final screenshot = await (await browserManager).captureScreenshot(regionAsRectange); return compareImage( @@ -480,7 +480,7 @@ class BrowserPlatform extends PlatformPlugin { /// This is used for trivial use-cases, such as `favicon.ico`, host pages, etc. shelf.Handler createSimpleDirectoryHandler(Directory directory) { return (shelf.Request request) { - final File fileInDirectory = File(p.join( + final fileInDirectory = File(p.join( directory.path, request.url.path, )); @@ -489,17 +489,17 @@ class BrowserPlatform extends PlatformPlugin { return shelf.Response.notFound('File not found: ${request.url.path}'); } - final String extension = p.extension(fileInDirectory.path); - final String? contentType = contentTypes[extension]; + final extension = p.extension(fileInDirectory.path); + final contentType = contentTypes[extension]; if (contentType == null) { - final String error = + final error = 'Failed to determine Content-Type for "${request.url.path}".'; stderr.writeln(error); return shelf.Response.internalServerError(body: error); } - final bool isScript = + final isScript = extension == '.js' || extension == '.mjs' || extension == '.html'; @@ -544,16 +544,16 @@ class BrowserPlatform extends PlatformPlugin { /// Serves the HTML file that bootstraps the test. shelf.Response _testBootstrapHandler(shelf.Request request) { - final String path = p.fromUri(request.url); + final path = p.fromUri(request.url); if (path.endsWith('.html')) { - final String test = '${p.withoutExtension(path)}.dart'; - final String scriptBase = htmlEscape.convert(p.basename(test)); + final test = '${p.withoutExtension(path)}.dart'; + final scriptBase = htmlEscape.convert(p.basename(test)); - final String buildConfigsString = suite.testBundle.compileConfigs.map( + final buildConfigsString = suite.testBundle.compileConfigs.map( (CompileConfiguration config) => _makeBuildConfigString(scriptBase, config) ).join(',\n'); - final String bootstrapScript = ''' + final bootstrapScript = '''