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