@@ -114,6 +114,384 @@ o.spec("domFor(vnode)", function() {
114114 done ( )
115115 } )
116116 } )
117+ o ( "works multiple vnodes with onbeforeremove (1/3)" , function ( done ) {
118+ let thenCBA , thenCBB , thenCBC
119+ const onbeforeremoveA = o . spy ( function onbeforeremove ( ) {
120+ return { then ( resolve ) { thenCBA = resolve } }
121+ } )
122+ const onbeforeremoveB = o . spy ( function onbeforeremove ( ) {
123+ return { then ( resolve ) { thenCBB = resolve } }
124+ } )
125+ const onbeforeremoveC = o . spy ( function onbeforeremove ( ) {
126+ return { then ( resolve ) { thenCBC = resolve } }
127+ } )
128+ // to avoid updating internal nodes only, vnodes have key attributes
129+ const A = fragment ( { key : 1 , onbeforeremove : onbeforeremoveA } , [ m ( "a1" ) , m ( "a2" ) ] )
130+ const B = fragment ( { key : 2 , onbeforeremove : onbeforeremoveB } , [ m ( "b1" ) , m ( "b2" ) ] )
131+ const C = fragment ( { key : 3 , onbeforeremove : onbeforeremoveC } , [ m ( "c1" ) , m ( "c2" ) ] )
132+
133+ render ( root , [ A ] )
134+ o ( onbeforeremoveA . callCount ) . equals ( 0 )
135+ o ( onbeforeremoveB . callCount ) . equals ( 0 )
136+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
137+
138+ render ( root , [ B ] )
139+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
140+ o ( onbeforeremoveB . callCount ) . equals ( 0 )
141+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
142+
143+ render ( root , [ C ] )
144+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
145+ o ( onbeforeremoveB . callCount ) . equals ( 1 )
146+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
147+
148+ render ( root , [ ] )
149+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
150+ o ( onbeforeremoveB . callCount ) . equals ( 1 )
151+ o ( onbeforeremoveC . callCount ) . equals ( 1 )
152+
153+ // not resolved
154+ o ( root . childNodes . length ) . equals ( 6 )
155+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
156+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
157+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
158+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
159+ o ( root . childNodes [ 4 ] . nodeName ) . equals ( "C1" )
160+ o ( root . childNodes [ 5 ] . nodeName ) . equals ( "C2" )
161+
162+ const iterA = domFor ( A )
163+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
164+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
165+ o ( iterA . next ( ) . done ) . deepEquals ( true )
166+
167+ const iterB = domFor ( B )
168+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
169+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
170+ o ( iterB . next ( ) . done ) . deepEquals ( true )
171+
172+ const iterC = domFor ( C )
173+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
174+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
175+ o ( iterC . next ( ) . done ) . deepEquals ( true )
176+
177+ callAsync ( function ( ) {
178+ // not resolved yet
179+ o ( root . childNodes . length ) . equals ( 6 )
180+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
181+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
182+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
183+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
184+ o ( root . childNodes [ 4 ] . nodeName ) . equals ( "C1" )
185+ o ( root . childNodes [ 5 ] . nodeName ) . equals ( "C2" )
186+
187+ const iterA = domFor ( A )
188+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
189+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
190+ o ( iterA . next ( ) . done ) . deepEquals ( true )
191+
192+ const iterB = domFor ( B )
193+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
194+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
195+ o ( iterB . next ( ) . done ) . deepEquals ( true )
196+
197+ const iterC = domFor ( C )
198+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
199+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
200+ o ( iterC . next ( ) . done ) . deepEquals ( true )
201+
202+ // resolve B
203+ thenCBB ( )
204+ callAsync ( function ( ) {
205+ o ( root . childNodes . length ) . equals ( 4 )
206+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
207+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
208+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "C1" )
209+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "C2" )
210+
211+ const iterA = domFor ( A )
212+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
213+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
214+ o ( iterA . next ( ) . done ) . deepEquals ( true )
215+
216+ const iterC = domFor ( C )
217+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
218+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
219+ o ( iterC . next ( ) . done ) . deepEquals ( true )
220+
221+ // resolve C
222+ thenCBC ( )
223+ callAsync ( function ( ) {
224+ o ( root . childNodes . length ) . equals ( 2 )
225+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
226+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
227+
228+ const iterA = domFor ( A )
229+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
230+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
231+ o ( iterA . next ( ) . done ) . deepEquals ( true )
232+
233+ // resolve A
234+ thenCBA ( )
235+ callAsync ( function ( ) {
236+ o ( root . childNodes . length ) . equals ( 0 )
237+ done ( )
238+ } )
239+ } )
240+ } )
241+ } )
242+ } )
243+ o ( "works multiple vnodes with onbeforeremove (2/3)" , function ( done ) {
244+ let thenCBA , thenCBB , thenCBC
245+ const onbeforeremoveA = o . spy ( function onbeforeremove ( ) {
246+ return { then ( resolve ) { thenCBA = resolve } }
247+ } )
248+ const onbeforeremoveB = o . spy ( function onbeforeremove ( ) {
249+ return { then ( resolve ) { thenCBB = resolve } }
250+ } )
251+ const onbeforeremoveC = o . spy ( function onbeforeremove ( ) {
252+ return { then ( resolve ) { thenCBC = resolve } }
253+ } )
254+ // to avoid updating internal nodes only, vnodes have key attributes
255+ const A = fragment ( { key : 1 , onbeforeremove : onbeforeremoveA } , [ m ( "a1" ) , m ( "a2" ) ] )
256+ const B = fragment ( { key : 2 , onbeforeremove : onbeforeremoveB } , [ m ( "b1" ) , m ( "b2" ) ] )
257+ const C = fragment ( { key : 3 , onbeforeremove : onbeforeremoveC } , [ m ( "c1" ) , m ( "c2" ) ] )
258+
259+ render ( root , [ A ] )
260+ o ( onbeforeremoveA . callCount ) . equals ( 0 )
261+ o ( onbeforeremoveB . callCount ) . equals ( 0 )
262+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
263+
264+ render ( root , [ B ] )
265+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
266+ o ( onbeforeremoveB . callCount ) . equals ( 0 )
267+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
268+
269+ render ( root , [ C ] )
270+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
271+ o ( onbeforeremoveB . callCount ) . equals ( 1 )
272+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
273+
274+ render ( root , [ ] )
275+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
276+ o ( onbeforeremoveB . callCount ) . equals ( 1 )
277+ o ( onbeforeremoveC . callCount ) . equals ( 1 )
278+
279+ // not resolved
280+ o ( root . childNodes . length ) . equals ( 6 )
281+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
282+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
283+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
284+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
285+ o ( root . childNodes [ 4 ] . nodeName ) . equals ( "C1" )
286+ o ( root . childNodes [ 5 ] . nodeName ) . equals ( "C2" )
287+
288+ const iterA = domFor ( A )
289+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
290+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
291+ o ( iterA . next ( ) . done ) . deepEquals ( true )
292+
293+ const iterB = domFor ( B )
294+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
295+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
296+ o ( iterB . next ( ) . done ) . deepEquals ( true )
297+
298+ const iterC = domFor ( C )
299+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
300+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
301+ o ( iterC . next ( ) . done ) . deepEquals ( true )
302+
303+ callAsync ( function ( ) {
304+ // not resolved yet
305+ o ( root . childNodes . length ) . equals ( 6 )
306+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
307+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
308+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
309+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
310+ o ( root . childNodes [ 4 ] . nodeName ) . equals ( "C1" )
311+ o ( root . childNodes [ 5 ] . nodeName ) . equals ( "C2" )
312+
313+ const iterA = domFor ( A )
314+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
315+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
316+ o ( iterA . next ( ) . done ) . deepEquals ( true )
317+
318+ const iterB = domFor ( B )
319+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
320+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
321+ o ( iterB . next ( ) . done ) . deepEquals ( true )
322+
323+ const iterC = domFor ( C )
324+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
325+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
326+ o ( iterC . next ( ) . done ) . deepEquals ( true )
327+
328+ // resolve C
329+ thenCBC ( )
330+ callAsync ( function ( ) {
331+ o ( root . childNodes . length ) . equals ( 4 )
332+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
333+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
334+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
335+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
336+
337+ const iterB = domFor ( B )
338+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
339+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
340+ o ( iterB . next ( ) . done ) . deepEquals ( true )
341+
342+ const iterA = domFor ( A )
343+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
344+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
345+ o ( iterA . next ( ) . done ) . deepEquals ( true )
346+
347+ // resolve A
348+ thenCBA ( )
349+ callAsync ( function ( ) {
350+ o ( root . childNodes . length ) . equals ( 2 )
351+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "B1" )
352+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "B2" )
353+
354+ const iterB = domFor ( B )
355+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
356+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
357+ o ( iterB . next ( ) . done ) . deepEquals ( true )
358+
359+ // resolve B
360+ thenCBB ( )
361+ callAsync ( function ( ) {
362+ o ( root . childNodes . length ) . equals ( 0 )
363+ done ( )
364+ } )
365+ } )
366+ } )
367+ } )
368+ } )
369+ o ( "works multiple vnodes with onbeforeremove (3/3)" , function ( done ) {
370+ let thenCBA , thenCBB , thenCBC
371+ const onbeforeremoveA = o . spy ( function onbeforeremove ( ) {
372+ return { then ( resolve ) { thenCBA = resolve } }
373+ } )
374+ const onbeforeremoveB = o . spy ( function onbeforeremove ( ) {
375+ return { then ( resolve ) { thenCBB = resolve } }
376+ } )
377+ const onbeforeremoveC = o . spy ( function onbeforeremove ( ) {
378+ return { then ( resolve ) { thenCBC = resolve } }
379+ } )
380+ // to avoid updating internal nodes only, vnodes have key attributes
381+ const A = fragment ( { key : 1 , onbeforeremove : onbeforeremoveA } , [ m ( "a1" ) , m ( "a2" ) ] )
382+ const B = fragment ( { key : 2 , onbeforeremove : onbeforeremoveB } , [ m ( "b1" ) , m ( "b2" ) ] )
383+ const C = fragment ( { key : 3 , onbeforeremove : onbeforeremoveC } , [ m ( "c1" ) , m ( "c2" ) ] )
384+
385+ render ( root , [ A ] )
386+ o ( onbeforeremoveA . callCount ) . equals ( 0 )
387+ o ( onbeforeremoveB . callCount ) . equals ( 0 )
388+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
389+
390+ render ( root , [ B ] )
391+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
392+ o ( onbeforeremoveB . callCount ) . equals ( 0 )
393+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
394+
395+ render ( root , [ C ] )
396+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
397+ o ( onbeforeremoveB . callCount ) . equals ( 1 )
398+ o ( onbeforeremoveC . callCount ) . equals ( 0 )
399+
400+ render ( root , [ ] )
401+ o ( onbeforeremoveA . callCount ) . equals ( 1 )
402+ o ( onbeforeremoveB . callCount ) . equals ( 1 )
403+ o ( onbeforeremoveC . callCount ) . equals ( 1 )
404+
405+ // not resolved
406+ o ( root . childNodes . length ) . equals ( 6 )
407+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
408+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
409+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
410+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
411+ o ( root . childNodes [ 4 ] . nodeName ) . equals ( "C1" )
412+ o ( root . childNodes [ 5 ] . nodeName ) . equals ( "C2" )
413+
414+ const iterA = domFor ( A )
415+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
416+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
417+ o ( iterA . next ( ) . done ) . deepEquals ( true )
418+
419+ const iterB = domFor ( B )
420+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
421+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
422+ o ( iterB . next ( ) . done ) . deepEquals ( true )
423+
424+ const iterC = domFor ( C )
425+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
426+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
427+ o ( iterC . next ( ) . done ) . deepEquals ( true )
428+
429+ callAsync ( function ( ) {
430+ // not resolved yet
431+ o ( root . childNodes . length ) . equals ( 6 )
432+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "A1" )
433+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "A2" )
434+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "B1" )
435+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "B2" )
436+ o ( root . childNodes [ 4 ] . nodeName ) . equals ( "C1" )
437+ o ( root . childNodes [ 5 ] . nodeName ) . equals ( "C2" )
438+
439+ const iterA = domFor ( A )
440+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A1" )
441+ o ( iterA . next ( ) . value . nodeName ) . equals ( "A2" )
442+ o ( iterA . next ( ) . done ) . deepEquals ( true )
443+
444+ const iterB = domFor ( B )
445+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
446+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
447+ o ( iterB . next ( ) . done ) . deepEquals ( true )
448+
449+ const iterC = domFor ( C )
450+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
451+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
452+ o ( iterC . next ( ) . done ) . deepEquals ( true )
453+
454+ // resolve A
455+ thenCBA ( )
456+ callAsync ( function ( ) {
457+ o ( root . childNodes . length ) . equals ( 4 )
458+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "B1" )
459+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "B2" )
460+ o ( root . childNodes [ 2 ] . nodeName ) . equals ( "C1" )
461+ o ( root . childNodes [ 3 ] . nodeName ) . equals ( "C2" )
462+
463+ const iterB = domFor ( B )
464+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B1" )
465+ o ( iterB . next ( ) . value . nodeName ) . equals ( "B2" )
466+ o ( iterB . next ( ) . done ) . deepEquals ( true )
467+
468+ const iterC = domFor ( C )
469+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
470+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
471+ o ( iterC . next ( ) . done ) . deepEquals ( true )
472+
473+ // resolve B
474+ thenCBB ( )
475+ callAsync ( function ( ) {
476+ o ( root . childNodes . length ) . equals ( 2 )
477+ o ( root . childNodes [ 0 ] . nodeName ) . equals ( "C1" )
478+ o ( root . childNodes [ 1 ] . nodeName ) . equals ( "C2" )
479+
480+ const iterC = domFor ( C )
481+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C1" )
482+ o ( iterC . next ( ) . value . nodeName ) . equals ( "C2" )
483+ o ( iterC . next ( ) . done ) . deepEquals ( true )
484+
485+ // resolve C
486+ thenCBC ( )
487+ callAsync ( function ( ) {
488+ o ( root . childNodes . length ) . equals ( 0 )
489+ done ( )
490+ } )
491+ } )
492+ } )
493+ } )
494+ } )
117495 components . forEach ( function ( cmp ) {
118496 const { kind, create : createComponent } = cmp
119497 o . spec ( kind , function ( ) {
0 commit comments