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

Commit a127b5b

Browse files
committed
Add more child filecycle tests
1 parent d0897c3 commit a127b5b

2 files changed

Lines changed: 91 additions & 5 deletions

File tree

lib/web_ui/lib/src/engine/surface/scene_builder.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ class SurfaceSceneBuilder implements ui.SceneBuilder {
5050
return surface;
5151
}
5252

53+
/// Adds [surface] to the surface tree.
54+
///
55+
/// This is used by tests.
56+
void debugAddSurface(PersistedSurface surface) {
57+
if (assertionsEnabled) {
58+
_addSurface(surface);
59+
}
60+
}
61+
5362
void _addSurface(PersistedSurface surface) {
5463
_adoptSurface(surface);
5564
}

lib/web_ui/test/engine/surface/surface_test.dart

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,28 @@ void main() {
142142
// A A
143143
// | |
144144
// B ┌──>C
145-
// | │
146-
// C ────┘
145+
// | │ |
146+
// C ────┘ L
147+
// |
148+
// L
149+
//
150+
// Layer "L" is a logging layer used to track what would happen to the
151+
// child of "C" as it's being dragged around the tree. For example, we
152+
// check that the child doesn't get discarded by mistake.
147153
test('reparents DOM element when updated', () {
148-
final SceneBuilder builder1 = SceneBuilder();
154+
final _LoggingTestSurface logger = _LoggingTestSurface();
155+
final SurfaceSceneBuilder builder1 = SurfaceSceneBuilder();
149156
final PersistedTransform a1 =
150157
builder1.pushTransform(Matrix4.identity().storage);
151158
final PersistedOpacity b1 = builder1.pushOpacity(100);
152159
final PersistedTransform c1 =
153160
builder1.pushTransform(Matrix4.identity().storage);
161+
builder1.debugAddSurface(logger);
154162
builder1.pop();
155163
builder1.pop();
156164
builder1.pop();
157165
builder1.build();
166+
expect(logger.log, <String>['build', 'createElement', 'apply']);
158167

159168
final html.Element elementA = a1.rootElement;
160169
final html.Element elementB = b1.rootElement;
@@ -163,14 +172,21 @@ void main() {
163172
expect(elementC.parent, elementB);
164173
expect(elementB.parent, elementA);
165174

166-
final SceneBuilder builder2 = SceneBuilder();
175+
final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder();
167176
final PersistedTransform a2 =
168177
builder2.pushTransform(Matrix4.identity().storage, oldLayer: a1);
169178
final PersistedTransform c2 =
170179
builder2.pushTransform(Matrix4.identity().storage, oldLayer: c1);
180+
builder2.addRetained(logger);
171181
builder2.pop();
172182
builder2.pop();
183+
184+
expect(c1.isPendingUpdate, true);
185+
expect(c2.isCreated, true);
173186
builder2.build();
187+
expect(logger.log, <String>['build', 'createElement', 'apply', 'retain']);
188+
expect(c1.isReleased, true);
189+
expect(c2.isActive, true);
174190

175191
expect(a2.rootElement, elementA);
176192
expect(b1.rootElement, isNull);
@@ -189,6 +205,8 @@ void main() {
189205
final html.Element element = opacityLayer.rootElement;
190206

191207
final SceneBuilder builder2 = SceneBuilder();
208+
209+
expect(opacityLayer.isActive, true);
192210
builder2.addRetained(opacityLayer);
193211
expect(opacityLayer.isPendingRetention, true);
194212

@@ -198,20 +216,25 @@ void main() {
198216
});
199217

200218
test('revives released surface when retained', () {
201-
final SceneBuilder builder1 = SceneBuilder();
219+
final SurfaceSceneBuilder builder1 = SurfaceSceneBuilder();
202220
final PersistedOpacity opacityLayer = builder1.pushOpacity(100);
221+
final _LoggingTestSurface logger = _LoggingTestSurface();
222+
builder1.debugAddSurface(logger);
203223
builder1.pop();
204224
builder1.build();
205225
expect(opacityLayer.isActive, true);
226+
expect(logger.log, <String>['build', 'createElement', 'apply']);
206227
final html.Element element = opacityLayer.rootElement;
207228

208229
SceneBuilder().build();
209230
expect(opacityLayer.isReleased, true);
210231
expect(opacityLayer.rootElement, isNull);
232+
expect(logger.log, <String>['build', 'createElement', 'apply', 'discard']);
211233

212234
final SceneBuilder builder2 = SceneBuilder();
213235
builder2.addRetained(opacityLayer);
214236
expect(opacityLayer.isCreated, true); // revived
237+
expect(logger.log, <String>['build', 'createElement', 'apply', 'discard', 'revive']);
215238

216239
builder2.build();
217240
expect(opacityLayer.isActive, true);
@@ -329,3 +352,57 @@ void main() {
329352
});
330353
});
331354
}
355+
356+
class _LoggingTestSurface extends PersistedContainerSurface {
357+
final List<String> log = <String>[];
358+
359+
_LoggingTestSurface() : super(null);
360+
361+
void build() {
362+
log.add('build');
363+
super.build();
364+
}
365+
366+
@override
367+
void apply() {
368+
log.add('apply');
369+
}
370+
371+
@override
372+
html.Element createElement() {
373+
log.add('createElement');
374+
return html.Element.tag('flt-test-layer');
375+
}
376+
377+
@override
378+
void update(_LoggingTestSurface oldSurface) {
379+
log.add('update');
380+
super.update(oldSurface);
381+
}
382+
383+
void adoptElements(covariant PersistedSurface oldSurface) {
384+
log.add('adoptElements');
385+
super.adoptElements(oldSurface);
386+
}
387+
388+
void retain() {
389+
log.add('retain');
390+
super.retain();
391+
}
392+
393+
@override
394+
void discard() {
395+
log.add('discard');
396+
super.discard();
397+
}
398+
399+
void revive() {
400+
log.add('revive');
401+
super.revive();
402+
}
403+
404+
@override
405+
double matchForUpdate(PersistedSurface existingSurface) {
406+
return 1.0;
407+
}
408+
}

0 commit comments

Comments
 (0)