From 6f795274600169eb64421f67c9054fcd04062725 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 8 May 2020 19:41:15 +0200 Subject: [PATCH] fix(overlay): remove potentially leaky observable (#19146) Removes an unnecessary observable that has the potential for memory leaks. Fixes #10573. --- .../keyboard/overlay-keyboard-dispatcher.ts | 2 +- src/cdk/overlay/overlay-ref.ts | 18 ++---------------- tools/public_api_guard/cdk/overlay.d.ts | 1 - 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts b/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts index e4571e72e6c6..787e08f1764f 100644 --- a/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts +++ b/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts @@ -87,7 +87,7 @@ export class OverlayKeyboardDispatcher implements OnDestroy { // (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions, // because we don't want overlays that don't handle keyboard events to block the ones below // them that do. - if (overlays[i]._keydownEventSubscriptions > 0) { + if (overlays[i]._keydownEvents.observers.length > 0) { overlays[i]._keydownEvents.next(event); break; } diff --git a/src/cdk/overlay/overlay-ref.ts b/src/cdk/overlay/overlay-ref.ts index d7065bd7f39a..e22ab4790ad7 100644 --- a/src/cdk/overlay/overlay-ref.ts +++ b/src/cdk/overlay/overlay-ref.ts @@ -10,7 +10,7 @@ import {Direction, Directionality} from '@angular/cdk/bidi'; import {ComponentPortal, Portal, PortalOutlet, TemplatePortal} from '@angular/cdk/portal'; import {ComponentRef, EmbeddedViewRef, NgZone} from '@angular/core'; import {Location} from '@angular/common'; -import {Observable, Subject, merge, SubscriptionLike, Subscription, Observer} from 'rxjs'; +import {Observable, Subject, merge, SubscriptionLike, Subscription} from 'rxjs'; import {take, takeUntil} from 'rxjs/operators'; import {OverlayKeyboardDispatcher} from './keyboard/overlay-keyboard-dispatcher'; import {OverlayConfig} from './overlay-config'; @@ -45,23 +45,9 @@ export class OverlayRef implements PortalOutlet, OverlayReference { */ private _previousHostParent: HTMLElement; - private _keydownEventsObservable: Observable = - new Observable((observer: Observer) => { - const subscription = this._keydownEvents.subscribe(observer); - this._keydownEventSubscriptions++; - - return () => { - subscription.unsubscribe(); - this._keydownEventSubscriptions--; - }; - }); - /** Stream of keydown events dispatched to this overlay. */ _keydownEvents = new Subject(); - /** Amount of subscriptions to the keydown events. */ - _keydownEventSubscriptions = 0; - constructor( private _portalOutlet: PortalOutlet, private _host: HTMLElement, @@ -265,7 +251,7 @@ export class OverlayRef implements PortalOutlet, OverlayReference { /** Gets an observable of keydown events targeted to this overlay. */ keydownEvents(): Observable { - return this._keydownEventsObservable; + return this._keydownEvents.asObservable(); } /** Gets the current overlay configuration, which is immutable. */ diff --git a/tools/public_api_guard/cdk/overlay.d.ts b/tools/public_api_guard/cdk/overlay.d.ts index 73dede914492..de939a687e27 100644 --- a/tools/public_api_guard/cdk/overlay.d.ts +++ b/tools/public_api_guard/cdk/overlay.d.ts @@ -260,7 +260,6 @@ export declare class OverlayPositionBuilder { } export declare class OverlayRef implements PortalOutlet, OverlayReference { - _keydownEventSubscriptions: number; _keydownEvents: Subject; get backdropElement(): HTMLElement | null; get hostElement(): HTMLElement;