@@ -27,7 +27,8 @@ import {ElementBinder} from 'angular2/src/core/compiler/element_binder';
2727import  { 
2828  DirectiveBinding , 
2929  ElementInjector , 
30-   PreBuiltObjects 
30+   PreBuiltObjects , 
31+   ProtoElementInjector 
3132}  from  'angular2/src/core/compiler/element_injector' ; 
3233import  { DirectiveResolver }  from  'angular2/src/core/compiler/directive_resolver' ; 
3334import  { Component }  from  'angular2/annotations' ; 
@@ -66,10 +67,12 @@ export function main() {
6667      return  res ; 
6768    } 
6869
69-     function  createElementInjector ( )  { 
70+     function  createElementInjector ( parent   =   null )  { 
7071      var  host  =  new  SpyElementInjector ( ) ; 
7172      var  appInjector  =  new  SpyInjector ( ) ; 
72-       return  SpyObject . stub ( new  SpyElementInjector ( ) , 
73+       var  elementInjector  = 
74+           isPresent ( parent )  ? new  SpyElementInjectorWithParent ( parent )  : new  SpyElementInjector ( ) ; 
75+       return  SpyObject . stub ( elementInjector , 
7376                            { 
7477                              'isExportingComponent' : false , 
7578                              'isExportingElement' : false , 
@@ -82,15 +85,19 @@ export function main() {
8285                            { } ) ; 
8386    } 
8487
85-     function  createView ( pv  =  null )  { 
88+     function  createView ( pv  =  null ,   nestedInjectors   =   false )  { 
8689      if  ( isBlank ( pv ) )  { 
8790        pv  =  createProtoView ( ) ; 
8891      } 
8992      var  view  =  new  AppView ( null ,  pv ,  new  Map ( ) ) ; 
90-       var  elementInjectors  =  ListWrapper . createFixedSize ( pv . elementBinders . length ) ; 
93+       var  elementInjectors  =  ListWrapper . createGrowableSize ( pv . elementBinders . length ) ; 
9194      var  preBuiltObjects  =  ListWrapper . createFixedSize ( pv . elementBinders . length ) ; 
9295      for  ( var  i  =  0 ;  i  <  pv . elementBinders . length ;  i ++ )  { 
93-         elementInjectors [ i ]  =  createElementInjector ( ) ; 
96+         if  ( nestedInjectors  &&  i  >  0 )  { 
97+           elementInjectors [ i ]  =  createElementInjector ( elementInjectors [ i  -  1 ] ) ; 
98+         }  else  { 
99+           elementInjectors [ i ]  =  createElementInjector ( ) ; 
100+         } 
94101        preBuiltObjects [ i ]  =  new  SpyPreBuiltObjects ( ) ; 
95102      } 
96103      view . init ( < any > new  SpyChangeDetector ( ) ,  elementInjectors ,  elementInjectors ,  preBuiltObjects , 
@@ -118,10 +125,9 @@ export function main() {
118125        var  spyCd  =  < any > componentView . changeDetector ; 
119126        spyCd . spy ( 'hydrate' ) . andCallFake ( log . fn ( 'hydrateCD' ) ) ; 
120127
121-         utils . hydrateComponentView ( hostView ,  0 ) 
128+         utils . hydrateComponentView ( hostView ,  0 ) ; 
122129
123-             expect ( log . result ( ) ) 
124-                 . toEqual ( 'hydrate; hydrateCD' ) ; 
130+         expect ( log . result ( ) ) . toEqual ( 'hydrate; hydrateCD' ) ; 
125131      } ) ; 
126132
127133    } ) ; 
@@ -187,25 +193,32 @@ export function main() {
187193    describe ( 'attachViewInContainer' ,  ( )  =>  { 
188194      var  parentView ,  contextView ,  childView ; 
189195
190-       function  createViews ( )  { 
196+       function  createViews ( numInj   =   1 )  { 
191197        var  parentPv  =  createProtoView ( [ createEmptyElBinder ( ) ] ) ; 
192198        parentView  =  createView ( parentPv ) ; 
193199
194-         var  contextPv  =  createProtoView ( [ createEmptyElBinder ( ) ] ) ; 
195-         contextView  =  createView ( contextPv ) ; 
200+         var  binders  =  [ ] ; 
201+         for  ( var  i  =  0 ;  i  <  numInj ;  i ++ )  binders . push ( createEmptyElBinder ( ) ) ; 
202+         var  contextPv  =  createProtoView ( binders ) ; 
203+         contextView  =  createView ( contextPv ,  true ) ; 
196204
197205        var  childPv  =  createProtoView ( [ createEmptyElBinder ( ) ] ) ; 
198206        childView  =  createView ( childPv ) ; 
199207      } 
200208
209+       it ( 'should link the views rootElementInjectors at the given context' ,  ( )  =>  { 
210+         createViews ( ) ; 
211+         utils . attachViewInContainer ( parentView ,  0 ,  contextView ,  0 ,  0 ,  childView ) ; 
212+         expect ( contextView . elementInjectors . length ) . toEqual ( 2 ) ; 
213+       } ) ; 
214+ 
201215      it ( 'should link the views rootElementInjectors after the elementInjector at the given context' , 
202216         ( )  =>  { 
203-            createViews ( ) ; 
204-            utils . attachViewInContainer ( parentView ,  0 ,  contextView ,  0 ,  0 ,  childView ) ; 
217+            createViews ( 2 ) ; 
218+            utils . attachViewInContainer ( parentView ,  0 ,  contextView ,  1 ,  0 ,  childView ) ; 
205219           expect ( childView . rootElementInjectors [ 0 ] . spy ( 'linkAfter' ) ) 
206220               . toHaveBeenCalledWith ( contextView . elementInjectors [ 0 ] ,  null ) ; 
207221         } ) ; 
208- 
209222    } ) ; 
210223
211224    describe ( 'hydrateViewInContainer' ,  ( )  =>  { 
@@ -279,6 +292,17 @@ class SpyElementInjector extends SpyObject {
279292  noSuchMethod ( m )  {  return  super . noSuchMethod ( m )  } 
280293} 
281294
295+ @proxy 
296+ @IMPLEMENTS ( ElementInjector ) 
297+ class  SpyElementInjectorWithParent  extends  SpyObject  { 
298+   parent : ElementInjector ; 
299+   constructor ( parent )  { 
300+     super ( ElementInjector ) ; 
301+     this . parent  =  parent ; 
302+   } 
303+   noSuchMethod ( m )  {  return  super . noSuchMethod ( m )  } 
304+ } 
305+ 
282306@proxy 
283307@IMPLEMENTS ( PreBuiltObjects ) 
284308class  SpyPreBuiltObjects  extends  SpyObject  { 
0 commit comments