From bc766ae5c90033c828910b4519b851d91ad4f145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Fri, 17 Apr 2026 11:22:31 +0400 Subject: [PATCH] Fix event listener and observer leaks in cookie banner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Émile Ré --- packages/cookie-banner/src/components/category.ts | 2 +- .../cookie-banner/src/components/cookie-banner-root.ts | 7 +++++++ .../cookie-banner/src/components/preference-panel.ts | 9 +++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/cookie-banner/src/components/category.ts b/packages/cookie-banner/src/components/category.ts index a9d79d7b1..3b59c1918 100644 --- a/packages/cookie-banner/src/components/category.ts +++ b/packages/cookie-banner/src/components/category.ts @@ -18,7 +18,7 @@ import { ProboElement } from "./base"; export class ProboCategory extends ProboElement { get categoryName(): string { - return this.getAttribute("name") ?? ""; + return this.getAttribute("name") ?? "Other"; } get required(): boolean { diff --git a/packages/cookie-banner/src/components/cookie-banner-root.ts b/packages/cookie-banner/src/components/cookie-banner-root.ts index 2b0f98c5a..f5f79ac6e 100644 --- a/packages/cookie-banner/src/components/cookie-banner-root.ts +++ b/packages/cookie-banner/src/components/cookie-banner-root.ts @@ -53,6 +53,13 @@ export class ProboCookieBannerRoot extends ProboElement implements ProboRootElem this.initClient(); } + disconnectedCallback(): void { + if (this._client) { + this._client.destroy(); + this._client = null; + } + } + setState(state: ProboState): void { const prev = this._state; this._state = state; diff --git a/packages/cookie-banner/src/components/preference-panel.ts b/packages/cookie-banner/src/components/preference-panel.ts index d680ffd91..552947acb 100644 --- a/packages/cookie-banner/src/components/preference-panel.ts +++ b/packages/cookie-banner/src/components/preference-panel.ts @@ -26,6 +26,9 @@ export class ProboPreferencePanel extends ProboElement { private onStateChange = (e: Event): void => { const { state } = (e as CustomEvent).detail; this.hidden = state !== "panel"; + if (state === "panel") { + (this.root as ProboCookieBannerRoot).resetDraft(); + } }; connectedCallback(): void { @@ -34,12 +37,6 @@ export class ProboPreferencePanel extends ProboElement { if (this.root) { this.root.addEventListener("probo-state", this.onStateChange); - this.root.addEventListener("probo-state", (e: Event) => { - const { state } = (e as CustomEvent).detail; - if (state === "panel") { - (this.root as ProboCookieBannerRoot).resetDraft(); - } - }); } this.scheduleValidation(() => this.validate());