From 98f0685a85f765a104f6ed7e4a7ada518cdd41ca Mon Sep 17 00:00:00 2001 From: p-mazhnik Date: Sun, 9 Jun 2024 16:44:20 +0300 Subject: [PATCH 1/5] [web] retrieve hostElement for an implicit view --- .../view_embedder/flutter_view_manager.dart | 4 ++++ .../ui_web/src/ui_web/flutter_views_proxy.dart | 2 +- .../view_embedder/flutter_views_proxy_test.dart | 15 +++++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart index 2d2bc639e361a..176d1803d71f6 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart @@ -99,6 +99,10 @@ class FlutterViewManager { return _jsViewOptions[viewId]; } + DomElement? getHostElement(int viewId) { + return _viewData[viewId]?.embeddingStrategy.hostElement; + } + EngineFlutterView? findViewForElement(DomElement? element) { const String viewRootSelector = '${DomManager.flutterViewTagName}[${GlobalHtmlAttributes.flutterViewIdAttributeName}]'; diff --git a/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart b/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart index 7e7e99f968b44..3d5c3a5e269c5 100644 --- a/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart +++ b/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart @@ -23,7 +23,7 @@ class FlutterViewManagerProxy { /// can add their own custom HTML elements (for example: file inputs for the /// file_selector plugin). JSAny? getHostElement(int viewId) { - return _viewManager.getOptions(viewId)?.hostElement as JSAny?; + return _viewManager.getHostElement(viewId) as JSAny?; } /// Returns the `initialData` configuration value passed from JS when `viewId` was added. diff --git a/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart b/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart index 230d655d17e4d..b5823db710df3 100644 --- a/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart +++ b/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart @@ -36,9 +36,9 @@ Future doTests() async { } setUp(() { - view = EngineFlutterView(platformDispatcher, createDomElement('div')); - viewId = view.viewId; hostElement = createDomElement('div'); + view = EngineFlutterView(platformDispatcher, hostElement); + viewId = view.viewId; }); tearDown(() { @@ -60,6 +60,17 @@ Future doTests() async { expect(element, hostElement); }); + + test('can retrieve hostElement for an implicit view', () { + final view = EngineFlutterView.implicit(platformDispatcher, hostElement); + final viewId = view.viewId; + viewManager.registerView(view); + addTearDown(() => viewManager.unregisterView(viewId)); + + final JSAny? element = views.getHostElement(viewId); + + expect(element, hostElement); + }); }); group('getInitialData', () { From adb379ba30f16f6d6b0788822aa887a31aa14032 Mon Sep 17 00:00:00 2001 From: p-mazhnik Date: Sun, 9 Jun 2024 17:22:20 +0300 Subject: [PATCH 2/5] add tests --- .../view_embedder/flutter_views_proxy_test.dart | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart b/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart index b5823db710df3..0b35c5a771862 100644 --- a/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart +++ b/lib/web_ui/test/engine/view_embedder/flutter_views_proxy_test.dart @@ -61,7 +61,18 @@ Future doTests() async { expect(element, hostElement); }); - test('can retrieve hostElement for an implicit view', () { + test('can retrieve hostElement for an implicit view with default host element', () { + final view = EngineFlutterView.implicit(platformDispatcher, null); + final viewId = view.viewId; + viewManager.registerView(view); + addTearDown(() => viewManager.unregisterView(viewId)); + + final JSAny? element = views.getHostElement(viewId); + + expect(element, domDocument.body); + }); + + test('can retrieve hostElement for an implicit view with custom host element', () { final view = EngineFlutterView.implicit(platformDispatcher, hostElement); final viewId = view.viewId; viewManager.registerView(view); From e48806cb431e47459165594255bdb6d336b32fcb Mon Sep 17 00:00:00 2001 From: p-mazhnik Date: Wed, 12 Jun 2024 02:28:31 +0300 Subject: [PATCH 3/5] update doc comments --- .../lib/src/engine/view_embedder/flutter_view_manager.dart | 1 + lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart index 176d1803d71f6..689fdbaabfbba 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart @@ -99,6 +99,7 @@ class FlutterViewManager { return _jsViewOptions[viewId]; } + /// Returns the host element in which the Flutter view associated to [viewId] is embedded (if any). DomElement? getHostElement(int viewId) { return _viewData[viewId]?.embeddingStrategy.hostElement; } diff --git a/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart b/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart index 3d5c3a5e269c5..364eda18156bd 100644 --- a/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart +++ b/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart @@ -17,7 +17,9 @@ class FlutterViewManagerProxy { // The proxied viewManager instance. final FlutterViewManager _viewManager; - /// Returns the `hostElement` configuration value passed from JS when `viewId` was added. + /// Returns the host element for [viewId]. + /// In a multi-view app, it is the `hostElement` value passed from JS when [viewId] was added. + /// In an implicit view app, it is either the provided `hostElement` or the element. /// /// This is useful for plugins and apps to have a safe DOM Element where they /// can add their own custom HTML elements (for example: file inputs for the From 812a40e600e38b37a1c5beff262cf1eeebccaa44 Mon Sep 17 00:00:00 2001 From: p-mazhnik Date: Wed, 10 Jul 2024 23:44:10 +0300 Subject: [PATCH 4/5] update doc comments --- .../view_embedder/embedding_strategy/embedding_strategy.dart | 3 ++- .../lib/src/engine/view_embedder/flutter_view_manager.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart b/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart index e792ac5476d59..54fd75d4cab53 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart @@ -26,7 +26,8 @@ abstract class EmbeddingStrategy { } } - /// The host element in which the Flutter view is embedded. + /// The dom element in which the Flutter view is embedded. + /// This element is the direct parent element of the element. DomElement get hostElement; /// The global event target for the Flutter view. diff --git a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart index 689fdbaabfbba..14d04753e41f8 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart @@ -99,7 +99,7 @@ class FlutterViewManager { return _jsViewOptions[viewId]; } - /// Returns the host element in which the Flutter view associated to [viewId] is embedded (if any). + /// Returns the dom element in which the Flutter view associated to [viewId] is embedded. DomElement? getHostElement(int viewId) { return _viewData[viewId]?.embeddingStrategy.hostElement; } From 6045c9f40b18947133ead5bc11b683c85a2b586d Mon Sep 17 00:00:00 2001 From: p-mazhnik Date: Thu, 11 Jul 2024 23:29:00 +0300 Subject: [PATCH 5/5] update comments --- .../embedding_strategy/embedding_strategy.dart | 2 +- .../src/engine/view_embedder/flutter_view_manager.dart | 2 +- lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart b/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart index 54fd75d4cab53..2258d9f19d3b5 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart @@ -26,7 +26,7 @@ abstract class EmbeddingStrategy { } } - /// The dom element in which the Flutter view is embedded. + /// The DOM element in which the Flutter view is embedded. /// This element is the direct parent element of the element. DomElement get hostElement; diff --git a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart index 14d04753e41f8..685e940a53cf1 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/flutter_view_manager.dart @@ -99,7 +99,7 @@ class FlutterViewManager { return _jsViewOptions[viewId]; } - /// Returns the dom element in which the Flutter view associated to [viewId] is embedded. + /// Returns the DOM element in which the Flutter view associated to [viewId] is embedded. DomElement? getHostElement(int viewId) { return _viewData[viewId]?.embeddingStrategy.hostElement; } diff --git a/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart b/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart index 364eda18156bd..f19ee0344f54c 100644 --- a/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart +++ b/lib/web_ui/lib/ui_web/src/ui_web/flutter_views_proxy.dart @@ -18,8 +18,12 @@ class FlutterViewManagerProxy { final FlutterViewManager _viewManager; /// Returns the host element for [viewId]. - /// In a multi-view app, it is the `hostElement` value passed from JS when [viewId] was added. - /// In an implicit view app, it is either the provided `hostElement` or the element. + /// + /// In the full-page mode, the host element is the `` element of the page + /// and the view is the one and only [PlatformDispatcher.implicitView]. + /// + /// In the add-to-app mode, the host element is the value of `hostElement` + /// provided when creating the view. /// /// This is useful for plugins and apps to have a safe DOM Element where they /// can add their own custom HTML elements (for example: file inputs for the