From ecfc746b3a5227663b667c43f133a9689afbe2b2 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Fri, 20 Oct 2023 15:04:47 -0400 Subject: [PATCH 1/2] [web] Remove workaround for safely removing slots on Safari --- .../platform_views/content_manager.dart | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/lib/web_ui/lib/src/engine/platform_views/content_manager.dart b/lib/web_ui/lib/src/engine/platform_views/content_manager.dart index a9ed363417caf..7320d9cc2600a 100644 --- a/lib/web_ui/lib/src/engine/platform_views/content_manager.dart +++ b/lib/web_ui/lib/src/engine/platform_views/content_manager.dart @@ -4,9 +4,7 @@ import 'package:ui/ui_web/src/ui_web.dart' as ui_web; -import '../browser_detection.dart'; import '../dom.dart'; -import '../embedder.dart'; import '../util.dart'; import 'slots.dart'; @@ -161,38 +159,11 @@ class PlatformViewManager { /// Removes a PlatformView by its `viewId` from the manager, and from the DOM. /// - /// Once a view has been cleared, calls [knowsViewId] will fail, as if it had + /// Once a view has been cleared, calls to [knowsViewId] will fail, as if it had /// never been rendered before. void clearPlatformView(int viewId) { // Remove from our cache, and then from the DOM... - final DomElement? element = _contents.remove(viewId); - _safelyRemoveSlottedElement(element); - } - - // We need to remove slotted elements like this because of a Safari bug that - // gets triggered when a slotted element is removed in a JS event different - // than its slot (after the slot is removed). - // - // TODO(web): Cleanup https://github.com/flutter/flutter/issues/85816 - void _safelyRemoveSlottedElement(DomElement? element) { - if (element == null) { - return; - } - if (browserEngine != BrowserEngine.webkit) { - element.remove(); - return; - } - final String tombstoneName = "tombstone-${element.getAttribute('slot')}"; - // Create and inject a new slot in the shadow root - final DomElement slot = domDocument.createElement('slot') - ..style.display = 'none' - ..setAttribute('name', tombstoneName); - flutterViewEmbedder.glassPaneShadow.append(slot); - // Link the element to the new slot - element.setAttribute('slot', tombstoneName); - // Delete both the element, and the new slot - element.remove(); - slot.remove(); + _contents.remove(viewId)?.remove(); } /// Attempt to ensure that the contents of the user-supplied DOM element will From f96bdaba44fd83075b6556923c289373e4739819 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Fri, 20 Oct 2023 15:23:31 -0400 Subject: [PATCH 2/2] enhance test --- .../test/engine/platform_views/content_manager_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/test/engine/platform_views/content_manager_test.dart b/lib/web_ui/test/engine/platform_views/content_manager_test.dart index 6de84dbb3ab99..445094c5bccc1 100644 --- a/lib/web_ui/test/engine/platform_views/content_manager_test.dart +++ b/lib/web_ui/test/engine/platform_views/content_manager_test.dart @@ -51,13 +51,14 @@ void testMain() { test('forgets viewIds after clearing them', () { contentManager.registerFactory(viewType, (int id) => createDomHTMLDivElement()); - contentManager.renderContent(viewType, viewId, null); + final DomElement view = contentManager.renderContent(viewType, viewId, null); expect(contentManager.knowsViewId(viewId), isTrue); contentManager.clearPlatformView(viewId); expect(contentManager.knowsViewId(viewId), isFalse); + expect(view.parentNode, isNull); }); });