diff --git a/packages/service-worker/src/module.ts b/packages/service-worker/src/module.ts index 39e8f62e65..307f4d3355 100644 --- a/packages/service-worker/src/module.ts +++ b/packages/service-worker/src/module.ts @@ -115,10 +115,11 @@ export function ngswAppInitializer( } } - // Don't return anything to avoid blocking the application until the SW is registered or - // causing a crash if the SW registration fails. + // Don't return anything to avoid blocking the application until the SW is registered. + // Catch and log the error if SW registration fails to avoid uncaught rejection warning. readyToRegister$.pipe(take(1)).subscribe( - () => navigator.serviceWorker.register(script, {scope: options.scope})); + () => navigator.serviceWorker.register(script, {scope: options.scope}) + .catch(err => console.error('Service worker registration failed with:', err))); }; return initializer; } diff --git a/packages/service-worker/test/module_spec.ts b/packages/service-worker/test/module_spec.ts index aec5fe1784..85fbc7e5ae 100644 --- a/packages/service-worker/test/module_spec.ts +++ b/packages/service-worker/test/module_spec.ts @@ -28,7 +28,9 @@ describe('ServiceWorkerModule', () => { return appRef.isStable.pipe(filter(Boolean), take(1)).toPromise(); }; - beforeEach(() => swRegisterSpy = spyOn(navigator.serviceWorker, 'register')); + beforeEach( + () => swRegisterSpy = + spyOn(navigator.serviceWorker, 'register').and.returnValue(Promise.resolve())); describe('register()', () => { const configTestBed = async(opts: SwRegistrationOptions) => { @@ -67,6 +69,15 @@ describe('ServiceWorkerModule', () => { expect(TestBed.get(SwUpdate).isEnabled).toBe(true); expect(swRegisterSpy).toHaveBeenCalledWith('sw.js', {scope: undefined}); }); + + it('catches and a logs registration errors', async() => { + const consoleErrorSpy = spyOn(console, 'error'); + swRegisterSpy.and.returnValue(Promise.reject('no reason')); + + await configTestBed({enabled: true, scope: 'foo'}); + expect(consoleErrorSpy) + .toHaveBeenCalledWith('Service worker registration failed with:', 'no reason'); + }); }); describe('SwRegistrationOptions', () => {