From 729d6b979d4a1df321b7c592f4b61014e1b4a53e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Fri, 15 Nov 2024 13:47:52 +0100 Subject: [PATCH 1/3] Do not dispose dialogs on close. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #12093 The about dialog in Theia is reopened and must no be disposed on close. Contributed on behalf of STMicroelectronics Signed-off-by: Thomas Mäder --- .../browser/common-frontend-contribution.ts | 2 +- packages/core/src/browser/dialogs.ts | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/core/src/browser/common-frontend-contribution.ts b/packages/core/src/browser/common-frontend-contribution.ts index 64489486e30f0..a1bb4f383ac31 100644 --- a/packages/core/src/browser/common-frontend-contribution.ts +++ b/packages/core/src/browser/common-frontend-contribution.ts @@ -1199,7 +1199,7 @@ export class CommonFrontendContribution implements FrontendApplicationContributi } protected async openAbout(): Promise { - this.aboutDialog.open(); + this.aboutDialog.open(false); } protected shouldPreventClose = false; diff --git a/packages/core/src/browser/dialogs.ts b/packages/core/src/browser/dialogs.ts index 73f0338a86919..29d07541cf908 100644 --- a/packages/core/src/browser/dialogs.ts +++ b/packages/core/src/browser/dialogs.ts @@ -258,13 +258,15 @@ export abstract class AbstractDialog extends BaseWidget { } } - open(): Promise { + open(disposeOnResolve: boolean = true): Promise { if (this.resolve) { return Promise.reject(new Error('The dialog is already opened.')); } this.activeElement = this.node.ownerDocument.activeElement as HTMLElement; return new Promise((resolve, reject) => { - this.resolve = resolve; + this.resolve = value => { + resolve(value); + }; this.reject = reject; this.toDisposeOnDetach.push(Disposable.create(() => { this.resolve = undefined; @@ -273,9 +275,23 @@ export abstract class AbstractDialog extends BaseWidget { Widget.attach(this, this.node.ownerDocument.body); this.activate(); + }).finally(() => { + if (disposeOnResolve) { + this.dispose(); + } }); } + protected override onCloseRequest(msg: Message): void { + // super.onCloseRequest() would automatically dispose the dialog, which we don't want because we're reusing it + if (this.parent) { + this.parent = null; + } + else if (this.isAttached) { + Widget.detach(this); + } + } + override close(): void { if (this.resolve) { if (this.activeElement) { From a71b7a89421a0b4097ddd2420512caa853d16ceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Fri, 15 Nov 2024 14:05:04 +0100 Subject: [PATCH 2/3] Add readme entry. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Thomas Mäder --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dca6f5fcd8b1..6712df22695fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) +[Breaking Changes:](#breaking_changes_1.56.0) +- [core] Do not dispose dialogs on close - [#14456](https://github.com/eclipse-theia/theia/pull/14456) - Contributed on behalf of STMicroelectronics ## 1.55.0 - 10/31/2024 From 88c6975bdc36498128fd8c48bd229c3256664910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Fri, 15 Nov 2024 15:01:35 +0100 Subject: [PATCH 3/3] Satisfy the linter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Thomas Mäder --- packages/core/src/browser/dialogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/browser/dialogs.ts b/packages/core/src/browser/dialogs.ts index 29d07541cf908..ef8d172c5b0d1 100644 --- a/packages/core/src/browser/dialogs.ts +++ b/packages/core/src/browser/dialogs.ts @@ -285,9 +285,9 @@ export abstract class AbstractDialog extends BaseWidget { protected override onCloseRequest(msg: Message): void { // super.onCloseRequest() would automatically dispose the dialog, which we don't want because we're reusing it if (this.parent) { + // eslint-disable-next-line no-null/no-null this.parent = null; - } - else if (this.isAttached) { + } else if (this.isAttached) { Widget.detach(this); } }