11import  { Platform }  from  '@angular/cdk/platform' ; 
22import  { Component ,  ViewChild }  from  '@angular/core' ; 
33import  { async ,  ComponentFixture ,  TestBed }  from  '@angular/core/testing' ; 
4- import  { FocusTrap ,  FocusTrapDirective ,  FocusTrapFactory }  from  './focus-trap' ; 
4+ import  { FocusTrap ,  CdkTrapFocus ,  FocusTrapFactory }  from  './focus-trap' ; 
55import  { InteractivityChecker }  from  './interactivity-checker' ; 
66
77
@@ -10,12 +10,13 @@ describe('FocusTrap', () => {
1010  beforeEach ( async ( ( )  =>  { 
1111    TestBed . configureTestingModule ( { 
1212      declarations : [ 
13-         FocusTrapDirective , 
13+         CdkTrapFocus , 
1414        FocusTrapWithBindings , 
1515        SimpleFocusTrap , 
1616        FocusTrapTargets , 
1717        FocusTrapWithSvg , 
1818        FocusTrapWithoutFocusableElements , 
19+         FocusTrapWithAutoCapture , 
1920      ] , 
2021      providers : [ InteractivityChecker ,  Platform ,  FocusTrapFactory ] 
2122    } ) ; 
@@ -154,6 +155,27 @@ describe('FocusTrap', () => {
154155      expect ( ( )  =>  focusTrapInstance . focusLastTabbableElement ( ) ) . not . toThrow ( ) ; 
155156    } ) ; 
156157  } ) ; 
158+ 
159+   describe ( 'with autoCapture' ,  ( )  =>  { 
160+     it ( 'should automatically capture and return focus on init / destroy' ,  async ( ( )  =>  { 
161+       const  fixture  =  TestBed . createComponent ( FocusTrapWithAutoCapture ) ; 
162+       fixture . detectChanges ( ) ; 
163+ 
164+       const  buttonOutsideTrappedRegion  =  fixture . nativeElement . querySelector ( 'button' ) ; 
165+       buttonOutsideTrappedRegion . focus ( ) ; 
166+       expect ( document . activeElement ) . toBe ( buttonOutsideTrappedRegion ) ; 
167+ 
168+       fixture . componentInstance . showTrappedRegion  =  true ; 
169+       fixture . detectChanges ( ) ; 
170+ 
171+       fixture . whenStable ( ) . then ( ( )  =>  { 
172+         expect ( document . activeElement . id ) . toBe ( 'auto-capture-target' ) ; 
173+ 
174+         fixture . destroy ( ) ; 
175+         expect ( document . activeElement ) . toBe ( buttonOutsideTrappedRegion ) ; 
176+       } ) ; 
177+     } ) ) ; 
178+   } ) ; 
157179} ) ; 
158180
159181
@@ -166,7 +188,21 @@ describe('FocusTrap', () => {
166188    ` 
167189} ) 
168190class  SimpleFocusTrap  { 
169-   @ViewChild ( FocusTrapDirective )  focusTrapDirective : FocusTrapDirective ; 
191+   @ViewChild ( CdkTrapFocus )  focusTrapDirective : CdkTrapFocus ; 
192+ } 
193+ 
194+ @Component ( { 
195+   template : ` 
196+     <button type="button">Toggle</button> 
197+     <div *ngIf="showTrappedRegion" cdkTrapFocus cdkTrapFocusAutoCapture> 
198+       <input id="auto-capture-target"> 
199+       <button>SAVE</button> 
200+     </div> 
201+     ` 
202+ } ) 
203+ class  FocusTrapWithAutoCapture  { 
204+   @ViewChild ( CdkTrapFocus )  focusTrapDirective : CdkTrapFocus ; 
205+   showTrappedRegion  =  false ; 
170206} 
171207
172208
@@ -179,7 +215,7 @@ class SimpleFocusTrap {
179215    ` 
180216} ) 
181217class  FocusTrapWithBindings  { 
182-   @ViewChild ( FocusTrapDirective )  focusTrapDirective : FocusTrapDirective ; 
218+   @ViewChild ( CdkTrapFocus )  focusTrapDirective : CdkTrapFocus ; 
183219  renderFocusTrap  =  true ; 
184220  _isFocusTrapEnabled  =  true ; 
185221} 
@@ -199,7 +235,7 @@ class FocusTrapWithBindings {
199235    ` 
200236} ) 
201237class  FocusTrapTargets  { 
202-   @ViewChild ( FocusTrapDirective )  focusTrapDirective : FocusTrapDirective ; 
238+   @ViewChild ( CdkTrapFocus )  focusTrapDirective : CdkTrapFocus ; 
203239} 
204240
205241
@@ -213,7 +249,7 @@ class FocusTrapTargets {
213249    ` 
214250} ) 
215251class  FocusTrapWithSvg  { 
216-   @ViewChild ( FocusTrapDirective )  focusTrapDirective : FocusTrapDirective ; 
252+   @ViewChild ( CdkTrapFocus )  focusTrapDirective : CdkTrapFocus ; 
217253} 
218254
219255@Component ( { 
@@ -224,5 +260,5 @@ class FocusTrapWithSvg {
224260    ` 
225261} ) 
226262class  FocusTrapWithoutFocusableElements  { 
227-   @ViewChild ( FocusTrapDirective )  focusTrapDirective : FocusTrapDirective ; 
263+   @ViewChild ( CdkTrapFocus )  focusTrapDirective : CdkTrapFocus ; 
228264} 
0 commit comments