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

Commit f40fc90

Browse files
author
auto-submit[bot]
committed
Revert "[web] Fix Scene clip bounds. Trigger resize on DPR Change. (#50161)"
This reverts commit 880bf52.
1 parent e116f89 commit f40fc90

File tree

11 files changed

+48
-226
lines changed

11 files changed

+48
-226
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6134,7 +6134,6 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/vector_math.dart + ../../../f
61346134
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart + ../../../flutter/LICENSE
61356135
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/dimensions_provider.dart + ../../../flutter/LICENSE
61366136
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/full_page_dimensions_provider.dart + ../../../flutter/LICENSE
6137-
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/display_dpr_stream.dart + ../../../flutter/LICENSE
61386137
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart + ../../../flutter/LICENSE
61396138
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy.dart + ../../../flutter/LICENSE
61406139
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart + ../../../flutter/LICENSE
@@ -8998,7 +8997,6 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/vector_math.dart
89988997
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart
89998998
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/dimensions_provider.dart
90008999
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dimensions_provider/full_page_dimensions_provider.dart
9001-
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/display_dpr_stream.dart
90029000
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart
90039001
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/custom_element_embedding_strategy.dart
90049002
FILE: ../../../flutter/lib/web_ui/lib/src/engine/view_embedder/embedding_strategy/embedding_strategy.dart

