Skip to content

Commit 1564880

Browse files
authored
fix(google-maps): error if API is initialized incorrectly (#26520)
When the Google Maps API fails to initialize (e.g. when the API key is invalid), it returns dummy objects which return `undefined` from `addListener`, causing an error when the `MapEventManager` is destroyed. These changes add a check to guard against those errors. Fixes #26514.
1 parent 1551d52 commit 1564880

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/google-maps/map-event-manager.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,20 @@ describe('MapEventManager', () => {
141141
alternateTarget.triggerListeners('click');
142142
expect(spy).toHaveBeenCalledTimes(2);
143143
});
144+
145+
it('should not throw with an invalid target', () => {
146+
manager.setTarget({
147+
addListener: () => undefined,
148+
});
149+
const stream = manager.getLazyEmitter('click');
150+
const completeSpy = jasmine.createSpy('completeSpy');
151+
const errorSpy = jasmine.createSpy('errorSpy');
152+
stream.subscribe({complete: completeSpy, error: errorSpy});
153+
154+
expect(() => manager.destroy()).not.toThrow();
155+
expect(completeSpy).toHaveBeenCalled();
156+
expect(errorSpy).not.toHaveBeenCalled();
157+
});
144158
});
145159

146160
/** Imitates a Google Maps event target and keeps track of the registered events. */

src/google-maps/map-event-manager.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type MapEventManagerTarget =
1515
addListener: (
1616
name: string,
1717
callback: (...args: any[]) => void,
18-
) => google.maps.MapsEventListener;
18+
) => google.maps.MapsEventListener | undefined;
1919
}
2020
| undefined;
2121

@@ -51,6 +51,14 @@ export class MapEventManager {
5151
const listener = target.addListener(name, (event: T) => {
5252
this._ngZone.run(() => observer.next(event));
5353
});
54+
55+
// If there's an error when initializing the Maps API (e.g. a wrong API key), it will
56+
// return a dummy object that returns `undefined` from `addListener` (see #26514).
57+
if (!listener) {
58+
observer.complete();
59+
return undefined;
60+
}
61+
5462
this._listeners.push(listener);
5563
return () => listener.remove();
5664
});

0 commit comments

Comments
 (0)