File tree Expand file tree Collapse file tree 2 files changed +28
-1
lines changed Expand file tree Collapse file tree 2 files changed +28
-1
lines changed Original file line number Diff line number Diff line change @@ -152,6 +152,9 @@ export class CdkStepper implements OnDestroy {
152
152
get selectedIndex ( ) { return this . _selectedIndex ; }
153
153
set selectedIndex ( index : number ) {
154
154
if ( this . _steps ) {
155
+ // Ensure that the index can't be out of bounds.
156
+ index = Math . max ( 0 , Math . min ( this . _steps . length - 1 , index || 0 ) ) ;
157
+
155
158
if ( this . _anyControlsInvalidOrPending ( index ) || index < this . _selectedIndex &&
156
159
! this . _steps . toArray ( ) [ index ] . editable ) {
157
160
// remove focus from clicked step header if the step is not able to be selected
@@ -164,7 +167,7 @@ export class CdkStepper implements OnDestroy {
164
167
this . _selectedIndex = this . _focusIndex = index ;
165
168
}
166
169
}
167
- private _selectedIndex : number = 0 ;
170
+ private _selectedIndex = 0 ;
168
171
169
172
/** The step that is selected. */
170
173
@Input ( )
Original file line number Diff line number Diff line change @@ -51,6 +51,30 @@ describe('MatHorizontalStepper', () => {
51
51
expect ( stepperComponent . selectedIndex ) . toBe ( 0 ) ;
52
52
} ) ;
53
53
54
+ it ( 'should not throw when a negative `selectedIndex` is assigned' , ( ) => {
55
+ const stepperComponent : MatHorizontalStepper = fixture . debugElement
56
+ . query ( By . css ( 'mat-horizontal-stepper' ) ) . componentInstance ;
57
+
58
+ expect ( ( ) => {
59
+ stepperComponent . selectedIndex = - 10 ;
60
+ fixture . detectChanges ( ) ;
61
+ } ) . not . toThrow ( ) ;
62
+
63
+ expect ( stepperComponent . selectedIndex ) . toBe ( 0 ) ;
64
+ } ) ;
65
+
66
+ it ( 'should not throw when an out-of-bounds `selectedIndex` is assigned' , ( ) => {
67
+ const stepperComponent : MatHorizontalStepper = fixture . debugElement
68
+ . query ( By . css ( 'mat-horizontal-stepper' ) ) . componentInstance ;
69
+
70
+ expect ( ( ) => {
71
+ stepperComponent . selectedIndex = 1337 ;
72
+ fixture . detectChanges ( ) ;
73
+ } ) . not . toThrow ( ) ;
74
+
75
+ expect ( stepperComponent . selectedIndex ) . toBe ( 2 ) ;
76
+ } ) ;
77
+
54
78
it ( 'should change selected index on header click' , ( ) => {
55
79
let stepHeaders = fixture . debugElement . queryAll ( By . css ( '.mat-horizontal-stepper-header' ) ) ;
56
80
assertSelectionChangeOnHeaderClick ( fixture , stepHeaders ) ;
You can’t perform that action at this time.
0 commit comments