Skip to content

Commit fa1146d

Browse files
committed
fix(material-experimental/mdc-slider): fix a few null pointer exceptions
Fixes a few null pointer errors if: 1. `setDisabledState` is called too early. This can't happen at the moment, but it showed up when trying to fix something in `@angular/forms` and it may become an issue in the future. 2. The component is destroyed before the initialization is complete. This showed up while investigating the first error.
1 parent be9abca commit fa1146d

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/material-experimental/mdc-slider/slider.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ describe('MDC-based MatSlider', () => {
5252
}
5353

5454
describe('standard slider', () => {
55+
let fixture: ComponentFixture<StandardSlider>;
5556
let sliderInstance: MatSlider;
5657
let inputInstance: MatSliderThumb;
5758

5859
beforeEach(
5960
waitForAsync(() => {
60-
const fixture = createComponent(StandardSlider);
61+
fixture = createComponent(StandardSlider);
6162
fixture.detectChanges();
6263
const sliderDebugElement = fixture.debugElement.query(By.directive(MatSlider));
6364
sliderInstance = sliderDebugElement.componentInstance;
@@ -104,6 +105,12 @@ describe('MDC-based MatSlider', () => {
104105
expect(inputInstance.value).toBe(10);
105106
sliderInstance._elementRef.nativeElement.style.marginLeft = 'initial';
106107
});
108+
109+
it('should not throw if destroyed before initialization is complete', () => {
110+
fixture.destroy();
111+
fixture = TestBed.createComponent(StandardSlider);
112+
expect(() => fixture.destroy()).not.toThrow();
113+
});
107114
});
108115

109116
describe('standard range slider', () => {

src/material-experimental/mdc-slider/slider.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ export class MatSlider
841841

842842
/** Sets the disabled state based on the disabled state of the inputs (ControlValueAccessor). */
843843
_updateDisabled(): void {
844-
const disabled = this._inputs.some(input => input._disabled);
844+
const disabled = this._inputs ? this._inputs.some(input => input._disabled) : false;
845845
this._setDisabled(disabled);
846846
}
847847

@@ -1152,7 +1152,9 @@ class SliderAdapter implements MDCSliderAdapter {
11521152
evtType: K,
11531153
handler: SpecificEventListener<K>,
11541154
): void => {
1155-
this._delegate._getThumbElement(thumbPosition).removeEventListener(evtType, handler);
1155+
if (this._delegate._initialized) {
1156+
this._delegate._getThumbElement(thumbPosition).removeEventListener(evtType, handler);
1157+
}
11561158
};
11571159
registerInputEventHandler = <K extends EventType>(
11581160
thumbPosition: Thumb,
@@ -1161,7 +1163,7 @@ class SliderAdapter implements MDCSliderAdapter {
11611163
): void => {
11621164
if (evtType === 'change') {
11631165
this._saveChangeEventHandler(thumbPosition, handler as SpecificEventListener<EventType>);
1164-
} else {
1166+
} else if (this._delegate._initialized) {
11651167
this._delegate._getInputElement(thumbPosition).addEventListener(evtType, handler);
11661168
}
11671169
};
@@ -1172,7 +1174,7 @@ class SliderAdapter implements MDCSliderAdapter {
11721174
): void => {
11731175
if (evtType === 'change') {
11741176
this._globalEventSubscriptions.unsubscribe();
1175-
} else {
1177+
} else if (this._delegate._initialized) {
11761178
this._delegate._getInputElement(thumbPosition).removeEventListener(evtType, handler);
11771179
}
11781180
};

0 commit comments

Comments
 (0)