| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-16 15:07:30 +02:00
										 |  |  | import {InjectFlags, Optional, Renderer2, Self} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2019-05-15 22:51:40 -07:00
										 |  |  | import {createLView, createTView, getOrCreateTNode} from '@angular/core/src/render3/instructions/shared'; | 
					
						
							| 
									
										
										
										
											2019-03-30 11:32:48 +01:00
										 |  |  | import {RenderFlags} from '@angular/core/src/render3/interfaces/definition'; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  | import {ɵɵdefineComponent} from '../../src/render3/definition'; | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  | import {bloomAdd, bloomHasToken, bloomHashBitOrFactory as bloomHash, getOrCreateNodeInjectorForNode} from '../../src/render3/di'; | 
					
						
							| 
									
										
										
										
											2019-08-16 15:07:30 +02:00
										 |  |  | import {ɵɵdefineDirective, ɵɵdirectiveInject, ɵɵelement, ɵɵelementEnd, ɵɵelementStart, ɵɵtext} from '../../src/render3/index'; | 
					
						
							| 
									
										
										
										
											2019-04-01 15:36:43 -07:00
										 |  |  | import {TNODE} from '../../src/render3/interfaces/injector'; | 
					
						
							| 
									
										
										
										
											2019-03-30 11:32:48 +01:00
										 |  |  | import {TNodeType} from '../../src/render3/interfaces/node'; | 
					
						
							| 
									
										
										
										
											2019-03-19 19:41:10 +01:00
										 |  |  | import {isProceduralRenderer} from '../../src/render3/interfaces/renderer'; | 
					
						
							| 
									
										
										
										
											2019-05-15 22:51:40 -07:00
										 |  |  | import {LViewFlags, TVIEW} from '../../src/render3/interfaces/view'; | 
					
						
							| 
									
										
										
										
											2019-10-14 13:59:17 -07:00
										 |  |  | import {enterView, leaveViewProcessExit} from '../../src/render3/state'; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 17:43:29 +02:00
										 |  |  | import {getRendererFactory2} from './imported_renderer2'; | 
					
						
							| 
									
										
										
										
											2019-08-16 15:07:30 +02:00
										 |  |  | import {ComponentFixture, createComponent, createDirective} from './render_util'; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('di', () => { | 
					
						
							| 
									
										
										
										
											2018-04-04 21:21:12 -07:00
										 |  |  |   describe('directive injection', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class DirB { | 
					
						
							|  |  |  |       value = 'DirB'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |       static ɵfac = () => new DirB(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |       static ɵdir = | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |           ɵɵdefineDirective({selectors: [['', 'dirB', '']], type: DirB, inputs: {value: 'value'}}); | 
					
						
							| 
									
										
										
										
											2018-04-04 21:21:12 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  |     describe('flags', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class DirB { | 
					
						
							| 
									
										
										
										
											2018-06-18 16:38:33 -07:00
										 |  |  |         // TODO(issue/24571): remove '!'.
 | 
					
						
							|  |  |  |         value !: string; | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = () => new DirB(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |         static ɵdir = | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |             ɵɵdefineDirective({type: DirB, selectors: [['', 'dirB', '']], inputs: {value: 'dirB'}}); | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 11:35:51 -07:00
										 |  |  |       describe('Optional', () => { | 
					
						
							|  |  |  |         let dirA: DirA|null = null; | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         class DirA { | 
					
						
							|  |  |  |           constructor(@Optional() public dirB: DirB|null) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |           static ɵfac = | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |               () => { | 
					
						
							|  |  |  |                 dirA = new DirA(ɵɵdirectiveInject(DirB, InjectFlags.Optional)); | 
					
						
							|  |  |  |                 return dirA; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |           static ɵdir = ɵɵdefineDirective({type: DirA, selectors: [['', 'dirA', '']]}); | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 11:35:51 -07:00
										 |  |  |         beforeEach(() => dirA = null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should not throw if dependency is @Optional (limp mode)', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           /** <div dirA></div> */ | 
					
						
							|  |  |  |           const App = createComponent('app', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-10-25 11:35:51 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           }, 1, 0, [DirA, DirB], [], undefined, [], [], undefined, [['dirA', '']]); | 
					
						
							| 
									
										
										
										
											2018-10-25 11:35:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           expect(() => { new ComponentFixture(App); }).not.toThrow(); | 
					
						
							|  |  |  |           expect(dirA !.dirB).toEqual(null); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should check only the current node with @Self even with false positive', () => { | 
					
						
							|  |  |  |         let dirA: DirA; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class DirA { | 
					
						
							|  |  |  |           constructor(@Self() public dirB: DirB) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |           static ɵfac = () => dirA = new DirA(ɵɵdirectiveInject(DirB, InjectFlags.Self)); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |           static ɵdir = ɵɵdefineDirective({type: DirA, selectors: [['', 'dirA', '']]}); | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const DirC = createDirective('dirC'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div dirB> | 
					
						
							|  |  |  |          *   <div dirA dirC></div> | 
					
						
							|  |  |  |          * </div> | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |         const App = createComponent( | 
					
						
							|  |  |  |             'app', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |                 ɵɵelementStart(0, 'div', 0); | 
					
						
							|  |  |  |                 ɵɵelement(1, 'div', 1); | 
					
						
							|  |  |  |                 ɵɵelementEnd(); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             2, 0, [DirA, DirB, DirC], [], undefined, [], [], undefined, | 
					
						
							|  |  |  |             [['dirB', ''], ['dirA', '', 'dirC', '']]); | 
					
						
							| 
									
										
										
										
											2018-04-23 18:24:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           (DirA as any)['__NG_ELEMENT_ID__'] = 1; | 
					
						
							|  |  |  |           (DirC as any)['__NG_ELEMENT_ID__'] = 257; | 
					
						
							| 
									
										
										
										
											2018-07-27 09:56:35 -07:00
										 |  |  |           new ComponentFixture(App); | 
					
						
							| 
									
										
										
										
											2019-08-16 15:07:30 +02:00
										 |  |  |         }).toThrowError(/NodeInjector: NOT_FOUND \[DirB]/); | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-11-28 12:51:00 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 17:43:29 +02:00
										 |  |  |   describe('Renderer2', () => { | 
					
						
							|  |  |  |     class MyComp { | 
					
						
							|  |  |  |       constructor(public renderer: Renderer2) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |       static ɵfac = () => new MyComp(ɵɵdirectiveInject(Renderer2 as any)); | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  |       static ɵcmp = ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-08-16 17:43:29 +02:00
										 |  |  |         type: MyComp, | 
					
						
							|  |  |  |         selectors: [['my-comp']], | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |         decls: 1, | 
					
						
							| 
									
										
										
										
											2018-08-16 17:43:29 +02:00
										 |  |  |         vars: 0, | 
					
						
							|  |  |  |         template: function(rf: RenderFlags, ctx: MyComp) { | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             ɵɵtext(0, 'Foo'); | 
					
						
							| 
									
										
										
										
											2018-08-16 17:43:29 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should inject the Renderer2 used by the application', () => { | 
					
						
							|  |  |  |       const rendererFactory = getRendererFactory2(document); | 
					
						
							| 
									
										
										
										
											2018-10-10 15:53:14 +02:00
										 |  |  |       const fixture = new ComponentFixture(MyComp, {rendererFactory: rendererFactory}); | 
					
						
							|  |  |  |       expect(isProceduralRenderer(fixture.component.renderer)).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2018-08-16 17:43:29 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw when injecting Renderer2 but the application is using Renderer3', | 
					
						
							|  |  |  |        () => { expect(() => new ComponentFixture(MyComp)).toThrow(); }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |   describe('ɵɵinject', () => { | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     describe('bloom filter', () => { | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |       let mockTView: any; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         mockTView = {data: [0, 0, 0, 0, 0, 0, 0, 0, null], firstTemplatePass: true}; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |       function bloomState() { return mockTView.data.slice(0, TNODE).reverse(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Dir0 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 0; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir1 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir33 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 33; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir66 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 66; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir99 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 99; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir132 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 132; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir165 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 165; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir198 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 198; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       class Dir231 { | 
					
						
							|  |  |  |         /** @internal */ static __NG_ELEMENT_ID__ = 231; | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should add values', () => { | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir0); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 0, 0, 0, 0, 0, 0, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir33); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 0, 0, 0, 0, 0, 2, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir66); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 0, 0, 0, 0, 4, 2, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir99); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 0, 0, 0, 8, 4, 2, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir132); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 0, 0, 16, 8, 4, 2, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir165); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 0, 32, 16, 8, 4, 2, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir198); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([0, 64, 32, 16, 8, 4, 2, 1]); | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir231); | 
					
						
							| 
									
										
										
										
											2018-03-14 13:29:48 -07:00
										 |  |  |         expect(bloomState()).toEqual([128, 64, 32, 16, 8, 4, 2, 1]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should query values', () => { | 
					
						
							| 
									
										
										
										
											2018-10-02 21:12:26 -07:00
										 |  |  |         bloomAdd(0, mockTView, Dir0); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir33); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir66); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir99); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir132); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir165); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir198); | 
					
						
							|  |  |  |         bloomAdd(0, mockTView, Dir231); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |         expect(bloomHasToken(bloomHash(Dir0) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir1) as number, 0, mockTView.data)).toEqual(false); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir33) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir66) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir99) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir132) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir165) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir198) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							|  |  |  |         expect(bloomHasToken(bloomHash(Dir231) as number, 0, mockTView.data)).toEqual(true); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('getOrCreateNodeInjector', () => { | 
					
						
							|  |  |  |     it('should handle initial undefined state', () => { | 
					
						
							| 
									
										
										
										
											2018-11-21 21:14:06 -08:00
										 |  |  |       const contentView = createLView( | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           null, createTView(-1, null, 1, 0, null, null, null, null, null), null, | 
					
						
							|  |  |  |           LViewFlags.CheckAlways, null, null, {} as any, {} as any); | 
					
						
							| 
									
										
										
										
											2019-10-14 13:59:17 -07:00
										 |  |  |       enterView(contentView, null); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       try { | 
					
						
							| 
									
										
										
										
											2019-05-15 22:51:40 -07:00
										 |  |  |         const parentTNode = | 
					
						
							|  |  |  |             getOrCreateTNode(contentView[TVIEW], null, 0, TNodeType.Element, null, null); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         // Simulate the situation where the previous parent is not initialized.
 | 
					
						
							|  |  |  |         // This happens on first bootstrap because we don't init existing values
 | 
					
						
							|  |  |  |         // so that we have smaller HelloWorld.
 | 
					
						
							| 
									
										
										
										
											2018-09-13 16:07:23 -07:00
										 |  |  |         (parentTNode as{parent: any}).parent = undefined; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |         const injector = getOrCreateNodeInjectorForNode(parentTNode, contentView); | 
					
						
							| 
									
										
										
										
											2018-10-08 16:04:46 -07:00
										 |  |  |         expect(injector).not.toEqual(-1); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } finally { | 
					
						
							| 
									
										
										
										
											2019-10-14 13:59:17 -07:00
										 |  |  |         leaveViewProcessExit(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }); |