diff --git a/analysis_options.yaml b/analysis_options.yaml index c33c15e544991..5f355bb4e8335 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,7 +1,7 @@ # Specify analysis options. # # This file is a copy of analysis_options.yaml from flutter repo -# as of 2023-03-22, but with some modifications marked with +# as of 2022-07-27, but with some modifications marked with # "DIFFERENT FROM FLUTTER/FLUTTER" below. analyzer: @@ -23,6 +23,7 @@ linter: - always_declare_return_types - always_put_control_body_on_new_line # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219 + - always_require_non_null_named_parameters - always_specify_types # - always_use_package_imports # we do this commonly - annotate_overrides @@ -51,6 +52,8 @@ linter: - avoid_relative_lib_imports - avoid_renaming_method_parameters - avoid_return_types_on_setters + - avoid_returning_null + - avoid_returning_null_for_future - avoid_returning_null_for_void # - avoid_returning_this # there are enough valid reasons to return `this` that this lint ends up with too many false positives - avoid_setters_without_getters @@ -71,19 +74,17 @@ linter: # - cascade_invocations # doesn't match the typical style of this repo - cast_nullable_to_non_nullable # - close_sinks # not reliable enough - - collection_methods_unrelated_type - combinators_ordering # - comment_references # blocked on https://github.com/dart-lang/linter/issues/1142 - conditional_uri_does_not_exist # - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204 - control_flow_in_finally - curly_braces_in_flow_control_structures - - dangling_library_doc_comments - depend_on_referenced_packages - deprecated_consistency # - diagnostic_describe_all_properties # enabled only at the framework level (packages/flutter/lib) - directives_ordering - # - discarded_futures # too many false positives, similar to unawaited_futures + # - discarded_futures # not yet tested # - do_not_use_environment # there are appropriate times to use the environment, especially in our tests and build logic - empty_catches - empty_constructor_bodies @@ -94,12 +95,10 @@ linter: - flutter_style_todos - hash_and_equals - implementation_imports - - implicit_call_tearoffs - invalid_case_patterns - iterable_contains_unrelated_type # - join_return_with_assignment # not required by flutter style - leading_newlines_in_multiline_strings - - library_annotations - library_names - library_prefixes - library_private_types_in_public_api @@ -138,6 +137,7 @@ linter: # - prefer_constructors_over_static_methods # far too many false positives - prefer_contains # - prefer_double_quotes # opposite of prefer_single_quotes + - prefer_equal_for_default_values # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods - prefer_final_fields - prefer_final_in_for_each @@ -157,7 +157,7 @@ linter: - prefer_is_not_empty - prefer_is_not_operator - prefer_iterable_whereType - - prefer_mixin + # - prefer_mixin # Has false positives, see https://github.com/dart-lang/linter/issues/3018 # - prefer_null_aware_method_calls # "call()" is confusing to people new to the language since it's not documented anywhere - prefer_null_aware_operators - prefer_relative_imports @@ -168,10 +168,10 @@ linter: - provide_deprecation_message - public_member_api_docs # DIFFERENT FROM FLUTTER/FLUTTER - recursive_getters - # - require_trailing_commas # would be nice, but requires a lot of manual work: 10,000+ code locations would need to be reformatted by hand after bulk fix is applied + # - require_trailing_commas # blocked on https://github.com/dart-lang/sdk/issues/47441 - secure_pubspec_urls - sized_box_for_whitespace - - sized_box_shrink_expand + # - sized_box_shrink_expand # not yet tested - slash_for_doc_comments - sort_child_properties_last - sort_constructors_first @@ -185,14 +185,12 @@ linter: # - unawaited_futures # too many false positives, especially with the way AnimationController works - unnecessary_await_in_return - unnecessary_brace_in_string_interps - - unnecessary_breaks - unnecessary_const - unnecessary_constructor_name # - unnecessary_final # conflicts with prefer_final_locals - unnecessary_getters_setters # - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498 - unnecessary_late - - unnecessary_library_directive - unnecessary_new - unnecessary_null_aware_assignments - unnecessary_null_aware_operator_on_extension_on_nullable @@ -207,13 +205,12 @@ linter: - unnecessary_string_interpolations - unnecessary_this - unnecessary_to_list_in_spreads - # - unreachable_from_main # Do not enable this rule until it is un-marked as "experimental" and carefully re-evaluated. - unrelated_type_equality_checks - unsafe_html - use_build_context_synchronously - - use_colored_box - # - use_decorated_box # leads to bugs: DecoratedBox and Container are not equivalent (Container inserts extra padding) - - use_enums + # - use_colored_box # not yet tested + # - use_decorated_box # not yet tested + # - use_enums # not yet tested - use_full_hex_values_for_flutter_colors - use_function_type_syntax_for_parameters - use_if_null_to_convert_nulls_to_bools @@ -225,7 +222,6 @@ linter: - use_rethrow_when_possible - use_setters_to_change_properties # - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182 - # - use_string_in_part_of_directives # DIFFERENT FROM FLUTTER/FLUTTER (needs to be evaluated, dart:ui does this frequently) - use_super_parameters - use_test_throws_matchers # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review diff --git a/ci/bin/format.dart b/ci/bin/format.dart index c67f9c0d7ede0..e68e046533c6f 100644 --- a/ci/bin/format.dart +++ b/ci/bin/format.dart @@ -968,10 +968,13 @@ Future main(List arguments) async { switch (type) { case MessageType.message: stderr.writeln(message); + break; case MessageType.error: stderr.writeln('ERROR: $message'); + break; case MessageType.warning: stderr.writeln('WARNING: $message'); + break; } } diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index 09e63acdce8ef..7d300f7b83bf6 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1,2 +1,2 @@ -Signature: 61adfda2905179c8e8b7d754d8660a7f +Signature: 90df0faca032ae220230aef5e61ca020 diff --git a/flutter_frontend_server/bin/starter.dart b/flutter_frontend_server/bin/starter.dart index e839087dd5d04..f78c3a2754d5c 100644 --- a/flutter_frontend_server/bin/starter.dart +++ b/flutter_frontend_server/bin/starter.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +library frontend_server; import 'dart:io'; diff --git a/flutter_frontend_server/lib/server.dart b/flutter_frontend_server/lib/server.dart index 8733c5b7a9070..49f8ffd08d2e5 100644 --- a/flutter_frontend_server/lib/server.dart +++ b/flutter_frontend_server/lib/server.dart @@ -4,6 +4,7 @@ // ignore_for_file: avoid_print +library flutter_frontend_server; import 'dart:async'; import 'dart:io' hide FileSystemEntity; diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart index 34ae394c4446d..84b7a90ae48f9 100644 --- a/lib/ui/channel_buffers.dart +++ b/lib/ui/channel_buffers.dart @@ -468,6 +468,7 @@ class ChannelBuffers { } index += 1; resize(channelName, data.getUint32(index, Endian.host)); + break; case 'overflow': if (bytes[index] != 0x0C) { // 12 = value code for list throw Exception("Invalid arguments for 'overflow' method sent to $kControlChannelName (arguments must be a two-element list, channel name and flag state)"); @@ -492,6 +493,7 @@ class ChannelBuffers { throw Exception("Invalid arguments for 'overflow' method sent to $kControlChannelName (second argument must be a boolean)"); } allowOverflow(channelName, bytes[index] == 0x01); + break; default: throw Exception("Unrecognized method '$methodName' sent to $kControlChannelName"); } diff --git a/lib/ui/text.dart b/lib/ui/text.dart index 64ba28c447bac..171682e55734b 100644 --- a/lib/ui/text.dart +++ b/lib/ui/text.dart @@ -2831,8 +2831,10 @@ class Paragraph extends NativeFieldWrapperClass1 { switch (position.affinity) { case TextAffinity.upstream: characterPosition = position.offset - 1; + break; case TextAffinity.downstream: characterPosition = position.offset; + break; } final List boundary = _getWordBoundary(characterPosition); return TextRange(start: boundary[0], end: boundary[1]); diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index eb33bb4c86702..6f5949c5b46e0 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -1006,9 +1006,11 @@ class BrowserManager { case 'restart': _onRestartController.add(null); + break; case 'resume': _pauseCompleter?.complete(); + break; default: // Unreachable. diff --git a/lib/web_ui/lib/channel_buffers.dart b/lib/web_ui/lib/channel_buffers.dart index 4d0e3fb4a4d13..4677e790f092e 100644 --- a/lib/web_ui/lib/channel_buffers.dart +++ b/lib/web_ui/lib/channel_buffers.dart @@ -199,6 +199,7 @@ class ChannelBuffers { } index += 1; resize(channelName, data.getUint32(index, Endian.host)); + break; case 'overflow': if (bytes[index] != 0x0C) { throw Exception("Invalid arguments for 'overflow' method sent to $kControlChannelName (arguments must be a two-element list, channel name and flag state)"); @@ -223,6 +224,7 @@ class ChannelBuffers { throw Exception("Invalid arguments for 'overflow' method sent to $kControlChannelName (second argument must be a boolean)"); } allowOverflow(channelName, bytes[index] == 0x01); + break; default: throw Exception("Unrecognized method '$methodName' sent to $kControlChannelName"); } diff --git a/lib/web_ui/lib/painting.dart b/lib/web_ui/lib/painting.dart index 05c6182108c4e..d15d83fc4b926 100644 --- a/lib/web_ui/lib/painting.dart +++ b/lib/web_ui/lib/painting.dart @@ -559,8 +559,10 @@ Future createBmp( switch (format) { case PixelFormat.bgra8888: swapRedBlue = true; + break; case PixelFormat.rgba8888: swapRedBlue = false; + break; } // See https://en.wikipedia.org/wiki/BMP_file_format for format examples. diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart index a82b9d9b82a0e..3a86a7dbc7e6b 100644 --- a/lib/web_ui/lib/src/engine.dart +++ b/lib/web_ui/lib/src/engine.dart @@ -12,7 +12,7 @@ // The code that performs the transformations lives in: // // - https://github.com/flutter/engine/blob/main/web_sdk/sdk_rewriter.dart -// ignore: unnecessary_library_directive + library engine; export 'engine/alarm_clock.dart'; diff --git a/lib/web_ui/lib/src/engine/canvas_pool.dart b/lib/web_ui/lib/src/engine/canvas_pool.dart index c264080bf82a8..f997b23ac4dba 100644 --- a/lib/web_ui/lib/src/engine/canvas_pool.dart +++ b/lib/web_ui/lib/src/engine/canvas_pool.dart @@ -592,6 +592,7 @@ class CanvasPool extends _SaveStackTracking { ctx.arc(x, y, radius, 0, 2.0 * math.pi); ctx.fill(); } + break; case ui.PointMode.lines: ctx.beginPath(); for (int i = 0; i < (len - 2); i += 4) { @@ -599,6 +600,7 @@ class CanvasPool extends _SaveStackTracking { ctx.lineTo(points[i + 2] + offsetX, points[i + 3] + offsetY); ctx.stroke(); } + break; case ui.PointMode.polygon: ctx.beginPath(); ctx.moveTo(points[0] + offsetX, points[1] + offsetY); @@ -606,6 +608,7 @@ class CanvasPool extends _SaveStackTracking { ctx.lineTo(points[i] + offsetX, points[i + 1] + offsetY); } ctx.stroke(); + break; } } @@ -622,12 +625,16 @@ class CanvasPool extends _SaveStackTracking { switch (verb) { case SPath.kMoveVerb: ctx.moveTo(p[0], p[1]); + break; case SPath.kLineVerb: ctx.lineTo(p[2], p[3]); + break; case SPath.kCubicVerb: ctx.bezierCurveTo(p[2], p[3], p[4], p[5], p[6], p[7]); + break; case SPath.kQuadVerb: ctx.quadraticCurveTo(p[2], p[3], p[4], p[5]); + break; case SPath.kConicVerb: final double w = iter.conicWeight; final Conic conic = Conic(p[0], p[1], p[2], p[3], p[4], p[5], w); @@ -640,8 +647,10 @@ class CanvasPool extends _SaveStackTracking { final double p2y = points[i + 1].dy; ctx.quadraticCurveTo(p1x, p1y, p2x, p2y); } + break; case SPath.kCloseVerb: ctx.closePath(); + break; default: throw UnimplementedError('Unknown path verb $verb'); } @@ -674,14 +683,18 @@ class CanvasPool extends _SaveStackTracking { switch (verb) { case SPath.kMoveVerb: ctx.moveTo(p[0] + offsetX, p[1] + offsetY); + break; case SPath.kLineVerb: ctx.lineTo(p[2] + offsetX, p[3] + offsetY); + break; case SPath.kCubicVerb: ctx.bezierCurveTo(p[2] + offsetX, p[3] + offsetY, p[4] + offsetX, p[5] + offsetY, p[6] + offsetX, p[7] + offsetY); + break; case SPath.kQuadVerb: ctx.quadraticCurveTo(p[2] + offsetX, p[3] + offsetY, p[4] + offsetX, p[5] + offsetY); + break; case SPath.kConicVerb: final double w = iter.conicWeight; final Conic conic = Conic(p[0], p[1], p[2], p[3], p[4], p[5], w); @@ -695,8 +708,10 @@ class CanvasPool extends _SaveStackTracking { ctx.quadraticCurveTo(p1x + offsetX, p1y + offsetY, p2x + offsetX, p2y + offsetY); } + break; case SPath.kCloseVerb: ctx.closePath(); + break; default: throw UnimplementedError('Unknown path verb $verb'); } diff --git a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart index e2d5f196348f9..f2ae09c9b236e 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart @@ -302,6 +302,7 @@ class HtmlViewEmbedder { headTransform = mutator.matrix!.multiplied(headTransform); head.style.transform = float64ListToCssTransform(headTransform.storage); + break; case MutatorType.clipRect: case MutatorType.clipRRect: case MutatorType.clipPath: @@ -358,8 +359,10 @@ class HtmlViewEmbedder { } _resetAnchor(clipView); head = clipView; + break; case MutatorType.opacity: embeddedOpacity *= mutator.alphaFloat; + break; } } diff --git a/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart b/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart index 6eb9ed1f7257b..54ea9eebbb1cd 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Uses the `ImageDecoder` class supplied by the browser. -// -// See also: -// -// * `image_wasm_codecs.dart`, which uses codecs supplied by the CanvasKit WASM bundle. +/// Uses the `ImageDecoder` class supplied by the browser. +/// +/// See also: +/// +/// * `image_wasm_codecs.dart`, which uses codecs supplied by the CanvasKit WASM bundle. import 'dart:async'; import 'dart:convert' show base64; diff --git a/lib/web_ui/lib/src/engine/canvaskit/layer.dart b/lib/web_ui/lib/src/engine/canvaskit/layer.dart index 801caf7c11c86..d8c98694ad1c4 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/layer.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/layer.dart @@ -64,10 +64,13 @@ class PrerollContext { switch (m.type) { case MutatorType.clipRect: clipRect = m.rect!; + break; case MutatorType.clipRRect: clipRect = m.rrect!.outerRect; + break; case MutatorType.clipPath: clipRect = m.path!.getBounds(); + break; default: continue; } @@ -524,11 +527,14 @@ class PhysicalShapeEngineLayer extends ContainerLayer switch (_clipBehavior) { case ui.Clip.hardEdge: paintContext.internalNodesCanvas.clipPath(_path, false); + break; case ui.Clip.antiAlias: paintContext.internalNodesCanvas.clipPath(_path, true); + break; case ui.Clip.antiAliasWithSaveLayer: paintContext.internalNodesCanvas.clipPath(_path, true); paintContext.internalNodesCanvas.saveLayer(paintBounds, null); + break; case ui.Clip.none: break; } diff --git a/lib/web_ui/lib/src/engine/canvaskit/text.dart b/lib/web_ui/lib/src/engine/canvaskit/text.dart index 8434a5db95949..fd6f81e4e11d2 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/text.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/text.dart @@ -115,8 +115,10 @@ class CkParagraphStyle implements ui.ParagraphStyle { break; case ui.TextLeadingDistribution.even: skStrutStyle.halfLeading = true; + break; case ui.TextLeadingDistribution.proportional: skStrutStyle.halfLeading = false; + break; } if (style._leading != null) { @@ -418,8 +420,10 @@ class CkTextStyle implements ui.TextStyle { break; case ui.TextLeadingDistribution.even: properties.halfLeading = true; + break; case ui.TextLeadingDistribution.proportional: properties.halfLeading = false; + break; } if (locale != null) { @@ -600,12 +604,16 @@ class CkParagraph extends SkiaObject implements ui.Paragraph { switch (command.type) { case _ParagraphCommandType.addText: builder.addText(command.text!); + break; case _ParagraphCommandType.pop: builder.pop(); + break; case _ParagraphCommandType.pushStyle: builder.pushStyle(command.style!); + break; case _ParagraphCommandType.addPlaceholder: builder._addPlaceholder(command.placeholderStyle!); + break; } } paragraph = builder._buildSkParagraph(); @@ -778,8 +786,10 @@ class CkParagraph extends SkiaObject implements ui.Paragraph { switch (position.affinity) { case ui.TextAffinity.upstream: characterPosition = position.offset - 1; + break; case ui.TextAffinity.downstream: characterPosition = position.offset; + break; } final SkTextRange skRange = paragraph.getWordBoundary(characterPosition.toDouble()); return ui.TextRange(start: skRange.start.toInt(), end: skRange.end.toInt()); diff --git a/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart b/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart index 00948fcf4c068..55add4bba234d 100644 --- a/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart +++ b/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart @@ -804,16 +804,19 @@ class BitmapCanvas extends EngineCanvas { case ui.BlendMode.clear: case ui.BlendMode.dstOut: style.position = 'absolute'; + break; case ui.BlendMode.src: case ui.BlendMode.srcOver: style ..position = 'absolute' ..backgroundColor = colorToCssString(filterColor)!; + break; case ui.BlendMode.dst: case ui.BlendMode.dstIn: style ..position = 'absolute' ..backgroundImage = "url('${image.imgElement.src}')"; + break; default: style ..position = 'absolute' diff --git a/lib/web_ui/lib/src/engine/html/color_filter.dart b/lib/web_ui/lib/src/engine/html/color_filter.dart index b0fc45605d9c8..4961d7c8dec6d 100644 --- a/lib/web_ui/lib/src/engine/html/color_filter.dart +++ b/lib/web_ui/lib/src/engine/html/color_filter.dart @@ -121,18 +121,24 @@ SvgFilter svgFilterFromBlendMode( case ui.BlendMode.srcIn: case ui.BlendMode.srcATop: svgFilter = _srcInColorFilterToSvg(filterColor); + break; case ui.BlendMode.srcOut: svgFilter = _srcOutColorFilterToSvg(filterColor); + break; case ui.BlendMode.dstATop: svgFilter = _dstATopColorFilterToSvg(filterColor); + break; case ui.BlendMode.xor: svgFilter = _xorColorFilterToSvg(filterColor); + break; case ui.BlendMode.plus: // Porter duff source + destination. svgFilter = _compositeColorFilterToSvg(filterColor, 0, 1, 1, 0); + break; case ui.BlendMode.modulate: // Porter duff source * destination but preserves alpha. svgFilter = _modulateColorFilterToSvg(filterColor!); + break; case ui.BlendMode.overlay: // Since overlay is the same as hard-light by swapping layers, // pass hard-light blend function. @@ -141,6 +147,7 @@ SvgFilter svgFilterFromBlendMode( blendModeToSvgEnum(ui.BlendMode.hardLight)!, swapLayers: true, ); + break; // Several of the filters below (although supported) do not render the // same (close but not exact) as native flutter when used as blend mode // for a background-image with a background color. They only look @@ -168,6 +175,7 @@ SvgFilter svgFilterFromBlendMode( case ui.BlendMode.exclusion: svgFilter = _blendColorFilterToSvg( filterColor, blendModeToSvgEnum(colorFilterBlendMode)!); + break; case ui.BlendMode.src: case ui.BlendMode.dst: case ui.BlendMode.dstIn: diff --git a/lib/web_ui/lib/src/engine/html/path/path.dart b/lib/web_ui/lib/src/engine/html/path/path.dart index ed3b2e7d57752..57a1312d49349 100644 --- a/lib/web_ui/lib/src/engine/html/path/path.dart +++ b/lib/web_ui/lib/src/engine/html/path/path.dart @@ -1135,18 +1135,24 @@ class SurfacePath implements ui.Path { } else { moveTo(outPts[0], outPts[1]); } + break; case SPath.kLineVerb: lineTo(outPts[2], outPts[3]); + break; case SPath.kQuadVerb: _quadTo(outPts[2], outPts[3], outPts[4], outPts[5]); + break; case SPath.kConicVerb: conicTo( outPts[2], outPts[3], outPts[4], outPts[5], iter.conicWeight); + break; case SPath.kCubicVerb: cubicTo(outPts[2], outPts[3], outPts[4], outPts[5], outPts[6], outPts[7]); + break; case SPath.kCloseVerb: close(); + break; } firstVerb = false; } @@ -1242,14 +1248,19 @@ class SurfacePath implements ui.Path { break; case SPath.kLineVerb: tangentLine(buffer, x, y, tangents); + break; case SPath.kQuadVerb: tangentQuad(buffer, x, y, tangents); + break; case SPath.kConicVerb: tangentConic(buffer, x, y, iter.conicWeight, tangents); + break; case SPath.kCubicVerb: tangentCubic(buffer, x, y, tangents); + break; case SPath.kDoneVerb: done = true; + break; } if (tangents.length > oldCount) { final int last = tangents.length - 1; @@ -1381,14 +1392,19 @@ class SurfacePath implements ui.Path { } state.setMovePt(pts[0], pts[1]); count = 0; + break; case SPath.kLineVerb: count = 1; + break; case SPath.kQuadVerb: count = 2; + break; case SPath.kConicVerb: count = 2; + break; case SPath.kCubicVerb: count = 3; + break; case SPath.kCloseVerb: if (!state.close()) { if (!state.isFinite) { @@ -1397,6 +1413,7 @@ class SurfacePath implements ui.Path { return _setComputedConvexity(SPathConvexityType.kConcave); } count = 0; + break; default: return _setComputedConvexity(SPathConvexityType.kConcave); } @@ -1462,9 +1479,11 @@ class SurfacePath implements ui.Path { case SPath.kMoveVerb: minX = maxX = points[pIndex]; minY = maxY = points[pIndex + 1]; + break; case SPath.kLineVerb: minX = maxX = points[pIndex + 2]; minY = maxY = points[pIndex + 3]; + break; case SPath.kQuadVerb: quadBounds ??= QuadBounds(); quadBounds.calculateBounds(points, pIndex); @@ -1472,6 +1491,7 @@ class SurfacePath implements ui.Path { minY = quadBounds.minY; maxX = quadBounds.maxX; maxY = quadBounds.maxY; + break; case SPath.kConicVerb: conicBounds ??= ConicBounds(); conicBounds.calculateBounds(points, iter.conicWeight, pIndex); @@ -1479,6 +1499,7 @@ class SurfacePath implements ui.Path { minY = conicBounds.minY; maxX = conicBounds.maxX; maxY = conicBounds.maxY; + break; case SPath.kCubicVerb: cubicBounds ??= CubicBounds(); cubicBounds.calculateBounds(points, pIndex); @@ -1486,6 +1507,7 @@ class SurfacePath implements ui.Path { minY = cubicBounds.minY; maxX = cubicBounds.maxX; maxY = cubicBounds.maxY; + break; } if (!ltrbInitialized) { left = minX; @@ -1569,20 +1591,26 @@ class SurfacePath implements ui.Path { switch (verb) { case SPath.kMoveVerb: sb.write('MoveTo(${points[pIndex]}, ${points[pIndex + 1]})'); + break; case SPath.kLineVerb: sb.write('LineTo(${points[pIndex + 2]}, ${points[pIndex + 3]})'); + break; case SPath.kQuadVerb: sb.write('Quad(${points[pIndex + 2]}, ${points[pIndex + 3]},' ' ${points[pIndex + 3]}, ${points[pIndex + 4]})'); + break; case SPath.kConicVerb: sb.write('Conic(${points[pIndex + 2]}, ${points[pIndex + 3]},' ' ${points[pIndex + 3]}, ${points[pIndex + 4]}, w = ${iter.conicWeight})'); + break; case SPath.kCubicVerb: sb.write('Cubic(${points[pIndex + 2]}, ${points[pIndex + 3]},' ' ${points[pIndex + 3]}, ${points[pIndex + 4]}, ' ' ${points[pIndex + 5]}, ${points[pIndex + 6]})'); + break; case SPath.kCloseVerb: sb.write('Close()'); + break; } if (iter.peek() != SPath.kDoneVerb) { sb.write(' '); diff --git a/lib/web_ui/lib/src/engine/html/path/path_iterator.dart b/lib/web_ui/lib/src/engine/html/path/path_iterator.dart index 5f09e134ffba2..90793a95004f0 100644 --- a/lib/web_ui/lib/src/engine/html/path/path_iterator.dart +++ b/lib/web_ui/lib/src/engine/html/path/path_iterator.dart @@ -153,6 +153,7 @@ class PathIterator { _lastPointX = _moveToX; _lastPointY = _moveToY; _needClose = _forceClose; + break; case SPath.kLineVerb: final ui.Offset start = _constructMoveTo(); final double offsetX = pathRef.points[_pointIndex++]; @@ -163,6 +164,7 @@ class PathIterator { outPts[3] = offsetY; _lastPointX = offsetX; _lastPointY = offsetY; + break; case SPath.kConicVerb: _conicWeightIndex++; final ui.Offset start = _constructMoveTo(); @@ -172,6 +174,7 @@ class PathIterator { outPts[3] = pathRef.points[_pointIndex++]; _lastPointX = outPts[4] = pathRef.points[_pointIndex++]; _lastPointY = outPts[5] = pathRef.points[_pointIndex++]; + break; case SPath.kQuadVerb: final ui.Offset start = _constructMoveTo(); outPts[0] = start.dx; @@ -180,6 +183,7 @@ class PathIterator { outPts[3] = pathRef.points[_pointIndex++]; _lastPointX = outPts[4] = pathRef.points[_pointIndex++]; _lastPointY = outPts[5] = pathRef.points[_pointIndex++]; + break; case SPath.kCubicVerb: final ui.Offset start = _constructMoveTo(); outPts[0] = start.dx; @@ -190,6 +194,7 @@ class PathIterator { outPts[5] = pathRef.points[_pointIndex++]; _lastPointX = outPts[6] = pathRef.points[_pointIndex++]; _lastPointY = outPts[7] = pathRef.points[_pointIndex++]; + break; case SPath.kCloseVerb: verb = _autoClose(outPts); if (verb == SPath.kLineVerb) { @@ -201,8 +206,10 @@ class PathIterator { } _lastPointX = _moveToX; _lastPointY = _moveToY; + break; case SPath.kDoneVerb: assert(_verbIndex == pathRef.countVerbs()); + break; default: throw FormatException('Unsupport Path verb $verb'); } diff --git a/lib/web_ui/lib/src/engine/html/path/path_metrics.dart b/lib/web_ui/lib/src/engine/html/path/path_metrics.dart index 5170b20416263..7dad8f3e4f0d2 100644 --- a/lib/web_ui/lib/src/engine/html/path/path_metrics.dart +++ b/lib/web_ui/lib/src/engine/html/path/path_metrics.dart @@ -258,13 +258,16 @@ class _PathContourMeasure { final double toX = (points[2] * stopT) + (points[0] * (1.0 - stopT)); final double toY = (points[3] * stopT) + (points[1] * (1.0 - stopT)); path.lineTo(toX, toY); + break; case SPath.kCubicVerb: chopCubicBetweenT(points, startT, stopT, _buffer); path.cubicTo(_buffer[2], _buffer[3], _buffer[4], _buffer[5], _buffer[6], _buffer[7]); + break; case SPath.kQuadVerb: _chopQuadBetweenT(points, startT, stopT, _buffer); path.quadraticBezierTo(_buffer[2], _buffer[3], _buffer[4], _buffer[5]); + break; case SPath.kConicVerb: // Implement this once we start writing out conic segments. throw UnimplementedError(); @@ -306,9 +309,11 @@ class _PathContourMeasure { switch (verb) { case SPath.kMoveVerb: haveSeenMoveTo = true; + break; case SPath.kLineVerb: assert(haveSeenMoveTo); lineToHandler(points[0], points[1], points[2], points[3]); + break; case SPath.kCubicVerb: assert(haveSeenMoveTo); // Compute cubic curve distance. @@ -325,6 +330,7 @@ class _PathContourMeasure { 0, _kMaxTValue, _segments); + break; case SPath.kConicVerb: assert(haveSeenMoveTo); final double w = iter.conicWeight; @@ -344,11 +350,13 @@ class _PathContourMeasure { startX = p2x; startY = p2y; } + break; case SPath.kQuadVerb: assert(haveSeenMoveTo); // Compute quad curve distance. distance = _computeQuadSegments(points[0], points[1], points[2], points[3], points[4], points[5], distance, 0, _kMaxTValue); + break; case SPath.kCloseVerb: _contourLength = distance; return iter.pathVerbIndex; diff --git a/lib/web_ui/lib/src/engine/html/path/path_ref.dart b/lib/web_ui/lib/src/engine/html/path/path_ref.dart index b9885d1540998..b54d09d28f1ea 100644 --- a/lib/web_ui/lib/src/engine/html/path/path_ref.dart +++ b/lib/web_ui/lib/src/engine/html/path/path_ref.dart @@ -532,12 +532,16 @@ class PathRef { switch (verbs[i]) { case SPath.kLineVerb: mask |= SPath.kLineSegmentMask; + break; case SPath.kQuadVerb: mask |= SPath.kQuadSegmentMask; + break; case SPath.kConicVerb: mask |= SPath.kConicSegmentMask; + break; case SPath.kCubicVerb: mask |= SPath.kCubicSegmentMask; + break; default: break; } @@ -637,25 +641,32 @@ class PathRef { switch (verb) { case SPath.kMoveVerb: pCnt = 1; + break; case SPath.kLineVerb: mask = SPath.kLineSegmentMask; pCnt = 1; + break; case SPath.kQuadVerb: mask = SPath.kQuadSegmentMask; pCnt = 2; + break; case SPath.kConicVerb: mask = SPath.kConicSegmentMask; pCnt = 2; + break; case SPath.kCubicVerb: mask = SPath.kCubicSegmentMask; pCnt = 3; + break; case SPath.kCloseVerb: pCnt = 0; + break; case SPath.kDoneVerb: if (assertionsEnabled) { throw Exception('growForVerb called for kDone'); } pCnt = 0; + break; default: if (assertionsEnabled) { throw Exception('default is not reached'); @@ -697,25 +708,32 @@ class PathRef { switch (verb) { case SPath.kMoveVerb: pCnt = numVbs; + break; case SPath.kLineVerb: mask = SPath.kLineSegmentMask; pCnt = numVbs; + break; case SPath.kQuadVerb: mask = SPath.kQuadSegmentMask; pCnt = 2 * numVbs; + break; case SPath.kConicVerb: mask = SPath.kConicSegmentMask; pCnt = 2 * numVbs; + break; case SPath.kCubicVerb: mask = SPath.kCubicSegmentMask; pCnt = 3 * numVbs; + break; case SPath.kCloseVerb: pCnt = 0; + break; case SPath.kDoneVerb: if (assertionsEnabled) { throw Exception('growForVerb called for kDone'); } pCnt = 0; + break; default: if (assertionsEnabled) { throw Exception('default is not reached'); @@ -981,23 +999,29 @@ class PathRefIterator { case SPath.kMoveVerb: iterIndex = _pointIndex; _pointIndex += 2; + break; case SPath.kLineVerb: iterIndex = _pointIndex - 2; _pointIndex += 2; + break; case SPath.kConicVerb: _conicWeightIndex++; iterIndex = _pointIndex - 2; _pointIndex += 4; + break; case SPath.kQuadVerb: iterIndex = _pointIndex - 2; _pointIndex += 4; + break; case SPath.kCubicVerb: iterIndex = _pointIndex - 2; _pointIndex += 6; + break; case SPath.kCloseVerb: break; case SPath.kDoneVerb: assert(_verbIndex == pathRef.countVerbs()); + break; default: throw FormatException('Unsupport Path verb $verb'); } @@ -1016,11 +1040,13 @@ class PathRefIterator { case SPath.kMoveVerb: outPts[0] = points[pointIndex++]; outPts[1] = points[pointIndex++]; + break; case SPath.kLineVerb: outPts[0] = points[pointIndex - 2]; outPts[1] = points[pointIndex - 1]; outPts[2] = points[pointIndex++]; outPts[3] = points[pointIndex++]; + break; case SPath.kConicVerb: _conicWeightIndex++; outPts[0] = points[pointIndex - 2]; @@ -1029,6 +1055,7 @@ class PathRefIterator { outPts[3] = points[pointIndex++]; outPts[4] = points[pointIndex++]; outPts[5] = points[pointIndex++]; + break; case SPath.kQuadVerb: outPts[0] = points[pointIndex - 2]; outPts[1] = points[pointIndex - 1]; @@ -1036,6 +1063,7 @@ class PathRefIterator { outPts[3] = points[pointIndex++]; outPts[4] = points[pointIndex++]; outPts[5] = points[pointIndex++]; + break; case SPath.kCubicVerb: outPts[0] = points[pointIndex - 2]; outPts[1] = points[pointIndex - 1]; @@ -1045,10 +1073,12 @@ class PathRefIterator { outPts[5] = points[pointIndex++]; outPts[6] = points[pointIndex++]; outPts[7] = points[pointIndex++]; + break; case SPath.kCloseVerb: break; case SPath.kDoneVerb: assert(_verbIndex == pathRef.countVerbs()); + break; default: throw FormatException('Unsupport Path verb $verb'); } diff --git a/lib/web_ui/lib/src/engine/html/path/path_to_svg.dart b/lib/web_ui/lib/src/engine/html/path/path_to_svg.dart index ae08d0d53d2c6..df36bf78bf482 100644 --- a/lib/web_ui/lib/src/engine/html/path/path_to_svg.dart +++ b/lib/web_ui/lib/src/engine/html/path/path_to_svg.dart @@ -21,14 +21,18 @@ String pathToSvg(PathRef pathRef, {double offsetX = 0, double offsetY = 0}) { switch (verb) { case SPath.kMoveVerb: buffer.write('M ${outPts[0] + offsetX} ${outPts[1] + offsetY}'); + break; case SPath.kLineVerb: buffer.write('L ${outPts[2] + offsetX} ${outPts[3] + offsetY}'); + break; case SPath.kCubicVerb: buffer.write('C ${outPts[2] + offsetX} ${outPts[3] + offsetY} ' '${outPts[4] + offsetX} ${outPts[5] + offsetY} ${outPts[6] + offsetX} ${outPts[7] + offsetY}'); + break; case SPath.kQuadVerb: buffer.write('Q ${outPts[2] + offsetX} ${outPts[3] + offsetY} ' '${outPts[4] + offsetX} ${outPts[5] + offsetY}'); + break; case SPath.kConicVerb: final double w = iter.conicWeight; final Conic conic = Conic(outPts[0], outPts[1], outPts[2], outPts[3], @@ -43,8 +47,10 @@ String pathToSvg(PathRef pathRef, {double offsetX = 0, double offsetY = 0}) { buffer.write('Q ${p1x + offsetX} ${p1y + offsetY} ' '${p2x + offsetX} ${p2y + offsetY}'); } + break; case SPath.kCloseVerb: buffer.write('Z'); + break; default: throw UnimplementedError('Unknown path verb $verb'); } diff --git a/lib/web_ui/lib/src/engine/html/path/path_windings.dart b/lib/web_ui/lib/src/engine/html/path/path_windings.dart index 24779051d8732..ac877a264d985 100644 --- a/lib/web_ui/lib/src/engine/html/path/path_windings.dart +++ b/lib/web_ui/lib/src/engine/html/path/path_windings.dart @@ -41,12 +41,16 @@ class PathWinding { break; case SPath.kLineVerb: _computeLineWinding(); + break; case SPath.kQuadVerb: _computeQuadWinding(); + break; case SPath.kConicVerb: _computeConicWinding(pathRef.conicWeights![iter.conicWeightIndex]); + break; case SPath.kCubicVerb: _computeCubicWinding(); + break; } } } diff --git a/lib/web_ui/lib/src/engine/html/recording_canvas.dart b/lib/web_ui/lib/src/engine/html/recording_canvas.dart index 11ae75c90d206..280ebbdc45bba 100644 --- a/lib/web_ui/lib/src/engine/html/recording_canvas.dart +++ b/lib/web_ui/lib/src/engine/html/recording_canvas.dart @@ -281,6 +281,7 @@ class RecordingCanvas { switch (clipOp) { case ui.ClipOp.intersect: _paintBounds.clipRect(rect, command); + break; case ui.ClipOp.difference: // Since this refers to inverse, can't shrink paintBounds. break; diff --git a/lib/web_ui/lib/src/engine/html/render_vertices.dart b/lib/web_ui/lib/src/engine/html/render_vertices.dart index 3d8c42d94c7fe..1626d1736293b 100644 --- a/lib/web_ui/lib/src/engine/html/render_vertices.dart +++ b/lib/web_ui/lib/src/engine/html/render_vertices.dart @@ -466,8 +466,10 @@ class _WebGlRenderer implements GlRenderer { switch (triangleVertexIndex) { case 0: ctx.moveTo(dx, dy); + break; case 1: ctx.lineTo(dx, dy); + break; case 2: ctx.lineTo(dx, dy); ctx.closePath(); diff --git a/lib/web_ui/lib/src/engine/html/shader_mask.dart b/lib/web_ui/lib/src/engine/html/shader_mask.dart index d781039ccaf9a..83988c294df09 100644 --- a/lib/web_ui/lib/src/engine/html/shader_mask.dart +++ b/lib/web_ui/lib/src/engine/html/shader_mask.dart @@ -132,6 +132,7 @@ class PersistedShaderMask extends PersistedContainerSurface // Since we don't have a size, we can't use background color. // Use svg filter srcIn instead. blendModeTemp = ui.BlendMode.srcIn; + break; case ui.BlendMode.src: case ui.BlendMode.dstOver: case ui.BlendMode.srcIn: @@ -187,19 +188,25 @@ SvgFilter svgMaskFilterFromImageAndBlendMode( switch (blendMode) { case ui.BlendMode.src: svgFilter = _srcImageToSvg(imageUrl, width, height); + break; case ui.BlendMode.srcIn: case ui.BlendMode.srcATop: svgFilter = _srcInImageToSvg(imageUrl, width, height); + break; case ui.BlendMode.srcOut: svgFilter = _srcOutImageToSvg(imageUrl, width, height); + break; case ui.BlendMode.xor: svgFilter = _xorImageToSvg(imageUrl, width, height); + break; case ui.BlendMode.plus: // Porter duff source + destination. svgFilter = _compositeImageToSvg(imageUrl, 0, 1, 1, 0, width, height); + break; case ui.BlendMode.modulate: // Porter duff source * destination but preserves alpha. svgFilter = _modulateImageToSvg(imageUrl, width, height); + break; case ui.BlendMode.overlay: // Since overlay is the same as hard-light by swapping layers, // pass hard-light blend function. @@ -210,6 +217,7 @@ SvgFilter svgMaskFilterFromImageAndBlendMode( height, swapLayers: true, ); + break; // Several of the filters below (although supported) do not render the // same (close but not exact) as native flutter when used as blend mode // for a background-image with a background color. They only look @@ -237,6 +245,7 @@ SvgFilter svgMaskFilterFromImageAndBlendMode( case ui.BlendMode.exclusion: svgFilter = _blendImageToSvg( imageUrl, blendModeToSvgEnum(blendMode)!, width, height); + break; case ui.BlendMode.dst: case ui.BlendMode.dstATop: case ui.BlendMode.dstIn: diff --git a/lib/web_ui/lib/src/engine/html/shaders/shader.dart b/lib/web_ui/lib/src/engine/html/shaders/shader.dart index effc2c6a5a96f..ac83b020c8b75 100644 --- a/lib/web_ui/lib/src/engine/html/shaders/shader.dart +++ b/lib/web_ui/lib/src/engine/html/shaders/shader.dart @@ -444,6 +444,7 @@ String _writeSharedGradientShader(ShaderBuilder builder, ShaderMethod method, case ui.TileMode.clamp: method.addStatement('float tiled_st = clamp(st, 0.0, 1.0);'); probeName = 'tiled_st'; + break; case ui.TileMode.decal: break; case ui.TileMode.repeated: @@ -452,11 +453,13 @@ String _writeSharedGradientShader(ShaderBuilder builder, ShaderMethod method, // pattern center is at origin. method.addStatement('float tiled_st = fract(st);'); probeName = 'tiled_st'; + break; case ui.TileMode.mirror: method.addStatement('float t_1 = (st - 1.0);'); method.addStatement( 'float tiled_st = abs((t_1 - 2.0 * floor(t_1 * 0.5)) - 1.0);'); probeName = 'tiled_st'; + break; } writeUnrolledBinarySearch(method, 0, gradient.thresholdCount - 1, probe: probeName, @@ -809,6 +812,7 @@ class ModeHtmlColorFilter extends EngineHtmlColorFilter { // Since we don't have a size, we can't use background color. // Use svg filter srcIn instead. blendMode = ui.BlendMode.srcIn; + break; case ui.BlendMode.dstOver: case ui.BlendMode.srcIn: case ui.BlendMode.srcATop: diff --git a/lib/web_ui/lib/src/engine/html/shaders/shader_builder.dart b/lib/web_ui/lib/src/engine/html/shaders/shader_builder.dart index bae00fb0030de..a1e49359a4f5a 100644 --- a/lib/web_ui/lib/src/engine/html/shaders/shader_builder.dart +++ b/lib/web_ui/lib/src/engine/html/shaders/shader_builder.dart @@ -132,13 +132,17 @@ class ShaderBuilder { switch (variable.storage) { case ShaderStorageQualifier.kConst: _buffer.write('const '); + break; case ShaderStorageQualifier.kAttribute: _buffer.write(isWebGl2 ? 'in ' : _isFragmentShader ? 'varying ' : 'attribute '); + break; case ShaderStorageQualifier.kUniform: _buffer.write('uniform '); + break; case ShaderStorageQualifier.kVarying: _buffer.write(isWebGl2 ? 'out ' : 'varying '); + break; } _buffer.write('${typeToString(variable.dataType)} ${variable.name}'); if (variable.storage == ShaderStorageQualifier.kConst) { @@ -273,14 +277,17 @@ class ShaderMethod { switch(tileMode) { case ui.TileMode.repeated: addStatement('float $destination = fract($source);'); + break; case ui.TileMode.mirror: addStatement('float $destination = ($source - 1.0);'); addStatement( '$destination = ' 'abs(($destination - 2.0 * floor($destination * 0.5)) - 1.0);'); + break; case ui.TileMode.clamp: case ui.TileMode.decal: addStatement('float $destination = $source;'); + break; } } diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 443f22f2dfd8c..dee9df112b80f 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -500,12 +500,15 @@ class KeyboardConverter { case ui.KeyEventType.down: assert(lastLogicalRecord == null); nextLogicalRecord = logicalKey(); + break; case ui.KeyEventType.up: assert(lastLogicalRecord != null); nextLogicalRecord = null; + break; case ui.KeyEventType.repeat: assert(lastLogicalRecord != null); nextLogicalRecord = lastLogicalRecord; + break; } if (nextLogicalRecord == null) { _pressingRecords.remove(physicalKey); diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/lib/web_ui/lib/src/engine/platform_dispatcher.dart index a0128a0c71383..0fcbea1600890 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher.dart @@ -484,6 +484,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { // CanvasKit vs HTML before invoking this method. replyToPlatformMessage( callback, codec.encodeSuccessEnvelope([true])); + break; } return; @@ -540,6 +541,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { ClipboardMessageHandler().getDataMethodCall(callback); return; } + break; // Dispatched by the bindings to delay service worker initialization. case 'flutter/service_worker': diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index 8b035e8398723..82a2cb4567ef8 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -437,9 +437,11 @@ mixin _WheelEventListenerMixin on _BaseAdapter { _defaultScrollLineHeight ??= _computeDefaultScrollLineHeight(); deltaX *= _defaultScrollLineHeight!; deltaY *= _defaultScrollLineHeight!; + break; case domDeltaPage: deltaX *= ui.window.physicalSize.width; deltaY *= ui.window.physicalSize.height; + break; case domDeltaPixel: if (operatingSystem == OperatingSystem.macOs && (isSafari || isFirefox)) { // Safari and Firefox seem to report delta in logical pixels while @@ -447,6 +449,7 @@ mixin _WheelEventListenerMixin on _BaseAdapter { deltaX *= ui.window.devicePixelRatio; deltaY *= ui.window.devicePixelRatio; } + break; default: break; } diff --git a/lib/web_ui/lib/src/engine/pointer_converter.dart b/lib/web_ui/lib/src/engine/pointer_converter.dart index 5a04c23fa936e..41c11eb8c7588 100644 --- a/lib/web_ui/lib/src/engine/pointer_converter.dart +++ b/lib/web_ui/lib/src/engine/pointer_converter.dart @@ -281,6 +281,7 @@ class PointerDataConverter { scale: scale, ) ); + break; case ui.PointerChange.hover: final bool alreadyAdded = _pointers.containsKey(device); _ensureStateForPointer(device, physicalX, physicalY); @@ -346,6 +347,7 @@ class PointerDataConverter { ) ); _activeButtons = buttons; + break; case ui.PointerChange.down: final bool alreadyAdded = _pointers.containsKey(device); final _PointerState state = _ensureStateForPointer( @@ -446,6 +448,7 @@ class PointerDataConverter { ) ); _activeButtons = buttons; + break; case ui.PointerChange.move: assert(_pointers.containsKey(device)); assert(isDown); @@ -479,6 +482,7 @@ class PointerDataConverter { ) ); _activeButtons = buttons; + break; case ui.PointerChange.up: case ui.PointerChange.cancel: assert(_pointers.containsKey(device)); @@ -588,6 +592,7 @@ class PointerDataConverter { ); _pointers.remove(device); } + break; case ui.PointerChange.remove: assert(_pointers.containsKey(device)); final _PointerState state = _pointers[device]!; @@ -622,11 +627,13 @@ class PointerDataConverter { ) ); _pointers.remove(device); + break; case ui.PointerChange.panZoomStart: case ui.PointerChange.panZoomUpdate: case ui.PointerChange.panZoomEnd: // Pointer pan/zoom events are not generated on web. assert(false); + break; } } else { switch (signalKind) { @@ -760,8 +767,10 @@ class PointerDataConverter { scale: scale, ) ); + break; case ui.PointerSignalKind.none: assert(false); // This branch should already have 'none' filtered out. + break; case ui.PointerSignalKind.unknown: // Ignore unknown signals. break; diff --git a/lib/web_ui/lib/src/engine/semantics/checkable.dart b/lib/web_ui/lib/src/engine/semantics/checkable.dart index 7ee0a067c9a63..a4c7de151c6f6 100644 --- a/lib/web_ui/lib/src/engine/semantics/checkable.dart +++ b/lib/web_ui/lib/src/engine/semantics/checkable.dart @@ -62,10 +62,13 @@ class Checkable extends RoleManager { switch (_kind) { case _CheckableKind.checkbox: semanticsObject.setAriaRole('checkbox', true); + break; case _CheckableKind.radio: semanticsObject.setAriaRole('radio', true); + break; case _CheckableKind.toggle: semanticsObject.setAriaRole('switch', true); + break; } /// Adding disabled and aria-disabled attribute to notify the assistive @@ -87,10 +90,13 @@ class Checkable extends RoleManager { switch (_kind) { case _CheckableKind.checkbox: semanticsObject.setAriaRole('checkbox', false); + break; case _CheckableKind.radio: semanticsObject.setAriaRole('radio', false); + break; case _CheckableKind.toggle: semanticsObject.setAriaRole('switch', false); + break; } _removeDisabledAttribute(); } diff --git a/lib/web_ui/lib/src/engine/semantics/incrementable.dart b/lib/web_ui/lib/src/engine/semantics/incrementable.dart index 59f43fa2e0fe1..6cfeb6c37f80a 100644 --- a/lib/web_ui/lib/src/engine/semantics/incrementable.dart +++ b/lib/web_ui/lib/src/engine/semantics/incrementable.dart @@ -80,8 +80,10 @@ class Incrementable extends RoleManager { case GestureMode.browserGestures: _enableBrowserGestureHandling(); _updateInputValues(); + break; case GestureMode.pointerEvents: _disableBrowserGestureHandling(); + break; } } diff --git a/lib/web_ui/lib/src/engine/semantics/scrollable.dart b/lib/web_ui/lib/src/engine/semantics/scrollable.dart index 38f07c71e91fb..06910c7baaa76 100644 --- a/lib/web_ui/lib/src/engine/semantics/scrollable.dart +++ b/lib/web_ui/lib/src/engine/semantics/scrollable.dart @@ -209,6 +209,7 @@ class Scrollable extends RoleManager { assert(semanticsObject.isHorizontalScrollContainer); element.style.overflowX = 'scroll'; } + break; case GestureMode.pointerEvents: // We use "hidden" instead of "scroll" so that the browser does // not "steal" pointer events. Flutter gesture recognizers need @@ -219,6 +220,7 @@ class Scrollable extends RoleManager { assert(semanticsObject.isHorizontalScrollContainer); element.style.overflowX = 'hidden'; } + break; } } diff --git a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart index 1e3fffae4d176..f3bdbdddc4f01 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart @@ -327,14 +327,17 @@ class MobileSemanticsEnabler extends SemanticsEnabler { case 'click': final DomMouseEvent click = event as DomMouseEvent; activationPoint = click.offset; + break; case 'touchstart': case 'touchend': final DomTouchEvent touchEvent = event as DomTouchEvent; activationPoint = touchEvent.changedTouches.first.client; + break; case 'pointerdown': case 'pointerup': final DomPointerEvent touch = event as DomPointerEvent; activationPoint = touch.client; + break; default: // The event is not relevant, forward to framework as normal. return true; diff --git a/lib/web_ui/lib/src/engine/semantics/text_field.dart b/lib/web_ui/lib/src/engine/semantics/text_field.dart index abf29dd9d6cfd..52e3d25b6e845 100644 --- a/lib/web_ui/lib/src/engine/semantics/text_field.dart +++ b/lib/web_ui/lib/src/engine/semantics/text_field.dart @@ -286,8 +286,10 @@ class TextField extends RoleManager { case BrowserEngine.blink: case BrowserEngine.firefox: _initializeForBlink(); + break; case BrowserEngine.webkit: _initializeForWebkit(); + break; } } diff --git a/lib/web_ui/lib/src/engine/services/message_codecs.dart b/lib/web_ui/lib/src/engine/services/message_codecs.dart index 9773c6ee3c2dc..e412e4266296e 100644 --- a/lib/web_ui/lib/src/engine/services/message_codecs.dart +++ b/lib/web_ui/lib/src/engine/services/message_codecs.dart @@ -378,14 +378,19 @@ class StandardMessageCodec implements MessageCodec { switch (type) { case _valueNull: result = null; + break; case _valueTrue: result = true; + break; case _valueFalse: result = false; + break; case _valueInt32: result = buffer.getInt32(); + break; case _valueInt64: result = buffer.getInt64(); + break; case _valueLargeInt: // Flutter Engine APIs to use large ints have been deprecated on // 2018-01-09 and will be made unavailable. @@ -393,35 +398,44 @@ class StandardMessageCodec implements MessageCodec { final int length = readSize(buffer); final String hex = utf8.decoder.convert(buffer.getUint8List(length)); result = int.parse(hex, radix: 16); + break; case _valueFloat64: result = buffer.getFloat64(); + break; case _valueString: final int length = readSize(buffer); result = utf8.decoder.convert(buffer.getUint8List(length)); + break; case _valueUint8List: final int length = readSize(buffer); result = buffer.getUint8List(length); + break; case _valueInt32List: final int length = readSize(buffer); result = buffer.getInt32List(length); + break; case _valueInt64List: final int length = readSize(buffer); result = buffer.getInt64List(length); + break; case _valueFloat64List: final int length = readSize(buffer); result = buffer.getFloat64List(length); + break; case _valueList: final int length = readSize(buffer); result = []; for (int i = 0; i < length; i++) { result.add(readValue(buffer)); } + break; case _valueMap: final int length = readSize(buffer); result = {}; for (int i = 0; i < length; i++) { result[readValue(buffer)] = readValue(buffer); } + break; default: throw const FormatException('Message corrupted'); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart index 02a11487bd4f4..d048c10959166 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +library skwasm_impl; export 'skwasm_impl/canvas.dart'; export 'skwasm_impl/image.dart'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart index 382d34840e9f6..32f7960a81fff 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// The web_sdk/sdk_rewriter.dart uses this directive. -// ignore: unnecessary_library_directive library skwasm_stub; export 'skwasm_stub/renderer.dart'; diff --git a/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart b/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart index 4f270b01cb1a9..2321f805a2ad7 100644 --- a/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart +++ b/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart @@ -214,8 +214,10 @@ class CanvasParagraph implements ui.Paragraph { switch (position.affinity) { case ui.TextAffinity.upstream: characterPosition = position.offset - 1; + break; case ui.TextAffinity.downstream: characterPosition = position.offset; + break; } final int start = WordBreaker.prevBreakIndex(plainText, characterPosition + 1); final int end = WordBreaker.nextBreakIndex(plainText, characterPosition); diff --git a/lib/web_ui/lib/src/engine/text/layout_service.dart b/lib/web_ui/lib/src/engine/text/layout_service.dart index ae46ae685689f..d8360440520a3 100644 --- a/lib/web_ui/lib/src/engine/text/layout_service.dart +++ b/lib/web_ui/lib/src/engine/text/layout_service.dart @@ -210,6 +210,7 @@ class TextLayoutService { case LineBreakType.opportunity: minIntrinsicWidth = math.max(minIntrinsicWidth, runningMinIntrinsicWidth); runningMinIntrinsicWidth = 0; + break; case LineBreakType.mandatory: case LineBreakType.endOfText: @@ -217,6 +218,7 @@ class TextLayoutService { maxIntrinsicWidth = math.max(maxIntrinsicWidth, runningMaxIntrinsicWidth); runningMinIntrinsicWidth = 0; runningMaxIntrinsicWidth = 0; + break; } } } @@ -638,12 +640,14 @@ class LineBuilder { // `descent` enough to fit the placeholder. ascent = this.ascent; descent = placeholder.height - this.ascent; + break; case ui.PlaceholderAlignment.bottom: // The opposite of `top`. The `descent` is the same, but we extend the // `ascent`. ascent = placeholder.height - this.descent; descent = this.descent; + break; case ui.PlaceholderAlignment.middle: final double textMidPoint = height / 2; @@ -651,18 +655,22 @@ class LineBuilder { final double diff = placeholderMidPoint - textMidPoint; ascent = this.ascent + diff; descent = this.descent + diff; + break; case ui.PlaceholderAlignment.aboveBaseline: ascent = placeholder.height; descent = 0.0; + break; case ui.PlaceholderAlignment.belowBaseline: ascent = 0.0; descent = placeholder.height; + break; case ui.PlaceholderAlignment.baseline: ascent = placeholder.baselineOffset; descent = placeholder.height - ascent; + break; } // Update the metrics of the fragment to reflect the calculated ascent and diff --git a/lib/web_ui/lib/src/engine/text/unicode_range.dart b/lib/web_ui/lib/src/engine/text/unicode_range.dart index d612efb80a322..558c83f7822db 100644 --- a/lib/web_ui/lib/src/engine/text/unicode_range.dart +++ b/lib/web_ui/lib/src/engine/text/unicode_range.dart @@ -170,8 +170,10 @@ class UnicodePropertyLookup

