@@ -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