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