diff --git a/engine/src/flutter/lib/web_ui/dev/steps/copy_artifacts_step.dart b/engine/src/flutter/lib/web_ui/dev/steps/copy_artifacts_step.dart index f6447ce6ac..9537110afc 100644 --- a/engine/src/flutter/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/engine/src/flutter/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -104,19 +104,21 @@ class CopyArtifactsStep implements PipelineStep { await copyTestFonts(); await copySkiaTestImages(); await copyFlutterJsFiles(flutterJsSourceDirectory); + final copied = []; if (artifactDeps.canvasKit) { - print('Copying CanvasKit...'); + copied.add('CanvasKit'); await copyWasmLibrary('canvaskit', canvaskitSourceDirectory, 'canvaskit'); } if (artifactDeps.canvasKitChromium) { - print('Copying CanvasKit (Chromium)...'); + copied.add('CanvasKit (Chromium)'); await copyWasmLibrary('canvaskit', canvaskitChromiumSourceDirectory, 'canvaskit/chromium'); } if (artifactDeps.skwasm) { - print('Copying Skwasm...'); + copied.add('Skwasm'); await copyWasmLibrary('skwasm', skwasmSourceDirectory, 'canvaskit'); await copyWasmLibrary('skwasm_st', skwasmStSourceDirectory, 'canvaskit'); } + print('Copied artifacts: ${copied.join(', ')}'); } Future copyTestFonts() async { diff --git a/engine/src/flutter/lib/web_ui/dev/steps/run_suite_step.dart b/engine/src/flutter/lib/web_ui/dev/steps/run_suite_step.dart index 7eda336f1a..1cc01ea114 100644 --- a/engine/src/flutter/lib/web_ui/dev/steps/run_suite_step.dart +++ b/engine/src/flutter/lib/web_ui/dev/steps/run_suite_step.dart @@ -173,15 +173,15 @@ class RunSuiteStep implements PipelineStep { Future _createSkiaClient() async { if (suite.testBundle.compileConfigs.length > 1) { - print('Not creating skia client due to multiple compile configs'); // Multiple compile configs are only used for our fallback tests, which // do not collect goldens. + print('Did not create SkiaGoldClient. Reason: Multiple compile configs.'); return null; } if (suite.runConfig.browser == BrowserName.safari) { - print('Not creating skia client for Safari'); // Goldens from Safari produce too many diffs, disabled for now. // See https://github.com/flutter/flutter/issues/143591 + print('Did not create SkiaGoldClient. Reason: Safari browser.'); return null; } final Renderer renderer = suite.testBundle.compileConfigs.first.renderer; @@ -204,14 +204,15 @@ class RunSuiteStep implements PipelineStep { 'Renderer': rendererName, if (variant != null) 'CanvasKitVariant': variant.name, }; - print('Created Skia Gold Client. dimensions: $dimensions'); final SkiaGoldClient skiaClient = SkiaGoldClient(workDirectory, dimensions: dimensions); - if (await _checkSkiaClient(skiaClient)) { - print('Successfully checked Skia Gold Client'); + final (success, reason) = await _checkSkiaClient(skiaClient); + if (success) { + print('Created SkiaGoldClient. Dimensions: $dimensions'); return skiaClient; } + print('Did not create SkiaGoldClient. Reason: $reason.'); if (requireSkiaGold) { throw ToolExit('Skia Gold is required but is unavailable.'); } @@ -220,13 +221,13 @@ class RunSuiteStep implements PipelineStep { } /// Checks whether the Skia Client is usable in this environment. - Future _checkSkiaClient(SkiaGoldClient skiaClient) async { + Future<(bool, String?)> _checkSkiaClient(SkiaGoldClient skiaClient) async { // Now let's check whether Skia Gold is reachable or not. if (isLuci) { if (SkiaGoldClient.isAvailable()) { try { await skiaClient.auth(); - return true; + return (true, null); } catch (e) { print(e); } @@ -235,14 +236,14 @@ class RunSuiteStep implements PipelineStep { try { // Check if we can reach Gold. await skiaClient.getExpectationForTest(''); - return true; + return (true, null); } on io.OSError catch (_) { - print('OSError occurred, could not reach Gold.'); + return (false, 'OSError occurred, could not reach Gold'); } on io.SocketException catch (_) { - print('SocketException occurred, could not reach Gold.'); + return (false, 'SocketException occurred, could not reach Gold'); } } - return false; + return (false, 'Unknown'); } } diff --git a/engine/src/flutter/lib/web_ui/lib/channel_buffers.dart b/engine/src/flutter/lib/web_ui/lib/channel_buffers.dart index 0bc4857c6b..84071acf69 100644 --- a/engine/src/flutter/lib/web_ui/lib/channel_buffers.dart +++ b/engine/src/flutter/lib/web_ui/lib/channel_buffers.dart @@ -135,7 +135,7 @@ class ChannelBuffers { final _Channel channel = _channels.putIfAbsent(name, () => _Channel()); if (channel.push(_StoredMessage(data, callback))) { assert(() { - print( + engine.printWarning( 'A message on the $name channel was discarded before it could be handled.\n' 'This happens when a plugin sends messages to the framework side before the ' 'framework has had an opportunity to register a listener. See the ChannelBuffers ' diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart index 82e14741c7..232a466537 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'package:ui/src/engine/dom.dart'; -import 'package:ui/src/engine/util.dart' show setElementStyle; +import 'package:ui/src/engine/util.dart'; import '../hot_restart_cache_handler.dart' show registerElementForCleanup; import 'embedding_strategy.dart'; @@ -70,10 +70,9 @@ class FullPageEmbeddingStrategy implements EmbeddingStrategy { // to avoid UI flicker during hot restart. Hot restart will clean up the // old meta tag synchronously with the first post-restart frame. if (!viewportMeta.hasAttribute('flt-viewport')) { - print( - 'WARNING: found an existing tag. Flutter ' - 'Web uses its own viewport configuration for better compatibility ' - 'with Flutter. This tag will be replaced.', + printWarning( + 'Found an existing tag. Flutter Web uses its own viewport ' + 'configuration for better compatibility with Flutter. This tag will be replaced.', ); } return true; diff --git a/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_tt_on_test.dart b/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_tt_on_test.dart index 0819442e8a..2575754914 100644 --- a/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_tt_on_test.dart +++ b/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_tt_on_test.dart @@ -54,7 +54,6 @@ void testMainWithTTOn() { /// Enables Trusted Types by setting the appropriate meta tag in the DOM: /// void enableTrustedTypes() { - print('Enabling TrustedTypes in browser window...'); final DomHTMLMetaElement enableTTMeta = createDomHTMLMetaElement() ..setAttribute('http-equiv', 'Content-Security-Policy') diff --git a/engine/src/flutter/lib/web_ui/test/engine/initialization_test.dart b/engine/src/flutter/lib/web_ui/test/engine/initialization_test.dart index a2e4bc43e1..60c9158571 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/initialization_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/initialization_test.dart @@ -38,7 +38,6 @@ void testMain() { JSAny? engineInitializer; void didCreateEngineInitializerMock(JSAny? obj) { - print('obj: $obj'); engineInitializer = obj; } diff --git a/engine/src/flutter/lib/web_ui/test/engine/pointer_binding/event_position_helper_test.dart b/engine/src/flutter/lib/web_ui/test/engine/pointer_binding/event_position_helper_test.dart index b326062a05..8acdbbd7c7 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/pointer_binding/event_position_helper_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/pointer_binding/event_position_helper_test.dart @@ -135,14 +135,17 @@ void doTests() { test('Event dispatched by TalkBack gets a computed offset', () async { // Fill this in to test _computeOffsetForTalkbackEvent - }, skip: 'To be implemented!'); + + // To be implemented! + }, skip: true); test( 'Event dispatched on text editing node computes offset with framework geometry', () async { // Fill this in to test _computeOffsetForInputs }, - skip: 'To be implemented!', + // To be implemented! + skip: true, ); }); } diff --git a/engine/src/flutter/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart b/engine/src/flutter/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart index 613e855047..502e74c8dc 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/view_embedder/embedding_strategy/full_page_embedding_strategy_test.dart @@ -8,6 +8,7 @@ library; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine/dom.dart'; +import 'package:ui/src/engine/util.dart'; import 'package:ui/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart'; void main() { @@ -17,6 +18,12 @@ void main() { void doTests() { group('initialize', () { test('Prepares target environment', () { + final warnings = []; + final oldPrintWarning = printWarning; + printWarning = (String message) { + warnings.add(message); + }; + final DomElement target = domDocument.body!; final DomHTMLMetaElement meta = createDomHTMLMetaElement(); meta @@ -52,6 +59,10 @@ void doTests() { isTrue, reason: 'Should install flutter viewport meta tag.', ); + expect(warnings, hasLength(1), reason: 'Should print a warning to the user.'); + expect(warnings.single, contains(RegExp(r'Found an existing.*meta.*viewport'))); + + printWarning = oldPrintWarning; }); }); diff --git a/engine/src/flutter/lib/web_ui/test/engine/window_test.dart b/engine/src/flutter/lib/web_ui/test/engine/window_test.dart index e6d0fe0c7a..044937347a 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/window_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/window_test.dart @@ -13,28 +13,20 @@ import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; import '../common/matchers.dart'; +import '../common/test_initialization.dart'; const int kPhysicalKeyA = 0x00070004; const int kLogicalKeyA = 0x00000000061; +EnginePlatformDispatcher get dispatcher => EnginePlatformDispatcher.instance; +EngineFlutterWindow get myWindow => dispatcher.implicitView!; + void main() { internalBootstrapBrowserTest(() => testMain); } Future testMain() async { - late EngineFlutterWindow myWindow; - final EnginePlatformDispatcher dispatcher = EnginePlatformDispatcher.instance; - - setUp(() { - myWindow = EngineFlutterView.implicit(dispatcher, createDomHTMLDivElement()); - dispatcher.viewManager.registerView(myWindow); - }); - - tearDown(() async { - dispatcher.viewManager.unregisterView(myWindow.viewId); - await myWindow.resetHistory(); - myWindow.dispose(); - }); + setUpImplicitView(); test('onTextScaleFactorChanged preserves the zone', () { final Zone innerZone = Zone.current.fork(); diff --git a/engine/src/flutter/lib/web_ui/test/html/compositing/compositing_golden_test.dart b/engine/src/flutter/lib/web_ui/test/html/compositing/compositing_golden_test.dart index f6d7239150..ff0b022c08 100644 --- a/engine/src/flutter/lib/web_ui/test/html/compositing/compositing_golden_test.dart +++ b/engine/src/flutter/lib/web_ui/test/html/compositing/compositing_golden_test.dart @@ -181,22 +181,18 @@ Future testMain() async { void _testCullRectComputation() { // Draw a picture larger that screen. Verify that cull rect is equal to screen // bounds. - test( - 'fills screen bounds', - () async { - final ui.SceneBuilder builder = ui.SceneBuilder(); - drawWithBitmapCanvas(builder, (RecordingCanvas canvas) { - canvas.drawCircle(ui.Offset.zero, 10000, SurfacePaint()..style = ui.PaintingStyle.fill); - }); - builder.build(); + test('fills screen bounds', () async { + final ui.SceneBuilder builder = ui.SceneBuilder(); + drawWithBitmapCanvas(builder, (RecordingCanvas canvas) { + canvas.drawCircle(ui.Offset.zero, 10000, SurfacePaint()..style = ui.PaintingStyle.fill); + }); + builder.build(); - final PersistedPicture picture = enumeratePictures().single; - expect(picture.optimalLocalCullRect, const ui.Rect.fromLTRB(0, 0, 500, 100)); - }, - skip: ''' - TODO(https://github.com/flutter/flutter/issues/40395) - Needs ability to set iframe to 500,100 size. Current screen seems to be 500,500''', - ); + final PersistedPicture picture = enumeratePictures().single; + expect(picture.optimalLocalCullRect, const ui.Rect.fromLTRB(0, 0, 500, 100)); + // Needs ability to set iframe to 500,100 size. Current screen seems to be 500,500 + // https://github.com/flutter/flutter/issues/40395 + }, skip: true); // Draw a picture that overflows the screen. Verify that cull rect is the // intersection of screen bounds and paint bounds. @@ -263,27 +259,23 @@ void _testCullRectComputation() { // Draw a picture smaller than the screen. Offset it such that the picture // overflows screen bounds. Verify that the cull rect is the intersection // between screen bounds and paint bounds. - test( - 'offset overflows paint bounds', - () async { - final ui.SceneBuilder builder = ui.SceneBuilder(); + test('offset overflows paint bounds', () async { + final ui.SceneBuilder builder = ui.SceneBuilder(); - builder.pushOffset(0, 90); - drawWithBitmapCanvas(builder, (RecordingCanvas canvas) { - canvas.drawCircle(ui.Offset.zero, 20, SurfacePaint()..style = ui.PaintingStyle.fill); - }); - builder.pop(); + builder.pushOffset(0, 90); + drawWithBitmapCanvas(builder, (RecordingCanvas canvas) { + canvas.drawCircle(ui.Offset.zero, 20, SurfacePaint()..style = ui.PaintingStyle.fill); + }); + builder.pop(); - builder.build(); + builder.build(); - final PersistedPicture picture = enumeratePictures().single; - expect(picture.debugExactGlobalCullRect, const ui.Rect.fromLTRB(0, 70, 20, 100)); - expect(picture.optimalLocalCullRect, const ui.Rect.fromLTRB(0, -20, 20, 10)); - }, - skip: ''' - TODO(https://github.com/flutter/flutter/issues/40395) - Needs ability to set iframe to 500,100 size. Current screen seems to be 500,500''', - ); + final PersistedPicture picture = enumeratePictures().single; + expect(picture.debugExactGlobalCullRect, const ui.Rect.fromLTRB(0, 70, 20, 100)); + expect(picture.optimalLocalCullRect, const ui.Rect.fromLTRB(0, -20, 20, 10)); + // Needs ability to set iframe to 500,100 size. Current screen seems to be 500,500 + // https://github.com/flutter/flutter/issues/40395 + }, skip: true); // Draw a picture inside a layer clip but fill all available space inside it. // Verify that the cull rect is equal to the layer clip.