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

Commit 7956603

Browse files
authored
[web] Migrate Flutter Web DOM usage to JS static interop - 12. (#33241)
1 parent c4b899f commit 7956603

24 files changed

+101
-79
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
@@ -212,7 +212,7 @@ class HtmlViewEmbedder {
212212
void _compositeWithParams(int viewId, EmbeddedViewParams params) {
213213
// If we haven't seen this viewId yet, cache it for clips/transforms.
214214
final ViewClipChain clipChain = _viewClipChains.putIfAbsent(viewId, () {
215-
return ViewClipChain(view: createPlatformViewSlot(viewId) as DomElement);
215+
return ViewClipChain(view: createPlatformViewSlot(viewId));
216216
});
217217

218218
final DomElement slot = clipChain.slot;

lib/web_ui/lib/src/engine/dom.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ extension DomElementExtension on DomElement {
139139
external /* List<DomElement> */ List<Object?> get children;
140140
external String get id;
141141
external set id(String id);
142+
external set spellcheck(bool? value);
143+
external String get tagName;
142144
external DomCSSStyleDeclaration get style;
143145
external void append(DomNode node);
144146
external String? getAttribute(String attributeName);
@@ -160,6 +162,14 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration {
160162
set transform(String value) => setProperty('transform', value);
161163
set transformOrigin(String value) => setProperty('transform-origin', value);
162164
set opacity(String value) => setProperty('opacity', value);
165+
set color(String value) => setProperty('color', value);
166+
set top(String value) => setProperty('top', value);
167+
set left(String value) => setProperty('left', value);
168+
set right(String value) => setProperty('right', value);
169+
set bottom(String value) => setProperty('bottom', value);
170+
set backgroundColor(String value) => setProperty('background-color', value);
171+
set pointerEvents(String value) => setProperty('pointer-events', value);
172+
set filter(String value) => setProperty('filter', value);
163173
String get width => getPropertyValue('width');
164174
String get height => getPropertyValue('height');
165175
String get position => getPropertyValue('position');
@@ -168,10 +178,19 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration {
168178
String get transform => getPropertyValue('transform');
169179
String get transformOrigin => getPropertyValue('transform-origin');
170180
String get opacity => getPropertyValue('opacity');
181+
String get color => getPropertyValue('color');
182+
String get top => getPropertyValue('top');
183+
String get left => getPropertyValue('left');
184+
String get right => getPropertyValue('right');
185+
String get bottom => getPropertyValue('bottom');
186+
String get backgroundColor => getPropertyValue('background-color');
187+
String get pointerEvents => getPropertyValue('pointer-events');
188+
String get filter => getPropertyValue('filter');
171189

172190
external String getPropertyValue(String property);
173191
external void setProperty(String propertyName, String value,
174192
[String priority]);
193+
external String removeProperty(String property);
175194
}
176195

177196
@JS()

lib/web_ui/lib/src/engine/embedder.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class FlutterViewEmbedder {
200200
hasAutofillOverlay: browserHasAutofillOverlay(),
201201
);
202202

203-
final html.BodyElement bodyElement = html.document.body!;
203+
final DomHTMLBodyElement bodyElement = domDocument.body!;
204204

205205
bodyElement.setAttribute(
206206
'flt-renderer',
@@ -270,8 +270,8 @@ class FlutterViewEmbedder {
270270
// IMPORTANT: the glass pane element must come after the scene element in the DOM node list so
271271
// it can intercept input events.
272272
_glassPaneElement?.remove();
273-
final html.Element glassPaneElement = html.document.createElement(_glassPaneTagName);
274-
_glassPaneElement = glassPaneElement;
273+
final DomElement glassPaneElement = domDocument.createElement(_glassPaneTagName);
274+
_glassPaneElement = glassPaneElement as html.Element;
275275
glassPaneElement.style
276276
..position = 'absolute'
277277
..top = '0'
@@ -285,7 +285,8 @@ class FlutterViewEmbedder {
285285

286286
// Create a [HostNode] under the glass pane element, and attach everything
287287
// there, instead of directly underneath the glass panel.
288-
final HostNode glassPaneElementHostNode = _createHostNode(glassPaneElement);
288+
final HostNode glassPaneElementHostNode = _createHostNode(glassPaneElement
289+
as html.Element);
289290
_glassPaneShadow = glassPaneElementHostNode;
290291

291292
// Don't allow the scene to receive pointer events.
@@ -335,8 +336,8 @@ class FlutterViewEmbedder {
335336
_sceneHostElement!.style.opacity = '0.3';
336337
}
337338

338-
PointerBinding.initInstance(glassPaneElement);
339-
KeyboardBinding.initInstance(glassPaneElement);
339+
PointerBinding.initInstance(glassPaneElement as html.Element);
340+
KeyboardBinding.initInstance(glassPaneElement as html.Element);
340341

341342
if (html.window.visualViewport == null && isWebKit) {
342343
// Older Safari versions sometimes give us bogus innerWidth/innerHeight

lib/web_ui/lib/src/engine/html/backdrop_filter.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:html' as html;
77
import 'package:ui/ui.dart' as ui;
88

99
import '../browser_detection.dart';
10+
import '../dom.dart';
1011
import '../util.dart';
1112
import '../vector_math.dart';
1213
import 'shaders/shader.dart';
@@ -25,9 +26,9 @@ class PersistedBackdropFilter extends PersistedContainerSurface
2526
/// [rootElement] is used to host child in front of [filterElement] that
2627
/// is transformed to cover background.
2728
@override
28-
html.Element? get childContainer => _childContainer;
29-
html.Element? _childContainer;
30-
html.Element? _filterElement;
29+
html.Element? get childContainer => _childContainer as html.Element?;
30+
DomElement? _childContainer;
31+
DomElement? _filterElement;
3132
ui.Rect? _activeClipBounds;
3233
// Cached inverted transform for [transform].
3334
late Matrix4 _invertedTransform;
@@ -43,10 +44,10 @@ class PersistedBackdropFilter extends PersistedContainerSurface
4344
}
4445

4546
@override
46-
html.Element createElement() {
47-
final html.Element element = defaultCreateElement('flt-backdrop')
48-
..style.transformOrigin = '0 0 0';
49-
_childContainer = html.Element.tag('flt-backdrop-interior');
47+
DomElement createElement() {
48+
final DomElement element = defaultCreateElement('flt-backdrop');
49+
element.style.transformOrigin = '0 0 0';
50+
_childContainer = createDomElement('flt-backdrop-interior');
5051
_childContainer!.style.position = 'absolute';
5152
if (debugExplainSurfaceStats) {
5253
// This creates an additional interior element. Count it too.
@@ -102,7 +103,7 @@ class PersistedBackdropFilter extends PersistedContainerSurface
102103
}
103104
parentSurface = parentSurface.parent;
104105
}
105-
final html.CssStyleDeclaration filterElementStyle = _filterElement!.style;
106+
final DomCSSStyleDeclaration filterElementStyle = _filterElement!.style;
106107
filterElementStyle
107108
..position = 'absolute'
108109
..left = '${left}px'

lib/web_ui/lib/src/engine/html/clip.dart

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:svg' as svg;
77

88
import 'package:ui/ui.dart' as ui;
99

10+
import '../dom.dart';
1011
import '../shadow.dart';
1112
import '../util.dart';
1213
import 'dom_canvas.dart';
@@ -23,8 +24,8 @@ mixin _DomClip on PersistedContainerSurface {
2324
/// [rootElement] is used to compensate for the coordinate system shift
2425
/// introduced by the [rootElement] translation.
2526
@override
26-
html.Element? get childContainer => _childContainer;
27-
html.Element? _childContainer;
27+
html.Element? get childContainer => _childContainer as html.Element?;
28+
DomElement? _childContainer;
2829

2930
@override
3031
void adoptElements(_DomClip oldSurface) {
@@ -34,9 +35,9 @@ mixin _DomClip on PersistedContainerSurface {
3435
}
3536

3637
@override
37-
html.Element createElement() {
38-
final html.Element element = defaultCreateElement('flt-clip');
39-
_childContainer = html.Element.tag('flt-clip-interior');
38+
DomElement createElement() {
39+
final DomElement element = defaultCreateElement('flt-clip');
40+
_childContainer = createDomElement('flt-clip-interior');
4041
if (debugExplainSurfaceStats) {
4142
// This creates an additional interior element. Count it too.
4243
surfaceStatsFor(this).allocatedDomNodeCount++;
@@ -96,7 +97,7 @@ class PersistedClipRect extends PersistedContainerSurface
9697
}
9798

9899
@override
99-
html.Element createElement() {
100+
DomElement createElement() {
100101
return super.createElement()..setAttribute('clip-type', 'rect');
101102
}
102103

@@ -153,7 +154,7 @@ class PersistedClipRRect extends PersistedContainerSurface
153154
}
154155

155156
@override
156-
html.Element createElement() {
157+
DomElement createElement() {
157158
return super.createElement()..setAttribute('clip-type', 'rrect');
158159
}
159160

@@ -238,7 +239,7 @@ class PersistedPhysicalShape extends PersistedContainerSurface
238239
}
239240

240241
@override
241-
html.Element createElement() {
242+
DomElement createElement() {
242243
return super.createElement()..setAttribute('clip-type', 'physical-shape');
243244
}
244245

@@ -467,7 +468,7 @@ class PersistedClipPath extends PersistedContainerSurface
467468
html.Element? _clipElement;
468469

469470
@override
470-
html.Element createElement() {
471+
DomElement createElement() {
471472
return defaultCreateElement('flt-clippath');
472473
}
473474

lib/web_ui/lib/src/engine/html/color_filter.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:ui/ui.dart' as ui;
1010
import '../browser_detection.dart';
1111
import '../canvaskit/color_filter.dart';
1212
import '../color_filter.dart';
13+
import '../dom.dart';
1314
import '../embedder.dart';
1415
import '../util.dart';
1516
import 'bitmap_canvas.dart';
@@ -23,12 +24,12 @@ class PersistedColorFilter extends PersistedContainerSurface
2324
: super(oldLayer);
2425

2526
@override
26-
html.Element? get childContainer => _childContainer;
27+
html.Element? get childContainer => _childContainer as html.Element?;
2728

2829
/// The dedicated child container element that's separate from the
2930
/// [rootElement] is used to compensate for the coordinate system shift
3031
/// introduced by the [rootElement] translation.
31-
html.Element? _childContainer;
32+
DomElement? _childContainer;
3233

3334
/// Color filter to apply to this surface.
3435
final ui.ColorFilter filter;
@@ -61,9 +62,9 @@ class PersistedColorFilter extends PersistedContainerSurface
6162
}
6263

6364
@override
64-
html.Element createElement() {
65-
final html.Element element = defaultCreateElement('flt-color-filter');
66-
final html.Element container = html.Element.tag('flt-filter-interior');
65+
DomElement createElement() {
66+
final DomElement element = defaultCreateElement('flt-color-filter');
67+
final DomElement container = createDomElement('flt-filter-interior');
6768
container.style.position = 'absolute';
6869
_childContainer = container;
6970
element.append(_childContainer!);

lib/web_ui/lib/src/engine/html/image_filter.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'dart:html' as html;
6-
75
import 'package:ui/ui.dart' as ui;
86

7+
import '../dom.dart';
98
import 'shaders/shader.dart';
109
import 'surface.dart';
1110

@@ -17,7 +16,7 @@ class PersistedImageFilter extends PersistedContainerSurface
1716
final ui.ImageFilter filter;
1817

1918
@override
20-
html.Element createElement() {
19+
DomElement createElement() {
2120
return defaultCreateElement('flt-image-filter');
2221
}
2322

lib/web_ui/lib/src/engine/html/offset.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'dart:html' as html;
6-
75
import 'package:ui/ui.dart' as ui;
86

7+
import '../dom.dart';
98
import '../util.dart';
109
import '../vector_math.dart';
1110
import 'surface.dart';
@@ -40,8 +39,8 @@ class PersistedOffset extends PersistedContainerSurface
4039
_localTransformInverse ??= Matrix4.translationValues(-dx, -dy, 0);
4140

4241
@override
43-
html.Element createElement() {
44-
final html.Element element = html.document.createElement('flt-offset');
42+
DomElement createElement() {
43+
final DomElement element = domDocument.createElement('flt-offset');
4544
setElementStyle(element, 'position', 'absolute');
4645
setElementStyle(element, 'transform-origin', '0 0 0');
4746
return element;

lib/web_ui/lib/src/engine/html/opacity.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'dart:html' as html;
6-
75
import 'package:ui/ui.dart' as ui;
86

7+
import '../dom.dart';
98
import '../util.dart';
109
import '../vector_math.dart';
1110
import 'surface.dart';
@@ -42,16 +41,16 @@ class PersistedOpacity extends PersistedContainerSurface
4241
Matrix4.translationValues(-offset.dx, -offset.dy, 0);
4342

4443
@override
45-
html.Element createElement() {
46-
final html.Element element = html.document.createElement('flt-opacity');
44+
DomElement createElement() {
45+
final DomElement element = domDocument.createElement('flt-opacity');
4746
setElementStyle(element, 'position', 'absolute');
4847
setElementStyle(element, 'transform-origin', '0 0 0');
4948
return element;
5049
}
5150

5251
@override
5352
void apply() {
54-
final html.Element element = rootElement!;
53+
final DomElement element = rootElement! as DomElement;
5554
setElementStyle(element, 'opacity', '${alpha / 255}');
5655
element.style.transform = 'translate(${offset.dx}px, ${offset.dy}px)';
5756
}

lib/web_ui/lib/src/engine/html/picture.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'dart:typed_data';
88

99
import 'package:ui/ui.dart' as ui;
1010

11+
import '../dom.dart';
1112
import '../engine_canvas.dart';
1213
import '../frame_reference.dart';
1314
import '../picture.dart';
@@ -121,8 +122,8 @@ class PersistedPicture extends PersistedLeafSurface {
121122
CrossFrameCache<html.HtmlElement>();
122123

123124
@override
124-
html.Element createElement() {
125-
final html.Element element = defaultCreateElement('flt-picture');
125+
DomElement createElement() {
126+
final DomElement element = defaultCreateElement('flt-picture');
126127

127128
// The DOM elements used to render pictures are used purely to put pixels on
128129
// the screen. They have no semantic information. If an assistive technology

0 commit comments

Comments
 (0)