Skip to content

Commit

Permalink
[web] Move platformViewRegistry to ui_web (#41877)
Browse files Browse the repository at this point in the history
In this PR, I'm leaving a getter for `platformViewRegistry` in `dart:ui` for backwards compatibility. At some point, we need to properly deprecate it (e.g. print a warning asking users to import it from `dart:ui_web` instead).

Next step is to migrate all call sites in flutter/flutter, flutter/packages and flutter/devtools (anything else?).

Issue: flutter/flutter#126831

Fixes flutter/flutter#41563
  • Loading branch information
mdebbar committed May 23, 2023
1 parent 54e92c4 commit f37e78c
Show file tree
Hide file tree
Showing 11 changed files with 103 additions and 49 deletions.
2 changes: 2 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
26 changes: 11 additions & 15 deletions lib/web_ui/lib/initialization.dart
Original file line number Diff line number Diff line change
Expand Up @@ -125,19 +125,15 @@ void webOnlySetPluginHandler(Future<void> 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();
1 change: 1 addition & 0 deletions lib/web_ui/lib/ui.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
1 change: 1 addition & 0 deletions lib/web_ui/lib/ui_web/src/ui_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
26 changes: 26 additions & 0 deletions lib/web_ui/lib/ui_web/src/ui_web/platform_view_registry.dart
Original file line number Diff line number Diff line change
@@ -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,
);
}
}
3 changes: 2 additions & 1 deletion lib/web_ui/test/canvaskit/canvas_golden_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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',
);
Expand Down
39 changes: 20 additions & 19 deletions lib/web_ui/test/canvaskit/embedded_views_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand All @@ -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',
);
Expand Down Expand Up @@ -301,7 +302,7 @@ void testMain() {
// Initialize all platform views to be used in the test.
final List<int> platformViewIds = <int>[];
for (int i = 0; i < 16; i++) {
ui.platformViewRegistry.registerViewFactory(
ui_web.platformViewRegistry.registerViewFactory(
'test-platform-view',
(int viewId) => createDomHTMLDivElement()..id = 'view-$i',
);
Expand Down Expand Up @@ -454,7 +455,7 @@ void testMain() {
// Initialize all platform views to be used in the test.
final List<int> platformViewIds = <int>[];
for (int i = 0; i < 20; i++) {
ui.platformViewRegistry.registerViewFactory(
ui_web.platformViewRegistry.registerViewFactory(
'test-platform-view',
(int viewId) => createDomHTMLDivElement()..id = 'view-$i',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand All @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
);
Expand Down Expand Up @@ -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',
Expand Down
3 changes: 2 additions & 1 deletion lib/web_ui/test/canvaskit/image_golden_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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',
);
Expand Down
3 changes: 2 additions & 1 deletion lib/web_ui/test/engine/semantics/semantics_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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'
Expand Down
33 changes: 28 additions & 5 deletions lib/web_ui/test/engine/surface/platform_view_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -19,17 +20,39 @@ void main() {
}

Future<void> 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<String> warnings = <String>[];
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(),
);
Expand Down Expand Up @@ -62,7 +85,7 @@ Future<void> 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);
});
});
Expand Down

0 comments on commit f37e78c

Please sign in to comment.