|
6 | 6 | * found in the LICENSE file at https://angular.dev/license
|
7 | 7 | */
|
8 | 8 |
|
9 |
| -import {ENVIRONMENT_INITIALIZER, EnvironmentInjector, inject, InjectionToken} from './di'; |
| 9 | +import {ENVIRONMENT_INITIALIZER} from './di/initializer_token'; |
| 10 | +import {InjectionToken} from './di/injection_token'; |
| 11 | +import {inject} from './di/injector_compatibility'; |
| 12 | +import type {EnvironmentProviders} from './di/interface/provider'; |
| 13 | +import {makeEnvironmentProviders, provideEnvironmentInitializer} from './di/provider_collection'; |
| 14 | +import {EnvironmentInjector} from './di/r3_injector'; |
| 15 | +import {DOCUMENT} from './document'; |
| 16 | +import {DestroyRef} from './linker/destroy_ref'; |
10 | 17 |
|
11 | 18 | /**
|
12 | 19 | * Provides a hook for centralized exception handling.
|
@@ -75,3 +82,46 @@ export const errorHandlerEnvironmentInitializer = {
|
75 | 82 | useValue: () => void inject(ErrorHandler),
|
76 | 83 | multi: true,
|
77 | 84 | };
|
| 85 | + |
| 86 | +const globalErrorListeners = new InjectionToken<void>(ngDevMode ? 'GlobalErrorListeners' : '', { |
| 87 | + providedIn: 'root', |
| 88 | + factory: () => { |
| 89 | + if (typeof ngServerMode !== 'undefined' && ngServerMode) { |
| 90 | + return; |
| 91 | + } |
| 92 | + const window = inject(DOCUMENT).defaultView; |
| 93 | + if (!window) { |
| 94 | + return; |
| 95 | + } |
| 96 | + |
| 97 | + const errorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER); |
| 98 | + const rejectionListener = (e: PromiseRejectionEvent) => { |
| 99 | + errorHandler(e.reason); |
| 100 | + e.preventDefault(); |
| 101 | + }; |
| 102 | + const errorListener = (e: ErrorEvent) => { |
| 103 | + errorHandler(e.error); |
| 104 | + e.preventDefault(); |
| 105 | + }; |
| 106 | + |
| 107 | + window.addEventListener('unhandledrejection', rejectionListener); |
| 108 | + window.addEventListener('error', errorListener); |
| 109 | + inject(DestroyRef).onDestroy(() => { |
| 110 | + window.removeEventListener('error', errorListener); |
| 111 | + window.removeEventListener('unhandledrejection', rejectionListener); |
| 112 | + }); |
| 113 | + }, |
| 114 | +}); |
| 115 | + |
| 116 | +/** |
| 117 | + * Provides an environment initializer which forwards unhandled errors to the ErrorHandler. |
| 118 | + * |
| 119 | + * The listeners added are for the window's 'unhandledrejection' and 'error' events. |
| 120 | + * |
| 121 | + * @publicApi |
| 122 | + */ |
| 123 | +export function provideBrowserGlobalErrorListeners(): EnvironmentProviders { |
| 124 | + return makeEnvironmentProviders([ |
| 125 | + provideEnvironmentInitializer(() => void inject(globalErrorListeners)), |
| 126 | + ]); |
| 127 | +} |
0 commit comments