@@ -124,6 +124,9 @@ class FlutterViewEmbedder {
124
124
HostNode get glassPaneShadow => _glassPaneShadow;
125
125
late HostNode _glassPaneShadow;
126
126
127
+ DomElement get textEditingHostNode => _textEditingHostNode;
128
+ late DomElement _textEditingHostNode;
129
+
127
130
static const String defaultFontStyle = 'normal' ;
128
131
static const String defaultFontWeight = 'normal' ;
129
132
static const double defaultFontSize = 14 ;
@@ -168,6 +171,9 @@ class FlutterViewEmbedder {
168
171
);
169
172
_glassPaneShadow = glassPaneElementHostNode;
170
173
174
+ _textEditingHostNode =
175
+ createTextEditingHostNode (glassPaneElement, defaultCssFont);
176
+
171
177
// Don't allow the scene to receive pointer events.
172
178
_sceneHostElement = domDocument.createElement ('flt-scene-host' )
173
179
..style.pointerEvents = 'none' ;
@@ -189,20 +195,20 @@ class FlutterViewEmbedder {
189
195
glassPaneElementHostNode.appendAll (< DomNode > [
190
196
accessibilityPlaceholder,
191
197
_sceneHostElement! ,
192
-
193
- // The semantic host goes last because hit-test order-wise it must be
194
- // first. If semantics goes under the scene host, platform views will
195
- // obscure semantic elements.
196
- //
197
- // You may be wondering: wouldn't semantics obscure platform views and
198
- // make then not accessible? At least with some careful planning, that
199
- // should not be the case. The semantics tree makes all of its non-leaf
200
- // elements transparent. This way, if a platform view appears among other
201
- // interactive Flutter widgets, as long as those widgets do not intersect
202
- // with the platform view, the platform view will be reachable.
203
- semanticsHostElement,
204
198
]);
205
199
200
+ // The semantic host goes last because hit-test order-wise it must be
201
+ // first. If semantics goes under the scene host, platform views will
202
+ // obscure semantic elements.
203
+ //
204
+ // You may be wondering: wouldn't semantics obscure platform views and
205
+ // make then not accessible? At least with some careful planning, that
206
+ // should not be the case. The semantics tree makes all of its non-leaf
207
+ // elements transparent. This way, if a platform view appears among other
208
+ // interactive Flutter widgets, as long as those widgets do not intersect
209
+ // with the platform view, the platform view will be reachable.
210
+ glassPaneElement.appendChild (semanticsHostElement);
211
+
206
212
// When debugging semantics, make the scene semi-transparent so that the
207
213
// semantics tree is more prominent.
208
214
if (configuration.debugShowSemanticsNodes) {
@@ -393,3 +399,24 @@ FlutterViewEmbedder? _flutterViewEmbedder;
393
399
FlutterViewEmbedder ensureFlutterViewEmbedderInitialized () =>
394
400
_flutterViewEmbedder ?? =
395
401
FlutterViewEmbedder (hostElement: configuration.hostElement);
402
+
403
+ /// Creates a node to host text editing elements and applies a stylesheet
404
+ /// to Flutter nodes that exist outside of the shadowDOM.
405
+ DomElement createTextEditingHostNode (DomElement root, String defaultFont) {
406
+ final DomElement domElement =
407
+ domDocument.createElement ('flt-text-editing-host' );
408
+ final DomHTMLStyleElement styleElement = createDomHTMLStyleElement ();
409
+
410
+ styleElement.id = 'flt-text-editing-stylesheet' ;
411
+ root.appendChild (styleElement);
412
+ applyGlobalCssRulesToSheet (
413
+ styleElement.sheet! as DomCSSStyleSheet ,
414
+ hasAutofillOverlay: browserHasAutofillOverlay (),
415
+ cssSelectorPrefix: FlutterViewEmbedder .glassPaneTagName,
416
+ defaultCssFont: defaultFont,
417
+ );
418
+
419
+ root.appendChild (domElement);
420
+
421
+ return domElement;
422
+ }
0 commit comments