Skip to content

Commit 27a812b

Browse files
authored
fix(overlay): remove potentially leaky observable (#19146)
Removes an unnecessary observable that has the potential for memory leaks. Fixes #10573.
1 parent da13167 commit 27a812b

File tree

3 files changed

+3
-18
lines changed

3 files changed

+3
-18
lines changed

src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export class OverlayKeyboardDispatcher implements OnDestroy {
8787
// (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions,
8888
// because we don't want overlays that don't handle keyboard events to block the ones below
8989
// them that do.
90-
if (overlays[i]._keydownEventSubscriptions > 0) {
90+
if (overlays[i]._keydownEvents.observers.length > 0) {
9191
overlays[i]._keydownEvents.next(event);
9292
break;
9393
}

src/cdk/overlay/overlay-ref.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {Direction, Directionality} from '@angular/cdk/bidi';
1010
import {ComponentPortal, Portal, PortalOutlet, TemplatePortal} from '@angular/cdk/portal';
1111
import {ComponentRef, EmbeddedViewRef, NgZone} from '@angular/core';
1212
import {Location} from '@angular/common';
13-
import {Observable, Subject, merge, SubscriptionLike, Subscription, Observer} from 'rxjs';
13+
import {Observable, Subject, merge, SubscriptionLike, Subscription} from 'rxjs';
1414
import {take, takeUntil} from 'rxjs/operators';
1515
import {OverlayKeyboardDispatcher} from './keyboard/overlay-keyboard-dispatcher';
1616
import {OverlayConfig} from './overlay-config';
@@ -45,23 +45,9 @@ export class OverlayRef implements PortalOutlet, OverlayReference {
4545
*/
4646
private _previousHostParent: HTMLElement;
4747

48-
private _keydownEventsObservable: Observable<KeyboardEvent> =
49-
new Observable((observer: Observer<KeyboardEvent>) => {
50-
const subscription = this._keydownEvents.subscribe(observer);
51-
this._keydownEventSubscriptions++;
52-
53-
return () => {
54-
subscription.unsubscribe();
55-
this._keydownEventSubscriptions--;
56-
};
57-
});
58-
5948
/** Stream of keydown events dispatched to this overlay. */
6049
_keydownEvents = new Subject<KeyboardEvent>();
6150

62-
/** Amount of subscriptions to the keydown events. */
63-
_keydownEventSubscriptions = 0;
64-
6551
constructor(
6652
private _portalOutlet: PortalOutlet,
6753
private _host: HTMLElement,
@@ -265,7 +251,7 @@ export class OverlayRef implements PortalOutlet, OverlayReference {
265251

266252
/** Gets an observable of keydown events targeted to this overlay. */
267253
keydownEvents(): Observable<KeyboardEvent> {
268-
return this._keydownEventsObservable;
254+
return this._keydownEvents.asObservable();
269255
}
270256

271257
/** Gets the current overlay configuration, which is immutable. */

tools/public_api_guard/cdk/overlay.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ export declare class OverlayPositionBuilder {
260260
}
261261

262262
export declare class OverlayRef implements PortalOutlet, OverlayReference {
263-
_keydownEventSubscriptions: number;
264263
_keydownEvents: Subject<KeyboardEvent>;
265264
get backdropElement(): HTMLElement | null;
266265
get hostElement(): HTMLElement;

0 commit comments

Comments
 (0)