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

Commit 2358215

Browse files
authored
[web] Render in custom target (#37738)
* Introduce FullScreenApplicationDom, and wire it to meta viewport, event handlers and hot restart. * Move internal stylesheet to HostNode from ViewEmbedder. * Add setHostStyles and Attribute to ApplicationDom. Use it in the embedder. * Move HotRestartCacheHandler to its own file. * Remove Safari hack for visualViewport. * No need to keep a ref to the viewport meta in full-screen. * Add applicationDom.attachGlassPane and use it in the Embedder. * Remove empty method bodies. * Add attachResourcesHost and use it from the embedder. * Removed some unused code. * Some more cleanup. * Add ResizeObserver JS interop API. * Add the CustomElementApplicationDom and wire it to the ViewEmbedder. * Add the DimensionsProvider classes. * Reimplement engine.window using the DimensionsProvider. * Delegate window metrics to engine window in html scene object. * Wire DimensionsProvider into engine.window. * Moved ApplicationDom into its own subdir. * Make DimensionsProvider also an Observer. Expose onResize Stream. * Delegate onResize and dpr from window to DimensionsObserver object. * Remove or make most ApplicationDom methods private. Expose single initializeHost. * Hook the new API. * dart format * ApplicationDom -> EmbeddingStrategy. * Attach pointer move events to glassPaneElement * Use offset positions for mouse events (relative to host element) rather than client (relative to viewport) * Update TouchAdapter to understand scrolling (simulate offsetX/Y) * Remove locale change handling from the embedding strategy. Also, remove DomSubscription handling from the hot_restart_cache_handler, now that it is not needed. * Move locale handling from the embedder to the platform dispatcher * Move some styles from host to glassPane so we are more friendly with external CSS. * Make analyzer fixes * Ensure DimensionsProvider is available in tests. * Initialize the view DimensionsProvider next to where the EmbeddingStrategy is decided (more logical) * Bring back the logic to support Firefox 83. * Fix pointer_binding test for new anchor point in the DOM. * Fix pointer_binding_test in Firefox. * Add an iterable way of accessing 'rules' From a CSSStyleSheet object. Also add the cssText getter for a CSSRule so we can parse it later. * Merge latest changes to host_node stylesheet. * Add an id to the StyleSheet element that we add, so it can be selected later (in tests). * Use the methods coming from browser_detection.dart to determine the browser runtime, instead of re-implementing them within the method. * Merge the Edge stylesheet into the general one. * Update tests so they can look at the CSS Rules that were added. * Format test * Try to use insertRule for -ms-reveal, and fallback in tests. * Test hot_restart_cache_handler Simplify API a little bit, make clear method private. * Test dimensions_provider. * Test full_page_dimensions_provider * Test custom_element_dimensions_provider * Test embedding_strategy. Make getDomCache util public. * Fixes and tests for *_embedding_strategy. * Move default text colors to our innermost style inside host_node (apply only to flt-scene-host). Remove code from the embedding strategies, and adjust tests. * Safari expands shorthand properties in CSSOM. Check individually for both font-family and font-size in Safari, rather than font in the host_node_test. * Add computeEventOffsetToTarget function, and use it. * Address PR comments. * Update licenses_flutter. * Remove DomCSSRuleList class and instead use Iterable of DomCSSRule * Make the embeddingStrategy final instead of late * Attach mouse/pointermove events to domWindow. * Rename DimensionsProvider.onHotRestart to .close, and slightly improve docs. * Fix compute physicalX/Y for TalkBack events. Extracted compute function to a helper file. * Clarify what does (and does not) support 3D transforms in the event_position_helper file. * Update licenses file
1 parent 234ab4c commit 2358215

26 files changed

+1951
-491
lines changed

ci/licenses_golden/licenses_flutter

+16
Original file line numberDiff line numberDiff line change
@@ -1962,6 +1962,7 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/platform_views/message_handle
19621962
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/platform_views/slots.dart + ../../../flutter/LICENSE
19631963
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/plugins.dart + ../../../flutter/LICENSE
19641964
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/pointer_binding.dart + ../../../flutter/LICENSE
1965+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/pointer_binding/event_position_helper.dart + ../../../flutter/LICENSE
19651966
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/pointer_converter.dart + ../../../flutter/LICENSE
19661967
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/profiler.dart + ../../../flutter/LICENSE
19671968
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/raw_keyboard.dart + ../../../flutter/LICENSE
@@ -2017,6 +2018,13 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/ulps.dart + ../../../flutter/
20172018
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/util.dart + ../../../flutter/LICENSE
20182019
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/validators.dart + ../../../flutter/LICENSE
20192020
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/vector_math.dart + ../../../flutter/LICENSE
2021+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart + ../../../flutter/LICENSE
2022+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/dimensions_provider.dart + ../../../flutter/LICENSE
2023+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/full_page_dimensions_provider.dart + ../../../flutter/LICENSE
2024+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy.dart + ../../../flutter/LICENSE
2025+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart + ../../../flutter/LICENSE
2026+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart + ../../../flutter/LICENSE
2027+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/hot_restart_cache_handler.dart + ../../../flutter/LICENSE
20202028
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/window.dart + ../../../flutter/LICENSE
20212029
ORIGIN: ../../../flutter/lib/web_ui/lib/text.dart + ../../../flutter/LICENSE
20222030
ORIGIN: ../../../flutter/lib/web_ui/lib/tile_mode.dart + ../../../flutter/LICENSE
@@ -4413,6 +4421,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/platform_views/message_handler.
44134421
FILE: ../../../flutter/lib/web_ui/lib/src/engine/platform_views/slots.dart
44144422
FILE: ../../../flutter/lib/web_ui/lib/src/engine/plugins.dart
44154423
FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_binding.dart
4424+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_binding/event_position_helper.dart
44164425
FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_converter.dart
44174426
FILE: ../../../flutter/lib/web_ui/lib/src/engine/profiler.dart
44184427
FILE: ../../../flutter/lib/web_ui/lib/src/engine/raw_keyboard.dart
@@ -4468,6 +4477,13 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/ulps.dart
44684477
FILE: ../../../flutter/lib/web_ui/lib/src/engine/util.dart
44694478
FILE: ../../../flutter/lib/web_ui/lib/src/engine/validators.dart
44704479
FILE: ../../../flutter/lib/web_ui/lib/src/engine/vector_math.dart
4480+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart
4481+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/dimensions_provider.dart
4482+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/full_page_dimensions_provider.dart
4483+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy.dart
4484+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart
4485+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart
4486+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/hot_restart_cache_handler.dart
44714487
FILE: ../../../flutter/lib/web_ui/lib/src/engine/window.dart
44724488
FILE: ../../../flutter/lib/web_ui/lib/text.dart
44734489
FILE: ../../../flutter/lib/web_ui/lib/tile_mode.dart

lib/web_ui/lib/src/engine.dart

+8
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ export 'engine/platform_views/message_handler.dart';
122122
export 'engine/platform_views/slots.dart';
123123
export 'engine/plugins.dart';
124124
export 'engine/pointer_binding.dart';
125+
export 'engine/pointer_binding/event_position_helper.dart';
125126
export 'engine/pointer_converter.dart';
126127
export 'engine/profiler.dart';
127128
export 'engine/raw_keyboard.dart';
@@ -170,4 +171,11 @@ export 'engine/text_editing/text_editing.dart';
170171
export 'engine/util.dart';
171172
export 'engine/validators.dart';
172173
export 'engine/vector_math.dart';
174+
export 'engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart';
175+
export 'engine/view_embedder/dimensions_provider/dimensions_provider.dart';
176+
export 'engine/view_embedder/dimensions_provider/full_page_dimensions_provider.dart';
177+
export 'engine/view_embedder/embedding_strategy/custom_element_embedding_strategy.dart';
178+
export 'engine/view_embedder/embedding_strategy/embedding_strategy.dart';
179+
export 'engine/view_embedder/embedding_strategy/full_page_embedding_strategy.dart';
180+
export 'engine/view_embedder/hot_restart_cache_handler.dart';
173181
export 'engine/window.dart';

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

+82-4
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ class DomEvent {}
174174

175175
extension DomEventExtension on DomEvent {
176176
external DomEventTarget? get target;
177+
external DomEventTarget? get currentTarget;
177178
external double? get timeStamp;
178179
external String get type;
179180
external void preventDefault();
@@ -461,6 +462,9 @@ class DomHTMLElement extends DomElement {}
461462

462463
extension DomHTMLElementExtension on DomHTMLElement {
463464
external double get offsetWidth;
465+
external double get offsetLeft;
466+
external double get offsetTop;
467+
external DomHTMLElement? get offsetParent;
464468
}
465469

466470
@JS()
@@ -1089,6 +1093,8 @@ extension DomMouseEventExtension on DomMouseEvent {
10891093
external double get clientY;
10901094
external double get offsetX;
10911095
external double get offsetY;
1096+
external double get pageX;
1097+
external double get pageY;
10921098
DomPoint get client => DomPoint(clientX, clientY);
10931099
DomPoint get offset => DomPoint(offsetX, offsetY);
10941100
external double get button;
@@ -1312,7 +1318,10 @@ class DomStyleSheet {}
13121318
class DomCSSStyleSheet extends DomStyleSheet {}
13131319

13141320
extension DomCSSStyleSheetExtension on DomCSSStyleSheet {
1315-
external DomCSSRuleList get cssRules;
1321+
Iterable<DomCSSRule> get cssRules =>
1322+
createDomListWrapper<DomCSSRule>(js_util
1323+
.getProperty<_DomList>(this, 'cssRules'));
1324+
13161325
double insertRule(String rule, [int? index]) => js_util
13171326
.callMethod<double>(
13181327
this, 'insertRule',
@@ -1323,6 +1332,12 @@ extension DomCSSStyleSheetExtension on DomCSSStyleSheet {
13231332
@staticInterop
13241333
class DomCSSRule {}
13251334

1335+
@JS()
1336+
@staticInterop
1337+
extension DomCSSRuleExtension on DomCSSRule {
1338+
external String get cssText;
1339+
}
1340+
13261341
@JS()
13271342
@staticInterop
13281343
class DomScreen {}
@@ -1420,12 +1435,75 @@ extension DomMessageChannelExtension on DomMessageChannel {
14201435
external DomMessagePort get port2;
14211436
}
14221437

1438+
/// ResizeObserver JS binding.
1439+
///
1440+
/// See: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver
14231441
@JS()
14241442
@staticInterop
1425-
class DomCSSRuleList {}
1443+
abstract class DomResizeObserver {}
14261444

1427-
extension DomCSSRuleListExtension on DomCSSRuleList {
1428-
external double get length;
1445+
/// Creates a DomResizeObserver with a callback.
1446+
///
1447+
/// Internally converts the `List<dynamic>` of entries into the expected
1448+
/// `List<DomResizeObserverEntry>`
1449+
DomResizeObserver? createDomResizeObserver(DomResizeObserverCallbackFn fn) {
1450+
return domCallConstructorString('ResizeObserver', <Object?>[
1451+
allowInterop(
1452+
(List<dynamic> entries, DomResizeObserver observer) {
1453+
fn(entries.cast<DomResizeObserverEntry>(), observer);
1454+
}
1455+
),
1456+
]) as DomResizeObserver?;
1457+
}
1458+
1459+
/// ResizeObserver instance methods.
1460+
///
1461+
/// See: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#instance_methods
1462+
extension DomResizeObserverExtension on DomResizeObserver {
1463+
external void disconnect();
1464+
external void observe(DomElement target, [DomResizeObserverObserveOptions options]);
1465+
external void unobserve(DomElement target);
1466+
}
1467+
1468+
/// Options object passed to the `observe` method of a [DomResizeObserver].
1469+
///
1470+
/// See: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe#parameters
1471+
@JS()
1472+
@staticInterop
1473+
@anonymous
1474+
abstract class DomResizeObserverObserveOptions {
1475+
external factory DomResizeObserverObserveOptions({
1476+
String box,
1477+
});
1478+
}
1479+
1480+
/// Type of the function used to create a Resize Observer.
1481+
typedef DomResizeObserverCallbackFn = void Function(List<DomResizeObserverEntry> entries, DomResizeObserver observer);
1482+
1483+
/// The object passed to the [DomResizeObserverCallbackFn], which allows access to the new dimensions of the observed element.
1484+
///
1485+
/// See: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry
1486+
@JS()
1487+
@staticInterop
1488+
abstract class DomResizeObserverEntry {}
1489+
1490+
/// ResizeObserverEntry instance properties.
1491+
///
1492+
/// See: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry#instance_properties
1493+
extension DomResizeObserverEntryExtension on DomResizeObserverEntry {
1494+
/// A DOMRectReadOnly object containing the new size of the observed element when the callback is run.
1495+
///
1496+
/// Note that this is better supported than the above two properties, but it
1497+
/// is left over from an earlier implementation of the Resize Observer API, is
1498+
/// still included in the spec for web compat reasons, and may be deprecated
1499+
/// in future versions.
1500+
external DomRectReadOnly get contentRect;
1501+
external DomElement get target;
1502+
// Some more future getters:
1503+
//
1504+
// borderBoxSize
1505+
// contentBoxSize
1506+
// devicePixelContentBoxSize
14291507
}
14301508

14311509
/// A factory to create `TrustedTypePolicy` objects.

0 commit comments

Comments
 (0)