diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 7e33115b91001..cb3241c442528 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2090,6 +2090,7 @@ 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/navigation/platform_location.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/navigation/url_strategy.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/window.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/canvas.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/contour_measure.cpp + ../../../flutter/LICENSE @@ -4732,6 +4733,7 @@ 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/navigation/platform_location.dart FILE: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/navigation/url_strategy.dart +FILE: ../../../flutter/lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart FILE: ../../../flutter/lib/web_ui/lib/window.dart FILE: ../../../flutter/lib/web_ui/skwasm/canvas.cpp FILE: ../../../flutter/lib/web_ui/skwasm/contour_measure.cpp diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index 3cb2a8835242a..9ec0e8474a071 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -125,19 +125,15 @@ 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); - } +// TODO(mdebbar): Deprecate this and remove it. +// 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; } - -/// The platform view registry for this app. -final PlatformViewRegistry platformViewRegistry = 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.dart b/lib/web_ui/lib/ui_web/src/ui_web.dart index f319649704b1b..d5731cc73b1f7 100644 --- a/lib/web_ui/lib/ui_web/src/ui_web.dart +++ b/lib/web_ui/lib/ui_web/src/ui_web.dart @@ -10,3 +10,4 @@ library ui_web; export 'ui_web/navigation/platform_location.dart'; export 'ui_web/navigation/url_strategy.dart'; +export 'ui_web/platform_view_registry.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 234f4bf27594c..361e823b6e37e 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'; @@ -164,7 +165,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 026a8b6cb523a..1ea261d7af43a 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'; @@ -2265,7 +2266,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..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,8 @@ 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'; @@ -19,17 +20,39 @@ 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 { - platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-0', (int viewId) => createDomHTMLDivElement(), ); - platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'test-1', (int viewId) => createDomHTMLDivElement(), ); @@ -62,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); }); }); 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) {