Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 4020f0e

Browse files
committed
[web] Do not dispose all platform view factories when disposing a view.
1 parent da96f9d commit 4020f0e

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ class HtmlViewEmbedder {
659659

660660
/// Disposes the state of this view embedder.
661661
void dispose() {
662-
final Set<int> allViews = PlatformViewManager.instance.debugClear();
662+
final Set<int> allViews = PlatformViewManager.instance.getKnownPlatformViewIds();
663663
disposeViews(allViews);
664664
_context = EmbedderFrameContext();
665665
_currentCompositionParams.clear();

lib/web_ui/lib/src/engine/platform_views/content_manager.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,10 @@ class PlatformViewManager {
212212
/// component.
213213
bool isVisible(int viewId) => !isInvisible(viewId);
214214

215-
/// Clears the state. Used in tests.
216-
///
217215
/// Returns the set of know view ids, so they can be cleaned up.
216+
Set<int> getKnownPlatformViewIds() => _contents.keys.toSet();
217+
218+
/// Clears the state. Used in tests.
218219
Set<int> debugClear() {
219220
final Set<int> result = _contents.keys.toSet();
220221
result.forEach(clearPlatformView);

lib/web_ui/test/canvaskit/multi_view_test.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:test/bootstrap/browser.dart';
66
import 'package:test/test.dart';
77
import 'package:ui/src/engine.dart';
88
import 'package:ui/ui.dart' as ui;
9+
import 'package:ui/ui_web/src/ui_web.dart' as ui_web;
910

1011
import '../common/matchers.dart';
1112
import 'common.dart';
@@ -68,5 +69,28 @@ void testMain() {
6869
isNull,
6970
);
7071
});
72+
73+
// Issue https://github.com/flutter/flutter/issues/142094
74+
test('does not reset platform view factories when disposing a view', () async {
75+
expect(PlatformViewManager.instance.knowsViewType('self-test'), isFalse);
76+
77+
final EngineFlutterView view = EngineFlutterView(
78+
EnginePlatformDispatcher.instance, createDomElement('multi-view'));
79+
EnginePlatformDispatcher.instance.viewManager.registerView(view);
80+
expect(
81+
CanvasKitRenderer.instance.debugGetRasterizerForView(view),
82+
isNotNull,
83+
);
84+
85+
EnginePlatformDispatcher.instance.viewManager
86+
.disposeAndUnregisterView(view.viewId);
87+
expect(
88+
CanvasKitRenderer.instance.debugGetRasterizerForView(view),
89+
isNull,
90+
);
91+
92+
expect(PlatformViewManager.instance.knowsViewType(ui_web.PlatformViewRegistry.defaultVisibleViewType), isTrue);
93+
expect(PlatformViewManager.instance.knowsViewType(ui_web.PlatformViewRegistry.defaultInvisibleViewType), isTrue);
94+
});
7195
});
7296
}

0 commit comments

Comments
 (0)