From 5af1554bbfda78300acea7b731e3b22e0ae654f4 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 3 Jun 2020 16:05:53 -0400 Subject: [PATCH] Only removeChild valid children in DomRenderer dispose --- src/browser/renderer/dom/DomRenderer.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index a01c2208..d9faf79c 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -95,10 +95,20 @@ export class DomRenderer extends Disposable implements IRenderer { public dispose(): void { this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass); - this._screenElement.removeChild(this._rowContainer); - this._screenElement.removeChild(this._selectionContainer); - this._screenElement.removeChild(this._themeStyleElement); - this._screenElement.removeChild(this._dimensionsStyleElement); + + // Outside influences such as React unmounts may manipulate the DOM before our disposal. + // https://github.com/xtermjs/xterm.js/issues/2960 + for (const element of [ + this._rowContainer, + this._selectionContainer, + this._themeStyleElement, + this._dimensionsStyleElement, + ]) { + if (element.parentElement === this._screenElement) { + this._screenElement.removeChild(element); + } + } + super.dispose(); }