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

Commit d83f941

Browse files
committed
Make custom element dimensions provider broadcast null events, similar to the full screen one.
1 parent 9f628f8 commit d83f941

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,27 @@ import 'dimensions_provider.dart';
1717
/// All the measurements returned from this class are potentially *expensive*,
1818
/// and should be cached as needed. Every call to every method on this class
1919
/// WILL perform actual DOM measurements.
20+
///
21+
/// This broadcasts `null` size events, to match the implementation of the
22+
/// FullPageDimensionsProvider, but it could broadcast the size coming from the
23+
/// DomResizeObserverEntry. Further changes in the engine are required for this
24+
/// to be effective.
2025
class CustomElementDimensionsProvider extends DimensionsProvider {
2126
/// Creates a [CustomElementDimensionsProvider] from a [_hostElement].
2227
CustomElementDimensionsProvider(this._hostElement) {
2328
// Send a resize event when the page DPR changes.
2429
_dprChangeStreamSubscription = DisplayDprStream.instance.dprChanged.listen((_) {
25-
_broadcastSize(computePhysicalSize());
30+
_broadcastSize(null);
2631
});
2732

2833
// Hook up a resize observer on the hostElement (if supported!).
2934
_hostElementResizeObserver = createDomResizeObserver((
3035
List<DomResizeObserverEntry> entries,
3136
DomResizeObserver _,
3237
) {
33-
entries
34-
.map((DomResizeObserverEntry entry) =>
35-
ui.Size(entry.contentRect.width, entry.contentRect.height))
36-
.forEach(_broadcastSize);
38+
for (final DomResizeObserverEntry _ in entries) {
39+
_broadcastSize(null);
40+
}
3741
});
3842

3943
assert(() {
@@ -53,11 +57,11 @@ class CustomElementDimensionsProvider extends DimensionsProvider {
5357
// Handle resize events
5458
late DomResizeObserver? _hostElementResizeObserver;
5559
late StreamSubscription<double>? _dprChangeStreamSubscription;
56-
final StreamController<ui.Size> _onResizeStreamController =
57-
StreamController<ui.Size>.broadcast();
60+
final StreamController<ui.Size?> _onResizeStreamController =
61+
StreamController<ui.Size?>.broadcast();
5862

5963
// Broadcasts the last seen `Size`.
60-
void _broadcastSize(ui.Size size) {
64+
void _broadcastSize(ui.Size? size) {
6165
_onResizeStreamController.add(size);
6266
}
6367

@@ -72,7 +76,7 @@ class CustomElementDimensionsProvider extends DimensionsProvider {
7276
}
7377

7478
@override
75-
Stream<ui.Size> get onResize => _onResizeStreamController.stream;
79+
Stream<ui.Size?> get onResize => _onResizeStreamController.stream;
7680

7781
@override
7882
ui.Size computePhysicalSize() {

lib/web_ui/test/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider_test.dart

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,23 +109,28 @@ void doTests() {
109109
});
110110

111111
test('funnels resize events on sizeSource', () async {
112+
EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(2.7);
113+
112114
sizeSource
113115
..style.width = '100px'
114116
..style.height = '100px';
115117

116-
expect(await provider.onResize.first, const ui.Size(100, 100));
118+
expect(provider.onResize.first, completes);
119+
expect(provider.computePhysicalSize(), const ui.Size(270, 270));
117120

118121
sizeSource
119122
..style.width = '200px'
120123
..style.height = '200px';
121124

122-
expect(await provider.onResize.first, const ui.Size(200, 200));
125+
expect(provider.onResize.first, completes);
126+
expect(provider.computePhysicalSize(), const ui.Size(540, 540));
123127

124128
sizeSource
125129
..style.width = '300px'
126130
..style.height = '300px';
127131

128-
expect(await provider.onResize.first, const ui.Size(300, 300));
132+
expect(provider.onResize.first, completes);
133+
expect(provider.computePhysicalSize(), const ui.Size(810, 810));
129134
});
130135

131136
test('funnels DPR change events too', () async {
@@ -140,14 +145,15 @@ void doTests() {
140145
final CustomElementDimensionsProvider provider = CustomElementDimensionsProvider(sizeSource);
141146

142147
// The size that will be emitted by the provider eventually
143-
final Future<ui.Size> newSize = provider.onResize.first;
148+
final Future<ui.Size?> newSize = provider.onResize.first;
144149

145150
// Set the mock DPR value
146151
EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(3.2);
147152
// Simulate the mediaQuery change event from the browser
148153
eventTarget.dispatchEvent(createDomEvent('Event', 'change'));
149154

150-
expect(await newSize, const ui.Size(10, 10) * 3.2);
155+
expect(newSize, completes);
156+
expect(provider.computePhysicalSize(), const ui.Size(32, 32));
151157
});
152158

153159
test('closed by onHotRestart', () async {

0 commit comments

Comments
 (0)