{ switch (range.compare(value)) { case _ComparisonResult.higher: min = mid + 1; + break; case _ComparisonResult.lower: max = mid; + break; case _ComparisonResult.inside: return mid; } diff --git a/lib/web_ui/lib/src/engine/text/word_breaker.dart b/lib/web_ui/lib/src/engine/text/word_breaker.dart index 55a395cbad545..a3e46c81a2ab6 100644 --- a/lib/web_ui/lib/src/engine/text/word_breaker.dart +++ b/lib/web_ui/lib/src/engine/text/word_breaker.dart @@ -5,12 +5,12 @@ import '../util.dart'; import 'word_break_properties.dart'; -enum _FindBreakDirection { - forward(step: 1), - backward(step: -1); - +class _FindBreakDirection { const _FindBreakDirection({required this.step}); + static const _FindBreakDirection forward = _FindBreakDirection(step: 1); + static const _FindBreakDirection backward = _FindBreakDirection(step: -1); + final int step; } diff --git a/lib/web_ui/lib/src/engine/text_editing/text_capitalization.dart b/lib/web_ui/lib/src/engine/text_editing/text_capitalization.dart index 865725f0bedb4..b871b737d7e7f 100644 --- a/lib/web_ui/lib/src/engine/text_editing/text_capitalization.dart +++ b/lib/web_ui/lib/src/engine/text_editing/text_capitalization.dart @@ -69,10 +69,13 @@ class TextCapitalizationConfig { } else { autocapitalize = 'words'; } + break; case TextCapitalization.characters: autocapitalize = 'characters'; + break; case TextCapitalization.sentences: autocapitalize = 'sentences'; + break; case TextCapitalization.none: default: autocapitalize = 'off'; diff --git a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart index 94e66d8b6e698..46447963a78e4 100644 --- a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart +++ b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart @@ -2048,6 +2048,7 @@ class TextEditingChannel { clientId: call.arguments[0] as int, configuration: InputConfiguration.fromFrameworkMessage(call.arguments[1] as Map), ); + break; case 'TextInput.updateConfig': // Set configuration eagerly because it contains data about the text @@ -2057,6 +2058,7 @@ class TextEditingChannel { call.arguments as Map ); command = const TextInputUpdateConfig(); + break; case 'TextInput.setEditingState': command = TextInputSetEditingState( @@ -2064,9 +2066,11 @@ class TextEditingChannel { call.arguments as Map ), ); + break; case 'TextInput.show': command = const TextInputShow(); + break; case 'TextInput.setEditableSizeAndTransform': command = TextInputSetEditableSizeAndTransform( @@ -2074,6 +2078,7 @@ class TextEditingChannel { call.arguments as Map ), ); + break; case 'TextInput.setStyle': command = TextInputSetStyle( @@ -2081,29 +2086,36 @@ class TextEditingChannel { call.arguments as Map, ), ); + break; case 'TextInput.clearClient': command = const TextInputClearClient(); + break; case 'TextInput.hide': command = const TextInputHide(); + break; case 'TextInput.requestAutofill': // There's no API to request autofill on the web. Instead we let the // browser show autofill options automatically, if available. We // therefore simply ignore this message. command = const TextInputRequestAutofill(); + break; case 'TextInput.finishAutofillContext': command = TextInputFinishAutofillContext( saveForm: call.arguments as bool, ); + break; case 'TextInput.setMarkedTextRect': command = const TextInputSetMarkedTextRect(); + break; case 'TextInput.setCaretRect': command = const TextInputSetCaretRect(); + break; default: EnginePlatformDispatcher.instance.replyToPlatformMessage(callback, null); diff --git a/lib/web_ui/lib/src/engine/util.dart b/lib/web_ui/lib/src/engine/util.dart index 612c03dbe8637..9400936386b7a 100644 --- a/lib/web_ui/lib/src/engine/util.dart +++ b/lib/web_ui/lib/src/engine/util.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +library util; import 'dart:async'; import 'dart:math' as math; diff --git a/lib/web_ui/test/canvaskit/semantics_test.dart b/lib/web_ui/test/canvaskit/semantics_test.dart index 4c36e25ff3f3a..7df21aeeaac19 100644 --- a/lib/web_ui/test/canvaskit/semantics_test.dart +++ b/lib/web_ui/test/canvaskit/semantics_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('chrome || safari || firefox') -library; import 'dart:async'; diff --git a/lib/web_ui/test/channel_buffers_test.dart b/lib/web_ui/test/channel_buffers_test.dart index bd72acab10978..b88af28d3ab43 100644 --- a/lib/web_ui/test/channel_buffers_test.dart +++ b/lib/web_ui/test/channel_buffers_test.dart @@ -126,10 +126,13 @@ void testMain() { switch (counter) { case 0: expect(drainedData, equals(two)); + break; case 1: expect(drainedData, equals(three)); + break; case 2: expect(drainedData, equals(four)); + break; } counter += 1; return Future.value(); diff --git a/lib/web_ui/test/engine/app_bootstrap_test.dart b/lib/web_ui/test/engine/app_bootstrap_test.dart index 609c569883bb6..76d7da58c2422 100644 --- a/lib/web_ui/test/engine/app_bootstrap_test.dart +++ b/lib/web_ui/test/engine/app_bootstrap_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'dart:js_util'; diff --git a/lib/web_ui/test/engine/configuration_test.dart b/lib/web_ui/test/engine/configuration_test.dart index a868ca2088ab4..33aaa35e381c2 100644 --- a/lib/web_ui/test/engine/configuration_test.dart +++ b/lib/web_ui/test/engine/configuration_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'package:js/js_util.dart' as js_util; diff --git a/lib/web_ui/test/engine/history_test.dart b/lib/web_ui/test/engine/history_test.dart index 28226ad201ba6..2995efe8d09ab 100644 --- a/lib/web_ui/test/engine/history_test.dart +++ b/lib/web_ui/test/engine/history_test.dart @@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// TODO(mdebbar): https://github.com/flutter/flutter/issues/51169 @TestOn('!safari') -library; +// TODO(mdebbar): https://github.com/flutter/flutter/issues/51169 import 'dart:async'; diff --git a/lib/web_ui/test/engine/semantics/semantics_api_test.dart b/lib/web_ui/test/engine/semantics/semantics_api_test.dart index d53c7263ef65d..5a457eff1aef3 100644 --- a/lib/web_ui/test/engine/semantics/semantics_api_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_api_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('chrome || safari || firefox') -library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index e773cb33dcef3..6e2bda120fb2e 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('chrome || safari || firefox') -library; import 'dart:async'; import 'dart:typed_data'; diff --git a/lib/web_ui/test/engine/semantics/text_field_test.dart b/lib/web_ui/test/engine/semantics/text_field_test.dart index b9ffec7f64067..73e28a6948b82 100644 --- a/lib/web_ui/test/engine/semantics/text_field_test.dart +++ b/lib/web_ui/test/engine/semantics/text_field_test.dart @@ -3,8 +3,6 @@ // found in the LICENSE file. @TestOn('chrome || safari || firefox') -library; - import 'dart:typed_data'; import 'package:test/bootstrap/browser.dart'; diff --git a/lib/web_ui/test/engine/surface/path/path_winding_test.dart b/lib/web_ui/test/engine/surface/path/path_winding_test.dart index 2d4f1692d931d..6c1dc06169a11 100644 --- a/lib/web_ui/test/engine/surface/path/path_winding_test.dart +++ b/lib/web_ui/test/engine/surface/path/path_winding_test.dart @@ -113,15 +113,19 @@ void testMain() { switch (index % 13) { case 0: path.lineTo(nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 1: path.quadraticBezierTo(nonFinitePts[i].dx, nonFinitePts[i].dy, nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 2: path.quadraticBezierTo(nonFinitePts[i].dx, nonFinitePts[i].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 3: path.quadraticBezierTo(axisAlignedPts[f].dx, axisAlignedPts[f].dy, nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 4: path.cubicTo( nonFinitePts[i].dx, @@ -130,6 +134,7 @@ void testMain() { axisAlignedPts[f].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 5: path.cubicTo( axisAlignedPts[f].dx, @@ -138,6 +143,7 @@ void testMain() { nonFinitePts[i].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 6: path.cubicTo( axisAlignedPts[f].dx, @@ -146,6 +152,7 @@ void testMain() { axisAlignedPts[f].dy, nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 7: path.cubicTo( nonFinitePts[i].dx, @@ -154,6 +161,7 @@ void testMain() { nonFinitePts[i].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 8: path.cubicTo( nonFinitePts[i].dx, @@ -162,6 +170,7 @@ void testMain() { axisAlignedPts[f].dy, nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 9: path.cubicTo( axisAlignedPts[f].dx, @@ -170,6 +179,7 @@ void testMain() { nonFinitePts[i].dy, nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 10: path.cubicTo( nonFinitePts[i].dx, @@ -178,6 +188,7 @@ void testMain() { nonFinitePts[i].dy, nonFinitePts[i].dx, nonFinitePts[i].dy); + break; case 11: path.cubicTo( nonFinitePts[i].dx, @@ -186,8 +197,10 @@ void testMain() { axisAlignedPts[f].dy, axisAlignedPts[g].dx, axisAlignedPts[g].dy); + break; case 12: path.moveTo(nonFinitePts[i].dx, nonFinitePts[i].dy); + break; } expect(path.convexityType, SPathConvexityType.kUnknown); } @@ -200,17 +213,22 @@ void testMain() { switch (curveSelect) { case 0: path.moveTo(axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 1: path.lineTo(axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 2: path.quadraticBezierTo(axisAlignedPts[f].dx, axisAlignedPts[f].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 3: path.quadraticBezierTo(axisAlignedPts[f].dx, axisAlignedPts[f].dy, axisAlignedPts[g].dx, axisAlignedPts[g].dy); + break; case 4: path.quadraticBezierTo(axisAlignedPts[g].dx, axisAlignedPts[g].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 5: path.cubicTo( axisAlignedPts[f].dx, @@ -219,6 +237,7 @@ void testMain() { axisAlignedPts[f].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 6: path.cubicTo( axisAlignedPts[f].dx, @@ -227,6 +246,7 @@ void testMain() { axisAlignedPts[f].dy, axisAlignedPts[g].dx, axisAlignedPts[g].dy); + break; case 7: path.cubicTo( axisAlignedPts[f].dx, @@ -235,6 +255,7 @@ void testMain() { axisAlignedPts[g].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 8: path.cubicTo( axisAlignedPts[f].dx, @@ -243,6 +264,7 @@ void testMain() { axisAlignedPts[g].dy, axisAlignedPts[g].dx, axisAlignedPts[g].dy); + break; case 9: path.cubicTo( axisAlignedPts[g].dx, @@ -251,6 +273,7 @@ void testMain() { axisAlignedPts[f].dy, axisAlignedPts[f].dx, axisAlignedPts[f].dy); + break; case 10: path.cubicTo( axisAlignedPts[g].dx, @@ -259,6 +282,7 @@ void testMain() { axisAlignedPts[f].dy, axisAlignedPts[g].dx, axisAlignedPts[g].dy); + break; } if (curveSelect != 7 && curveSelect != 10) { final int result = path.convexityType; diff --git a/lib/web_ui/test/engine/surface/scene_builder_test.dart b/lib/web_ui/test/engine/surface/scene_builder_test.dart index 836ee056576f8..eddb3dce5e61c 100644 --- a/lib/web_ui/test/engine/surface/scene_builder_test.dart +++ b/lib/web_ui/test/engine/surface/scene_builder_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('chrome || firefox') -library; import 'dart:async'; import 'dart:js_interop'; diff --git a/lib/web_ui/test/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider_test.dart b/lib/web_ui/test/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider_test.dart index 1b8da9e97dd7a..71c17fef08fa9 100644 --- a/lib/web_ui/test/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider_test.dart +++ b/lib/web_ui/test/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'dart:async'; diff --git a/lib/web_ui/test/engine/view_embedder/dimensions_provider/dimensions_provider_test.dart b/lib/web_ui/test/engine/view_embedder/dimensions_provider/dimensions_provider_test.dart index bb57e2a1c93b1..8edfe33233d51 100644 --- a/lib/web_ui/test/engine/view_embedder/dimensions_provider/dimensions_provider_test.dart +++ b/lib/web_ui/test/engine/view_embedder/dimensions_provider/dimensions_provider_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; diff --git a/lib/web_ui/test/engine/view_embedder/dimensions_provider/full_page_dimensions_provider_test.dart b/lib/web_ui/test/engine/view_embedder/dimensions_provider/full_page_dimensions_provider_test.dart index 739f9b2663279..d6760e57853c9 100644 --- a/lib/web_ui/test/engine/view_embedder/dimensions_provider/full_page_dimensions_provider_test.dart +++ b/lib/web_ui/test/engine/view_embedder/dimensions_provider/full_page_dimensions_provider_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'dart:async'; diff --git a/lib/web_ui/test/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy_test.dart b/lib/web_ui/test/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy_test.dart index 850a2a66a2376..62dc4de5b09c4 100644 --- a/lib/web_ui/test/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy_test.dart +++ b/lib/web_ui/test/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; diff --git a/lib/web_ui/test/engine/view_embedder/embedding_strategy/embedding_strategy_test.dart b/lib/web_ui/test/engine/view_embedder/embedding_strategy/embedding_strategy_test.dart index f13cf67c4cb4b..4aaab90e44615 100644 --- a/lib/web_ui/test/engine/view_embedder/embedding_strategy/embedding_strategy_test.dart +++ b/lib/web_ui/test/engine/view_embedder/embedding_strategy/embedding_strategy_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; diff --git a/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart b/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart index 70f2fbd1e92bd..1c62be92165ef 100644 --- a/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart +++ b/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; diff --git a/lib/web_ui/test/engine/view_embedder/hot_restart_cache_handler_test.dart b/lib/web_ui/test/engine/view_embedder/hot_restart_cache_handler_test.dart index 7525b571d9acc..939c8027510cd 100644 --- a/lib/web_ui/test/engine/view_embedder/hot_restart_cache_handler_test.dart +++ b/lib/web_ui/test/engine/view_embedder/hot_restart_cache_handler_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('browser') -library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; diff --git a/lib/web_ui/test/matchers.dart b/lib/web_ui/test/matchers.dart index a2bd9fe66102a..df6124d0790d5 100644 --- a/lib/web_ui/test/matchers.dart +++ b/lib/web_ui/test/matchers.dart @@ -255,38 +255,53 @@ String canonicalizeHtml( switch (replacementTag) { case 'flt-scene': replacementTag = 's'; + break; case 'flt-transform': replacementTag = 't'; + break; case 'flt-opacity': replacementTag = 'o'; + break; case 'flt-clip': final String? clipType = original.attributes['clip-type']; switch (clipType) { case 'rect': replacementTag = 'clip'; + break; case 'rrect': replacementTag = 'rclip'; + break; case 'physical-shape': replacementTag = 'pshape'; + break; default: throw Exception('Unknown clip type: $clipType'); } + break; case 'flt-clip-interior': replacementTag = 'clip-i'; + break; case 'flt-picture': replacementTag = 'pic'; + break; case 'flt-canvas': replacementTag = 'c'; + break; case 'flt-dom-canvas': replacementTag = 'd'; + break; case 'flt-semantics': replacementTag = 'sem'; + break; case 'flt-semantics-container': replacementTag = 'sem-c'; + break; case 'flt-semantics-img': replacementTag = 'sem-img'; + break; case 'flt-semantics-text-field': replacementTag = 'sem-tf'; + break; } final html_package.Element replacement = diff --git a/lib/web_ui/test/skwasm/smoke_test.dart b/lib/web_ui/test/skwasm/smoke_test.dart index 55f7e5aa5379d..103af64316d40 100644 --- a/lib/web_ui/test/skwasm/smoke_test.dart +++ b/lib/web_ui/test/skwasm/smoke_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. @TestOn('chrome || safari || firefox') -library; import 'dart:async'; diff --git a/testing/dart/channel_buffers_test.dart b/testing/dart/channel_buffers_test.dart index 4a17705b74c31..4683a62254d77 100644 --- a/testing/dart/channel_buffers_test.dart +++ b/testing/dart/channel_buffers_test.dart @@ -111,10 +111,13 @@ void main() { switch (counter) { case 0: expect(drainedData, equals(two)); + break; case 1: expect(drainedData, equals(three)); + break; case 2: expect(drainedData, equals(four)); + break; } counter += 1; }); diff --git a/testing/dart/isolate_name_server_test.dart b/testing/dart/isolate_name_server_test.dart index 58005227699ad..b805e814a573a 100644 --- a/testing/dart/isolate_name_server_test.dart +++ b/testing/dart/isolate_name_server_test.dart @@ -110,10 +110,12 @@ void main() { break; case kCloseCode: receivePort.close(); + break; case kDeletedCode: expect(IsolateNameServer.lookupPortByName(portName), isNull); // Test is done, close the last ReceivePort. testReceivePort.close(); + break; case kErrorCode: throw message; default: diff --git a/testing/scenario_app/lib/main.dart b/testing/scenario_app/lib/main.dart index d45760c62d9c9..f7a9e61fd156c 100644 --- a/testing/scenario_app/lib/main.dart +++ b/testing/scenario_app/lib/main.dart @@ -38,6 +38,7 @@ void _handleDriverMessage(Map call) { case 'set_scenario': assert(call['args'] != null); loadScenario(call['args'] as Map, _view); + break; default: throw 'Unimplemented method: $methodName.'; } @@ -54,9 +55,11 @@ Future _handlePlatformMessage( switch (name) { case 'driver': _handleDriverMessage(json.decode(utf8.decode(data!.buffer.asUint8List())) as Map); + break; case 'write_timeline': final String timelineData = await _getTimelineData(); callback!(Uint8List.fromList(utf8.encode(timelineData)).buffer.asByteData()); + break; default: currentScenario?.onPlatformMessage(name, data, callback); } diff --git a/tools/clang_tidy/lib/clang_tidy.dart b/tools/clang_tidy/lib/clang_tidy.dart index 6fcbeb29d6e86..4a49f9b591f96 100644 --- a/tools/clang_tidy/lib/clang_tidy.dart +++ b/tools/clang_tidy/lib/clang_tidy.dart @@ -299,19 +299,24 @@ class ClangTidy { switch (action) { case LintAction.skipNoLint: _outSink.writeln('🔷 ignoring $relativePath (FLUTTER_NOLINT)'); + break; case LintAction.failMalformedNoLint: _errSink.writeln('❌ malformed opt-out $relativePath'); _errSink.writeln( ' Required format: // FLUTTER_NOLINT: $issueUrlPrefix/ISSUE_ID', ); sawMalformed = true; + break; case LintAction.lint: _outSink.writeln('🔶 linting $relativePath'); jobs.add(command.createLintJob(options)); + break; case LintAction.skipThirdParty: _outSink.writeln('🔷 ignoring $relativePath (third_party)'); + break; case LintAction.skipMissing: _outSink.writeln('🔷 ignoring $relativePath (missing)'); + break; } } return _ComputeJobsResult(jobs, sawMalformed); diff --git a/tools/licenses/lib/filesystem.dart b/tools/licenses/lib/filesystem.dart index 071ad10b578db..70a64535ab045 100644 --- a/tools/licenses/lib/filesystem.dart +++ b/tools/licenses/lib/filesystem.dart @@ -524,13 +524,13 @@ class FileSystemDirectory extends IoNode implements Directory { final io.File fileEntity = entity as io.File; if (fileEntity.lengthSync() > 0) { switch (identifyFile(fileEntity.path, () => _readBytes(fileEntity))) { - case FileType.binary: yield FileSystemFile(fileEntity); - case FileType.zip: yield FileSystemZipFile(fileEntity); - case FileType.tar: yield FileSystemTarFile(fileEntity); - case FileType.gz: yield FileSystemGZipFile(fileEntity); - case FileType.bzip2: yield FileSystemBZip2File(fileEntity); - case FileType.text: yield FileSystemUTF8TextFile(fileEntity); - case FileType.latin1Text: yield FileSystemLatin1TextFile(fileEntity); + case FileType.binary: yield FileSystemFile(fileEntity); break; + case FileType.zip: yield FileSystemZipFile(fileEntity); break; + case FileType.tar: yield FileSystemTarFile(fileEntity); break; + case FileType.gz: yield FileSystemGZipFile(fileEntity); break; + case FileType.bzip2: yield FileSystemBZip2File(fileEntity); break; + case FileType.text: yield FileSystemUTF8TextFile(fileEntity); break; + case FileType.latin1Text: yield FileSystemLatin1TextFile(fileEntity); break; case FileType.notPartOfBuild: break; // ignore this file } } @@ -618,13 +618,13 @@ class ArchiveDirectory extends IoNode implements Directory { if (entry.size > 0) { final String entryFullName = '$fullName/${path.basename(entry.name)}'; switch (identifyFile(entry.name, () => entry.content as List)) { - case FileType.binary: _files.add(ArchiveFile(entryFullName, entry)); - case FileType.zip: _files.add(ArchiveZipFile(entryFullName, entry)); - case FileType.tar: _files.add(ArchiveTarFile(entryFullName, entry)); - case FileType.gz: _files.add(ArchiveGZipFile(entryFullName, entry)); - case FileType.bzip2: _files.add(ArchiveBZip2File(entryFullName, entry)); - case FileType.text: _files.add(ArchiveUTF8TextFile(entryFullName, entry)); - case FileType.latin1Text: _files.add(ArchiveLatin1TextFile(entryFullName, entry)); + case FileType.binary: _files.add(ArchiveFile(entryFullName, entry)); break; + case FileType.zip: _files.add(ArchiveZipFile(entryFullName, entry)); break; + case FileType.tar: _files.add(ArchiveTarFile(entryFullName, entry)); break; + case FileType.gz: _files.add(ArchiveGZipFile(entryFullName, entry)); break; + case FileType.bzip2: _files.add(ArchiveBZip2File(entryFullName, entry)); break; + case FileType.text: _files.add(ArchiveUTF8TextFile(entryFullName, entry)); break; + case FileType.latin1Text: _files.add(ArchiveLatin1TextFile(entryFullName, entry)); break; case FileType.notPartOfBuild: break; // ignore this file } } diff --git a/tools/licenses/lib/licenses.dart b/tools/licenses/lib/licenses.dart index 17811a0471f62..086fdd44d4f14 100644 --- a/tools/licenses/lib/licenses.dart +++ b/tools/licenses/lib/licenses.dart @@ -344,6 +344,7 @@ abstract class License { case LicenseType.bsd: case LicenseType.mit: result = TemplateLicense._autosplit(body, type, origin: origin); + break; case LicenseType.apache: case LicenseType.freetype: case LicenseType.ijg: @@ -355,15 +356,19 @@ abstract class License { case LicenseType.vulkan: case LicenseType.zlib: result = MessageLicense._(body, type, origin: origin); + break; case LicenseType.apacheNotice: result = UniqueLicense._(body, type, origin: origin); + break; case LicenseType.mpl: result = MozillaLicense._(body, type, origin: origin); + break; // The exception in the license of Bison allows redistributing larger // works "under terms of your choice"; we choose terms that don't require // any notice in the binary distribution. case LicenseType.bison: result = BlankLicense._(body, type, origin: origin); + break; case LicenseType.icu: case LicenseType.openssl: throw 'Use License.fromMultipleBlocks rather than License.fromBodyAndType for the ICU and OpenSSL licenses.'; @@ -373,6 +378,7 @@ abstract class License { case LicenseType.gpl: case LicenseType.lgpl: result = DisallowedLicense._(body, type, origin: origin); + break; case LicenseType.defaultTemplate: throw 'should not be creating a LicenseType.defaultTemplate license, it is not a real type'; } @@ -417,49 +423,62 @@ abstract class License { // https://github.com/abseil/abseil-cpp/pull/270/files#r793181143 body = system.File('data/apache-license-2.0').readAsStringSync(); type = LicenseType.apache; + break; case 'Apache-2.0 WITH LLVM-exception': // SPDX ID case 'https://llvm.org/LICENSE.txt': body = system.File('data/apache-license-2.0-with-llvm-exception').readAsStringSync(); type = LicenseType.llvm; + break; case 'https://developers.google.com/open-source/licenses/bsd': body = system.File('data/google-bsd').readAsStringSync(); type = LicenseType.bsd; + break; case 'http://polymer.github.io/LICENSE.txt': body = system.File('data/polymer-bsd').readAsStringSync(); type = LicenseType.bsd; + break; case 'http://www.eclipse.org/legal/epl-v10.html': body = system.File('data/eclipse-1.0').readAsStringSync(); type = LicenseType.eclipse; + break; case 'COPYING3:3': body = system.File('data/gpl-3.0').readAsStringSync(); type = LicenseType.gpl; + break; case 'COPYING.LIB:2': case 'COPYING.LIother.m_:2': // blame hyatt body = system.File('data/library-gpl-2.0').readAsStringSync(); type = LicenseType.lgpl; + break; case 'GNU Lesser:2': // there has never been such a license, but the authors said they meant the LGPL2.1 case 'GNU Lesser:2.1': body = system.File('data/lesser-gpl-2.1').readAsStringSync(); type = LicenseType.lgpl; + break; case 'COPYING.RUNTIME:3.1': case 'GCC Runtime Library Exception:3.1': body = system.File('data/gpl-gcc-exception-3.1').readAsStringSync(); + break; case 'Academic Free License:3.0': body = system.File('data/academic-3.0').readAsStringSync(); type = LicenseType.afl; + break; case 'Mozilla Public License:1.1': body = system.File('data/mozilla-1.1').readAsStringSync(); type = LicenseType.mpl; + break; case 'http://mozilla.org/MPL/2.0/:2.0': body = system.File('data/mozilla-2.0').readAsStringSync(); type = LicenseType.mpl; + break; case 'MIT': // SPDX ID case 'http://opensource->org/licenses/MIT': // i don't even case 'http://opensource.org/licenses/MIT': case 'https://opensource.org/licenses/MIT': body = system.File('data/mit').readAsStringSync(); type = LicenseType.mit; + break; case 'Unicode-DFS-2016': // SPDX ID case 'http://unicode.org/copyright.html#Exhibit1': case 'http://www.unicode.org/copyright.html#License': @@ -469,9 +488,11 @@ abstract class License { case 'https://www.unicode.org/terms_of_use.html': // redirects to copyright.html body = system.File('data/unicode').readAsStringSync(); type = LicenseType.unicode; + break; case 'http://www.ietf.org/rfc/rfc3454.txt': body = system.File('data/ietf').readAsStringSync(); type = LicenseType.ietf; + break; default: throw 'unknown identifyingReference $identifyingReference'; } return License.fromBodyAndType(body, type, origin: '$identifyingReference referenced by $referencer'); @@ -492,6 +513,7 @@ abstract class License { case LicenseType.lgpl: // We do not want this kind of license in our build. assert(this is DisallowedLicense); + break; case LicenseType.apache: case LicenseType.freetype: case LicenseType.ijg: @@ -502,22 +524,30 @@ abstract class License { case LicenseType.vulkan: case LicenseType.zlib: assert(this is MessageLicense); + break; case LicenseType.apacheNotice: assert(this is UniqueLicense); + break; case LicenseType.bison: assert(this is BlankLicense); + break; case LicenseType.bsd: case LicenseType.mit: assert(this is TemplateLicense); + break; case LicenseType.icu: case LicenseType.openssl: assert(this is MultiLicense); + break; case LicenseType.mpl: assert(this is MozillaLicense); + break; case LicenseType.unknown: assert(this is MessageLicense || this is UniqueLicense); + break; case LicenseType.defaultTemplate: assert(false, 'should not be creating LicenseType.defaultTemplate license'); + break; } } on AssertionError { throw 'incorrectly created a $runtimeType for a $type'; diff --git a/tools/path_ops/dart/lib/path_ops.dart b/tools/path_ops/dart/lib/path_ops.dart index d0736884e057f..6f6d507449361 100644 --- a/tools/path_ops/dart/lib/path_ops.dart +++ b/tools/path_ops/dart/lib/path_ops.dart @@ -171,12 +171,16 @@ class Path implements PathProxy { switch (verb) { case PathVerb.moveTo: proxy.moveTo(points[index++], points[index++]); + break; case PathVerb.lineTo: proxy.lineTo(points[index++], points[index++]); + break; case PathVerb._quadTo: assert(false); + break; case PathVerb._conicTo: assert(false); + break; case PathVerb.cubicTo: proxy.cubicTo( points[index++], @@ -186,8 +190,10 @@ class Path implements PathProxy { points[index++], points[index++], ); + break; case PathVerb.close: proxy.close(); + break; } } assert(index == points.length); diff --git a/web_sdk/test/js_access_test.dart b/web_sdk/test/js_access_test.dart index 73125698682ec..985ab28e3180d 100644 --- a/web_sdk/test/js_access_test.dart +++ b/web_sdk/test/js_access_test.dart @@ -4,13 +4,13 @@ // ignore_for_file: avoid_print -// Checks that JavaScript API is accessed properly. -// -// JavaScript access needs to be audited to make sure it follows security best -// practices. To do that, all JavaScript access is consolidated into a small -// number of libraries that change infrequently. These libraries are manually -// audited on every change. All other code accesses JavaScript through these -// libraries and does not require audit. +/// Checks that JavaScript API is accessed properly. +/// +/// JavaScript access needs to be audited to make sure it follows security best +/// practices. To do that, all JavaScript access is consolidated into a small +/// number of libraries that change infrequently. These libraries are manually +/// audited on every change. All other code accesses JavaScript through these +/// libraries and does not require audit. import 'dart:io';