From b0667aacca4cc1d0c14d57bb6f51333bd03fecea Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 4 Jan 2024 22:05:23 +0100 Subject: [PATCH 1/4] fix: memory leak in CoreBrowserService --- src/browser/services/CoreBrowserService.ts | 28 ++++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index 575b62b6..9999ceec 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -3,17 +3,17 @@ * @license MIT */ -import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; -import { ICoreBrowserService } from './Services'; -import { EventEmitter, forwardEvent } from 'common/EventEmitter'; -import { addDisposableDomListener } from 'browser/Lifecycle'; +import { Disposable, MutableDisposable, toDisposable } from "common/Lifecycle"; +import { ICoreBrowserService } from "./Services"; +import { EventEmitter, forwardEvent } from "common/EventEmitter"; +import { addDisposableDomListener } from "browser/Lifecycle"; export class CoreBrowserService extends Disposable implements ICoreBrowserService { public serviceBrand: undefined; private _isFocused = false; private _cachedIsFocused: boolean | undefined = undefined; - private _screenDprMonitor = new ScreenDprMonitor(this._window); + private _screenDprMonitor = this.register(new ScreenDprMonitor(this._window)); private readonly _onDprChange = this.register(new EventEmitter()); public readonly onDprChange = this._onDprChange.event; @@ -28,11 +28,11 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic super(); // Monitor device pixel ratio - this.register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w))); + this.register(this.onWindowChange((w) => this._screenDprMonitor.setWindow(w))); this.register(forwardEvent(this._screenDprMonitor.onDprChange, this._onDprChange)); - this._textarea.addEventListener('focus', () => this._isFocused = true); - this._textarea.addEventListener('blur', () => this._isFocused = false); + this._textarea.addEventListener("focus", () => (this._isFocused = true)); + this._textarea.addEventListener("blur", () => (this._isFocused = false)); } public get window(): Window & typeof globalThis { @@ -53,13 +53,12 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic public get isFocused(): boolean { if (this._cachedIsFocused === undefined) { this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus(); - queueMicrotask(() => this._cachedIsFocused = undefined); + queueMicrotask(() => (this._cachedIsFocused = undefined)); } return this._cachedIsFocused; } } - /** * The screen device pixel ratio monitor allows listening for when the * window.devicePixelRatio value changes. This is done not with polling but with @@ -94,7 +93,6 @@ class ScreenDprMonitor extends Disposable { this.register(toDisposable(() => this.clearListener())); } - public setWindow(parentWindow: Window): void { this._parentWindow = parentWindow; this._setWindowResizeListener(); @@ -102,7 +100,9 @@ class ScreenDprMonitor extends Disposable { } private _setWindowResizeListener(): void { - this._windowResizeListener.value = addDisposableDomListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers()); + this._windowResizeListener.value = addDisposableDomListener(this._parentWindow, "resize", () => + this._setDprAndFireIfDiffers() + ); } private _setDprAndFireIfDiffers(): void { @@ -122,7 +122,9 @@ class ScreenDprMonitor extends Disposable { // Add listeners for new DPR this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio; - this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`); + this._resolutionMediaMatchList = this._parentWindow.matchMedia( + `screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)` + ); this._resolutionMediaMatchList.addListener(this._outerListener); } From 9e98b631da085b099af25634bca7100d35162806 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 4 Jan 2024 22:29:12 +0100 Subject: [PATCH 2/4] use disposable for text area listeners --- src/browser/services/CoreBrowserService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index 9999ceec..8a400ffd 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -31,8 +31,8 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic this.register(this.onWindowChange((w) => this._screenDprMonitor.setWindow(w))); this.register(forwardEvent(this._screenDprMonitor.onDprChange, this._onDprChange)); - this._textarea.addEventListener("focus", () => (this._isFocused = true)); - this._textarea.addEventListener("blur", () => (this._isFocused = false)); + this.register(addDisposableDomListener(this._textarea, 'focus', () => (this._isFocused = true))) + this.register(addDisposableDomListener(this._textarea, 'blur', () => (this._isFocused = false))) } public get window(): Window & typeof globalThis { From f4869896977168bd608e7f878509bcde48559012 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 4 Jan 2024 22:32:59 +0100 Subject: [PATCH 3/4] fix formatting --- src/browser/services/CoreBrowserService.ts | 28 ++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index 8a400ffd..6b2c13c3 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -3,10 +3,10 @@ * @license MIT */ -import { Disposable, MutableDisposable, toDisposable } from "common/Lifecycle"; -import { ICoreBrowserService } from "./Services"; -import { EventEmitter, forwardEvent } from "common/EventEmitter"; -import { addDisposableDomListener } from "browser/Lifecycle"; +import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; +import { ICoreBrowserService } from './Services'; +import { EventEmitter, forwardEvent } from 'common/EventEmitter'; +import { addDisposableDomListener } from 'browser/Lifecycle'; export class CoreBrowserService extends Disposable implements ICoreBrowserService { public serviceBrand: undefined; @@ -28,11 +28,15 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic super(); // Monitor device pixel ratio - this.register(this.onWindowChange((w) => this._screenDprMonitor.setWindow(w))); + this.register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w))); this.register(forwardEvent(this._screenDprMonitor.onDprChange, this._onDprChange)); - this.register(addDisposableDomListener(this._textarea, 'focus', () => (this._isFocused = true))) - this.register(addDisposableDomListener(this._textarea, 'blur', () => (this._isFocused = false))) + this.register( + addDisposableDomListener(this._textarea, 'focus', () => (this._isFocused = true)) + ); + this.register( + addDisposableDomListener(this._textarea, 'blur', () => (this._isFocused = false)) + ); } public get window(): Window & typeof globalThis { @@ -53,12 +57,13 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic public get isFocused(): boolean { if (this._cachedIsFocused === undefined) { this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus(); - queueMicrotask(() => (this._cachedIsFocused = undefined)); + queueMicrotask(() => this._cachedIsFocused = undefined); } return this._cachedIsFocused; } } + /** * The screen device pixel ratio monitor allows listening for when the * window.devicePixelRatio value changes. This is done not with polling but with @@ -93,6 +98,7 @@ class ScreenDprMonitor extends Disposable { this.register(toDisposable(() => this.clearListener())); } + public setWindow(parentWindow: Window): void { this._parentWindow = parentWindow; this._setWindowResizeListener(); @@ -100,7 +106,7 @@ class ScreenDprMonitor extends Disposable { } private _setWindowResizeListener(): void { - this._windowResizeListener.value = addDisposableDomListener(this._parentWindow, "resize", () => + this._windowResizeListener.value = addDisposableDomListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers() ); } @@ -122,9 +128,7 @@ class ScreenDprMonitor extends Disposable { // Add listeners for new DPR this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio; - this._resolutionMediaMatchList = this._parentWindow.matchMedia( - `screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)` - ); + this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`); this._resolutionMediaMatchList.addListener(this._outerListener); } From 819254e5403cc4a1adb8b5be39eb0c0af2d22460 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 4 Jan 2024 22:33:39 +0100 Subject: [PATCH 4/4] fix formatting --- src/browser/services/CoreBrowserService.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index 6b2c13c3..a6c066b2 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -106,9 +106,7 @@ class ScreenDprMonitor extends Disposable { } private _setWindowResizeListener(): void { - this._windowResizeListener.value = addDisposableDomListener(this._parentWindow, 'resize', () => - this._setDprAndFireIfDiffers() - ); + this._windowResizeListener.value = addDisposableDomListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers()); } private _setDprAndFireIfDiffers(): void {