From 4d553192e725d999a181b5b75449ac6c4dad2910 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Tue, 9 May 2023 18:38:21 -0400 Subject: [PATCH 1/3] [web] Move platformViewRegistry to ui_web --- lib/web_ui/lib/initialization.dart | 18 +-------- lib/web_ui/lib/ui.dart | 1 + .../src/ui_web/platform_view_registry.dart | 26 +++++++++++++ .../test/canvaskit/canvas_golden_test.dart | 3 +- .../test/canvaskit/embedded_views_test.dart | 39 ++++++++++--------- .../test/canvaskit/image_golden_test.dart | 3 +- .../test/engine/semantics/semantics_test.dart | 3 +- .../engine/surface/platform_view_test.dart | 5 ++- 8 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index 3cb2a8835242a..70514281104bb 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -125,19 +125,5 @@ void webOnlySetPluginHandler(Future Function(String, ByteData?, PlatformMe engine.pluginMessageCallHandler = handler; } -/// A registry for factories that create platform views. -class PlatformViewRegistry { - /// Register [viewTypeId] as being creating by the given [viewFactory]. - /// [viewFactory] can be any function that takes an integer and returns an - /// `HTMLElement` DOM object. - bool registerViewFactory(String viewTypeId, - Object Function(int viewId) viewFactory, - {bool isVisible = true}) { - // TODO(web): Deprecate this once there's another way of calling `registerFactory` (js interop?) - return engine.platformViewManager - .registerFactory(viewTypeId, viewFactory, isVisible: isVisible); - } -} - -/// The platform view registry for this app. -final PlatformViewRegistry platformViewRegistry = PlatformViewRegistry(); +// TODO(mdebbar): Deprecate this and remove it. +ui_web.PlatformViewRegistry get platformViewRegistry => ui_web.platformViewRegistry; diff --git a/lib/web_ui/lib/ui.dart b/lib/web_ui/lib/ui.dart index 1878d4faa7b39..8b5130e44d2d0 100644 --- a/lib/web_ui/lib/ui.dart +++ b/lib/web_ui/lib/ui.dart @@ -14,6 +14,7 @@ import 'dart:math' as math; import 'dart:typed_data'; import 'src/engine.dart' as engine; +import 'ui_web/src/ui_web.dart' as ui_web; part 'annotations.dart'; part 'canvas.dart'; diff --git a/lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart b/lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart new file mode 100644 index 0000000000000..1d4e77d23d588 --- /dev/null +++ b/lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart @@ -0,0 +1,26 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:ui/src/engine.dart'; + +/// The platform view registry for this app. +final PlatformViewRegistry platformViewRegistry = PlatformViewRegistry(); + +/// A registry for factories that create platform views. +class PlatformViewRegistry { + /// Register [viewTypeId] as being creating by the given [viewFactory]. + /// [viewFactory] can be any function that takes an integer and returns an + /// `HTMLElement` DOM object. + bool registerViewFactory( + String viewTypeId, + Object Function(int viewId) viewFactory, { + bool isVisible = true, + }) { + return platformViewManager.registerFactory( + viewTypeId, + viewFactory, + isVisible: isVisible, + ); + } +} diff --git a/lib/web_ui/test/canvaskit/canvas_golden_test.dart b/lib/web_ui/test/canvaskit/canvas_golden_test.dart index f58485f1f0124..fadadbfd75bb6 100644 --- a/lib/web_ui/test/canvaskit/canvas_golden_test.dart +++ b/lib/web_ui/test/canvaskit/canvas_golden_test.dart @@ -9,6 +9,7 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import 'package:web_engine_tester/golden_tester.dart'; @@ -660,7 +661,7 @@ void testMain() { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; SurfaceFactory.instance.debugClear(); - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index d4d521e330bb7..a5d15dd055517 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -9,6 +9,7 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import 'common.dart'; import 'test_data.dart'; @@ -27,7 +28,7 @@ void testMain() { test('embeds interactive platform views', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -62,7 +63,7 @@ void testMain() { test('clips platform views with RRects', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -117,7 +118,7 @@ void testMain() { test('correctly transforms platform views', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -147,7 +148,7 @@ void testMain() { }); test('correctly offsets platform views', () async { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -185,7 +186,7 @@ void testMain() { } test('correctly offsets when clip chain length is changed', () async { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -236,7 +237,7 @@ void testMain() { test('converts device pixels to logical pixels (no clips)', () async { window.debugOverrideDevicePixelRatio(4); - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -261,7 +262,7 @@ void testMain() { test('converts device pixels to logical pixels (with clips)', () async { window.debugOverrideDevicePixelRatio(4); - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -301,7 +302,7 @@ void testMain() { // Initialize all platform views to be used in the test. final List platformViewIds = []; for (int i = 0; i < 16; i++) { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-$i', ); @@ -454,7 +455,7 @@ void testMain() { // Initialize all platform views to be used in the test. final List platformViewIds = []; for (int i = 0; i < 20; i++) { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-$i', ); @@ -581,7 +582,7 @@ void testMain() { }, skip: isSafari); test('embeds and disposes of a platform view', () async { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -621,7 +622,7 @@ void testMain() { }); test('does not crash when resizing the window after textures have been registered', () async { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -668,7 +669,7 @@ void testMain() { test('removed the DOM node of an unrendered platform view', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -728,7 +729,7 @@ void testMain() { 'removes old SVG clip definitions from the DOM when the view is recomposited', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'test-view', ); @@ -763,7 +764,7 @@ void testMain() { test('does not crash when a prerolled platform view is not composited', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -784,7 +785,7 @@ void testMain() { test('does not crash when overlays are disabled', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; HtmlViewEmbedder.debugDisableOverlays = true; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -817,7 +818,7 @@ void testMain() { expect(SurfaceFactory.instance.maximumSurfaces, 2); expect(SurfaceFactory.instance.maximumOverlays, 1); - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -861,7 +862,7 @@ void testMain() { 'of views is used', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; HtmlViewEmbedder.debugDisableOverlays = true; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); @@ -897,11 +898,11 @@ void testMain() { test('does not create overlays for invisible platform views', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-visible-view', (int viewId) => createDomHTMLDivElement()..className = 'visible-platform-view'); - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-invisible-view', (int viewId) => createDomHTMLDivElement()..className = 'invisible-platform-view', diff --git a/lib/web_ui/test/canvaskit/image_golden_test.dart b/lib/web_ui/test/canvaskit/image_golden_test.dart index f682f2c1e4700..6e8fd738d9137 100644 --- a/lib/web_ui/test/canvaskit/image_golden_test.dart +++ b/lib/web_ui/test/canvaskit/image_golden_test.dart @@ -9,6 +9,7 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import 'package:web_engine_tester/golden_tester.dart'; import '../common/matchers.dart'; @@ -653,7 +654,7 @@ void _testForImageCodecs({required bool useBrowserImageDecoder}) { // * https://github.com/flutter/flutter/issues/86809 // * https://github.com/flutter/flutter/issues/91881 test('the same image can be rendered on difference surfaces', () async { - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement()..id = 'view-0', ); diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index e4da65ad22d69..28e34d3a12912 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -14,6 +14,7 @@ import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import 'semantics_tester.dart'; @@ -1929,7 +1930,7 @@ void _testPlatformView() { ..debugOverrideTimestampFunction(() => _testTime) ..semanticsEnabled = true; - ui.platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-platform-view', (int viewId) => createDomHTMLDivElement() ..id = 'view-0' diff --git a/lib/web_ui/test/engine/surface/platform_view_test.dart b/lib/web_ui/test/engine/surface/platform_view_test.dart index 700da0c0cbe34..056173cf23c43 100644 --- a/lib/web_ui/test/engine/surface/platform_view_test.dart +++ b/lib/web_ui/test/engine/surface/platform_view_test.dart @@ -8,6 +8,7 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import '../../common/matchers.dart'; @@ -25,11 +26,11 @@ Future testMain() async { group('PersistedPlatformView', () { setUp(() async { - platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-0', (int viewId) => createDomHTMLDivElement(), ); - platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-1', (int viewId) => createDomHTMLDivElement(), ); From 69e2feee06503942d8e67c2a6784799bf7890d26 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 10 May 2023 11:03:37 -0400 Subject: [PATCH 2/3] fix licenses and sdk_rewriter --- ci/licenses_golden/licenses_flutter | 2 ++ lib/web_ui/lib/ui_web/src/ui_web.dart | 1 + web_sdk/sdk_rewriter.dart | 15 ++++++++------- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 82b2e704efec9..dd6511121ecae 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2061,6 +2061,7 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/text.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/tile_mode.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/ui.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/url_strategy.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/window.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/canvas.cpp + ../../../flutter/LICENSE @@ -4664,6 +4665,7 @@ FILE: ../../../flutter/lib/web_ui/lib/text.dart FILE: ../../../flutter/lib/web_ui/lib/tile_mode.dart FILE: ../../../flutter/lib/web_ui/lib/ui.dart FILE: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web.dart +FILE: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart FILE: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/url_strategy.dart FILE: ../../../flutter/lib/web_ui/lib/window.dart FILE: ../../../flutter/lib/web_ui/skwasm/canvas.cpp diff --git a/lib/web_ui/lib/ui_web/src/ui_web.dart b/lib/web_ui/lib/ui_web/src/ui_web.dart index fe605222a4b4d..05e17da876385 100644 --- a/lib/web_ui/lib/ui_web/src/ui_web.dart +++ b/lib/web_ui/lib/ui_web/src/ui_web.dart @@ -8,4 +8,5 @@ // ignore: unnecessary_library_directive library ui_web; +export 'ui_web/platform_view_registry.dart'; export 'ui_web/url_strategy.dart'; diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index 1a8842745cb93..96b37598a6fcc 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -20,19 +20,20 @@ final ArgParser argParser = ArgParser() final List uiPatterns = [ AllReplacer(RegExp(r'library\s+ui;'), 'library dart.ui;'), AllReplacer(RegExp(r'part\s+of\s+ui;'), 'part of dart.ui;'), + + // import 'src/engine.dart' as engine; AllReplacer(RegExp(r''' import\s*'src/engine.dart'\s*as\s+engine; '''), r''' import 'dart:_engine' as engine; '''), - AllReplacer(RegExp( - r''' -export\s*'src/engine.dart' + + // import 'ui_web/src/ui_web.dart' as ui_web; + AllReplacer(RegExp(r''' +import\s*'ui_web/src/ui_web.dart'\s*as\s+ui_web; +'''), r''' +import 'dart:ui_web' as ui_web; '''), - r''' -export 'dart:_engine' -''', - ), ]; List generateApiFilePatterns(String libraryName, bool isPublic, List extraImports) { From 73725a3583c085d96236bc6e3cd1cce6881a3dfa Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Tue, 23 May 2023 11:30:40 -0400 Subject: [PATCH 3/3] print warning --- lib/web_ui/lib/initialization.dart | 12 +++++++- .../engine/surface/platform_view_test.dart | 28 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index 70514281104bb..9ec0e8474a071 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -126,4 +126,14 @@ void webOnlySetPluginHandler(Future Function(String, ByteData?, PlatformMe } // TODO(mdebbar): Deprecate this and remove it. -ui_web.PlatformViewRegistry get platformViewRegistry => ui_web.platformViewRegistry; +// https://github.com/flutter/flutter/issues/127395 +ui_web.PlatformViewRegistry get platformViewRegistry { + assert(() { + engine.printWarning( + 'The platformViewRegistry getter is deprecated and will be removed in a ' + 'future release. Please import it from `dart:ui_web` instead.', + ); + return true; + }()); + return ui_web.platformViewRegistry; +} diff --git a/lib/web_ui/test/engine/surface/platform_view_test.dart b/lib/web_ui/test/engine/surface/platform_view_test.dart index 056173cf23c43..e03b3d6a16ea1 100644 --- a/lib/web_ui/test/engine/surface/platform_view_test.dart +++ b/lib/web_ui/test/engine/surface/platform_view_test.dart @@ -7,7 +7,7 @@ import 'dart:async'; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; -import 'package:ui/ui.dart'; +import 'package:ui/ui.dart' as ui; import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import '../../common/matchers.dart'; @@ -20,10 +20,32 @@ void main() { } Future testMain() async { - await webOnlyInitializePlatform(); + await ui.webOnlyInitializePlatform(); late PersistedPlatformView view; + test('importing platformViewRegistry from dart:ui is deprecated', () { + final void Function(String) oldPrintWarning = printWarning; + + final List warnings = []; + printWarning = (String message) { + warnings.add(message); + }; + + // ignore: unnecessary_statements + ui_web.platformViewRegistry; + expect(warnings, isEmpty); + + // ignore: unnecessary_statements + ui.platformViewRegistry; + expect(warnings, hasLength(1)); + expect(warnings.single, contains('platformViewRegistry')); + expect(warnings.single, contains('deprecated')); + expect(warnings.single, contains('dart:ui_web')); + + printWarning = oldPrintWarning; + }); + group('PersistedPlatformView', () { setUp(() async { ui_web.platformViewRegistry.registerViewFactory( @@ -63,7 +85,7 @@ Future testMain() async { }); test('returns false when other view is not a PlatformView', () { - final PersistedOpacity anyView = PersistedOpacity(null, 1, Offset.zero)..build(); + final PersistedOpacity anyView = PersistedOpacity(null, 1, ui.Offset.zero)..build(); expect(view.canUpdateAsMatch(anyView), isFalse); }); });