Skip to content

Commit b871c99

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 6e1f522 commit b871c99

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,12 @@ describe('MDC-based MatSlider' , () => {
5555
}
5656

5757
describe('standard slider', () => {
58+
let fixture: ComponentFixture<StandardSlider>;
5859
let sliderInstance: MatSlider;
5960
let inputInstance: MatSliderThumb;
6061

6162
beforeEach(waitForAsync(() => {
62-
const fixture = createComponent(StandardSlider);
63+
fixture = createComponent(StandardSlider);
6364
fixture.detectChanges();
6465
const sliderDebugElement = fixture.debugElement.query(By.directive(MatSlider));
6566
sliderInstance = sliderDebugElement.componentInstance;
@@ -105,6 +106,13 @@ describe('MDC-based MatSlider' , () => {
105106
expect(inputInstance.value).toBe(10);
106107
sliderInstance._elementRef.nativeElement.style.marginLeft = 'initial';
107108
});
109+
110+
it('should not throw if destroyed before initialization is complete', () => {
111+
fixture.destroy();
112+
fixture = TestBed.createComponent(StandardSlider);
113+
expect(() => fixture.destroy()).not.toThrow();
114+
});
115+
108116
});
109117

110118
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
@@ -814,7 +814,7 @@ export class MatSlider extends _MatSliderMixinBase
814814

815815
/** Sets the disabled state based on the disabled state of the inputs (ControlValueAccessor). */
816816
_updateDisabled(): void {
817-
const disabled = this._inputs.some(input => input._disabled);
817+
const disabled = this._inputs ? this._inputs.some(input => input._disabled) : false;
818818
this._setDisabled(disabled);
819819
}
820820

@@ -1112,21 +1112,23 @@ class SliderAdapter implements MDCSliderAdapter {
11121112
}
11131113
deregisterThumbEventHandler = <K extends EventType>
11141114
(thumbPosition: Thumb, evtType: K, handler: SpecificEventListener<K>): void => {
1115-
this._delegate._getThumbElement(thumbPosition).removeEventListener(evtType, handler);
1115+
if (this._delegate._initialized) {
1116+
this._delegate._getThumbElement(thumbPosition).removeEventListener(evtType, handler);
1117+
}
11161118
}
11171119
registerInputEventHandler = <K extends EventType>
11181120
(thumbPosition: Thumb, evtType: K, handler: SpecificEventListener<K>): void => {
11191121
if (evtType === 'change') {
11201122
this._saveChangeEventHandler(thumbPosition, handler as SpecificEventListener<EventType>);
1121-
} else {
1123+
} else if (this._delegate._initialized) {
11221124
this._delegate._getInputElement(thumbPosition).addEventListener(evtType, handler);
11231125
}
11241126
}
11251127
deregisterInputEventHandler = <K extends EventType>
11261128
(thumbPosition: Thumb, evtType: K, handler: SpecificEventListener<K>): void => {
11271129
if (evtType === 'change') {
11281130
this._globalEventSubscriptions.unsubscribe();
1129-
} else {
1131+
} else if (this._delegate._initialized) {
11301132
this._delegate._getInputElement(thumbPosition).removeEventListener(evtType, handler);
11311133
}
11321134
}

0 commit comments

Comments
 (0)