lib/web_ui/lib/src/engine.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ export 'engine/vector_math.dart';
190190
export 'engine/view_embedder/dimensions_provider/custom_element_dimensions_provider.dart';
191191
export 'engine/view_embedder/dimensions_provider/dimensions_provider.dart';
192192
export 'engine/view_embedder/dimensions_provider/full_page_dimensions_provider.dart';
193-
export 'engine/view_embedder/display_dpr_stream.dart';
194193
export 'engine/view_embedder/dom_manager.dart';
195194
export 'engine/view_embedder/embedding_strategy/custom_element_embedding_strategy.dart';
196195
export 'engine/view_embedder/embedding_strategy/embedding_strategy.dart';

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,9 @@ class PersistedScene extends PersistedContainerSurface {
4545

4646
@override
4747
void recomputeTransformAndClip() {
48-
// The scene clip is the size of the entire window **in Logical pixels**.
49-
//
50-
// Even though the majority of the engine uses `physicalSize`, there are some
51-
// bits (like the HTML renderer, or dynamic view sizing) that are implemented
52-
// using CSS, and CSS operates in logical pixels.
53-
//
54-
// See also: [EngineFlutterView.resize].
55-
final ui.Size bounds = window.physicalSize / window.devicePixelRatio;
56-
localClipBounds = ui.Rect.fromLTRB(0, 0, bounds.width, bounds.height);
48+
// The scene clip is the size of the entire window.
49+
final ui.Size screen = window.physicalSize;
50+
localClipBounds = ui.Rect.fromLTRB(0, 0, screen.width, screen.height);
5751
projectedClip = null;
5852
}
5953

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

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'dart:async';
66

7-
import 'package:ui/src/engine/display.dart';
87
import 'package:ui/src/engine/dom.dart';
98
import 'package:ui/src/engine/window.dart';
109
import 'package:ui/ui.dart' as ui show Size;
@@ -13,36 +12,21 @@ import 'dimensions_provider.dart';
1312

1413
/// This class provides observable, real-time dimensions of a host element.
1514
///
16-
/// This class needs a `Stream` of `devicePixelRatio` changes, like the one
17-
/// provided by [DisplayDprStream], because html resize observers do not report
18-
/// DPR changes.
19-
///
2015
/// All the measurements returned from this class are potentially *expensive*,
2116
/// and should be cached as needed. Every call to every method on this class
2217
/// WILL perform actual DOM measurements.
23-
///
24-
/// This broadcasts `null` size events, to match the implementation of the
25-
/// FullPageDimensionsProvider, but it could broadcast the size coming from the
26-
/// DomResizeObserverEntry. Further changes in the engine are required for this
27-
/// to be effective.
2818
class CustomElementDimensionsProvider extends DimensionsProvider {
2919
/// Creates a [CustomElementDimensionsProvider] from a [_hostElement].
30-
CustomElementDimensionsProvider(this._hostElement, {
31-
Stream<double>? onDprChange,
32-
}) {
33-
// Send a resize event when the page DPR changes.
34-
_dprChangeStreamSubscription = onDprChange?.listen((_) {
35-
_broadcastSize(null);
36-
});
37-
20+
CustomElementDimensionsProvider(this._hostElement) {
3821
// Hook up a resize observer on the hostElement (if supported!).
3922
_hostElementResizeObserver = createDomResizeObserver((
4023
List<DomResizeObserverEntry> entries,
4124
DomResizeObserver _,
4225
) {
43-
for (final DomResizeObserverEntry _ in entries) {
44-
_broadcastSize(null);
45-
}
26+
entries
27+
.map((DomResizeObserverEntry entry) =>
28+
ui.Size(entry.contentRect.width, entry.contentRect.height))
29+
.forEach(_broadcastSize);
4630
});
4731

4832
assert(() {
@@ -61,12 +45,11 @@ class CustomElementDimensionsProvider extends DimensionsProvider {
6145

6246
// Handle resize events
6347
late DomResizeObserver? _hostElementResizeObserver;
64-
late StreamSubscription<double>? _dprChangeStreamSubscription;
65-
final StreamController<ui.Size?> _onResizeStreamController =
66-
StreamController<ui.Size?>.broadcast();
48+
final StreamController<ui.Size> _onResizeStreamController =
49+
StreamController<ui.Size>.broadcast();
6750

6851
// Broadcasts the last seen `Size`.
69-
void _broadcastSize(ui.Size? size) {
52+
void _broadcastSize(ui.Size size) {
7053
_onResizeStreamController.add(size);
7154
}
7255

@@ -75,17 +58,16 @@ class CustomElementDimensionsProvider extends DimensionsProvider {
7558
super.close();
7659
_hostElementResizeObserver?.disconnect();
7760
// ignore:unawaited_futures
78-
_dprChangeStreamSubscription?.cancel();
79-
// ignore:unawaited_futures
8061
_onResizeStreamController.close();
8162
}
8263

8364
@override
84-
Stream<ui.Size?> get onResize => _onResizeStreamController.stream;
65+
Stream<ui.Size> get onResize => _onResizeStreamController.stream;
8566

8667
@override
8768
ui.Size computePhysicalSize() {
88-
final double devicePixelRatio = EngineFlutterDisplay.instance.devicePixelRatio;
69+
final double devicePixelRatio = getDevicePixelRatio();
70+
8971
return ui.Size(
9072
_hostElement.clientWidth * devicePixelRatio,
9173
_hostElement.clientHeight * devicePixelRatio,

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

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import 'dart:async';
66

77
import 'package:meta/meta.dart';
8-
import 'package:ui/src/engine/dom.dart';
9-
import 'package:ui/src/engine/view_embedder/display_dpr_stream.dart';
108
import 'package:ui/src/engine/window.dart';
119
import 'package:ui/ui.dart' as ui show Size;
1210

11+
import '../../display.dart';
12+
import '../../dom.dart';
1313
import 'custom_element_dimensions_provider.dart';
1414
import 'full_page_dimensions_provider.dart';
1515

@@ -32,15 +32,18 @@ abstract class DimensionsProvider {
3232
/// Creates the appropriate DimensionsProvider depending on the incoming [hostElement].
3333
factory DimensionsProvider.create({DomElement? hostElement}) {
3434
if (hostElement != null) {
35-
return CustomElementDimensionsProvider(
36-
hostElement,
37-
onDprChange: DisplayDprStream.instance.dprChanged,
38-
);
35+
return CustomElementDimensionsProvider(hostElement);
3936
} else {
4037
return FullPageDimensionsProvider();
4138
}
4239
}
4340

41+
/// Returns the DPI reported by the browser.
42+
double getDevicePixelRatio() {
43+
// This is overridable in tests.
44+
return EngineFlutterDisplay.instance.devicePixelRatio;
45+
}
46+
4447
/// Returns the [ui.Size] of the "viewport".
4548
///
4649
/// This function is expensive. It triggers browser layout if there are
@@ -54,16 +57,6 @@ abstract class DimensionsProvider {
5457
);
5558

5659
/// Returns a Stream with the changes to [ui.Size] (when cheap to get).
57-
///
58-
/// Currently this Stream always returns `null` measurements because the
59-
/// resize event that we use for [FullPageDimensionsProvider] does not contain
60-
/// the new size, so users of this Stream everywhere immediately retrieve the
61-
/// new `physicalSize` from the window.
62-
///
63-
/// The [CustomElementDimensionsProvider] *could* broadcast the new size, but
64-
/// to keep both implementations consistent (and their consumers), for now all
65-
/// events from this Stream are going to be `null` (until we find a performant
66-
/// way to retrieve the dimensions in full-page mode).
6760
Stream<ui.Size?> get onResize;
6861

6962
/// Whether the [DimensionsProvider] instance has been closed or not.

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import 'dart:async';
66

77
import 'package:ui/src/engine/browser_detection.dart';
8-
import 'package:ui/src/engine/display.dart';
98
import 'package:ui/src/engine/dom.dart';
109
import 'package:ui/src/engine/window.dart';
1110
import 'package:ui/ui.dart' as ui show Size;
@@ -68,7 +67,7 @@ class FullPageDimensionsProvider extends DimensionsProvider {
6867
late double windowInnerWidth;
6968
late double windowInnerHeight;
7069
final DomVisualViewport? viewport = domWindow.visualViewport;
71-
final double devicePixelRatio = EngineFlutterDisplay.instance.devicePixelRatio;
70+
final double devicePixelRatio = getDevicePixelRatio();
7271

7372
if (viewport != null) {
7473
if (operatingSystem == OperatingSystem.iOs) {
@@ -103,7 +102,7 @@ class FullPageDimensionsProvider extends DimensionsProvider {
103102
double physicalHeight,
104103
bool isEditingOnMobile,
105104
) {
106-
final double devicePixelRatio = EngineFlutterDisplay.instance.devicePixelRatio;
105+
final double devicePixelRatio = getDevicePixelRatio();
107106
final DomVisualViewport? viewport = domWindow.visualViewport;
108107
late double windowInnerHeight;
109108

lib/web_ui/lib/src/engine/view_embedder/display_dpr_stream.dart

Lines changed: 0 additions & 93 deletions
This file was deleted.

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

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +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+
@TestOn('browser')
6+
library;
7+
58
import 'dart:async';
69

710
import 'package:test/bootstrap/browser.dart';
@@ -106,48 +109,23 @@ void doTests() {
106109
});
107110

108111
test('funnels resize events on sizeSource', () async {
109-
EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(2.7);
110-
111112
sizeSource
112113
..style.width = '100px'
113114
..style.height = '100px';
114115

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

118118
sizeSource
119119
..style.width = '200px'
120120
..style.height = '200px';
121121

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

125124
sizeSource
126125
..style.width = '300px'
127126
..style.height = '300px';
128127

129-
expect(provider.onResize.first, completes);
130-
expect(provider.computePhysicalSize(), const ui.Size(810, 810));
131-
});
132-
133-
test('funnels DPR change events too', () async {
134-
// Override the source of DPR events...
135-
final StreamController<double> dprController =
136-
StreamController<double>.broadcast();
137-
138-
// Inject the dprController stream into the CustomElementDimensionsProvider.
139-
final CustomElementDimensionsProvider provider =
140-
CustomElementDimensionsProvider(
141-
sizeSource,
142-
onDprChange: dprController.stream,
143-
);
144-
145-
// Set and broadcast the mock DPR value
146-
EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(3.2);
147-
dprController.add(3.2);
148-
149-
expect(provider.onResize.first, completes);
150-
expect(provider.computePhysicalSize(), const ui.Size(32, 32));
128+
expect(await provider.onResize.first, const ui.Size(300, 300));
151129
});
152130

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

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +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+
@TestOn('browser')
6+
library;
7+
58
import 'package:test/bootstrap/browser.dart';
69
import 'package:test/test.dart';
710
import 'package:ui/src/engine.dart';
@@ -28,4 +31,15 @@ void doTests() {
2831
expect(provider, isA<CustomElementDimensionsProvider>());
2932
});
3033
});
34+
35+
group('getDevicePixelRatio', () {
36+
test('Returns the correct pixelRatio', () async {
37+
// Override the DPI to something known, but weird...
38+
EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(33930);
39+
40+
final DimensionsProvider provider = DimensionsProvider.create();
41+
42+
expect(provider.getDevicePixelRatio(), 33930);
43+
});
44+
});
3145
}

0 commit comments

Comments
 (0)