From 15f17595807ced364f0933fe56b8971c484a17a4 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 4 Jun 2020 07:20:59 -0700 Subject: [PATCH] Introduce removeElementFromParent helper --- src/browser/AccessibilityManager.ts | 7 +++---- src/browser/Dom.ts | 10 ++++++++++ src/browser/renderer/BaseRenderLayer.ts | 3 ++- src/browser/renderer/dom/DomRenderer.ts | 6 ++---- 4 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 src/browser/Dom.ts diff --git a/src/browser/AccessibilityManager.ts b/src/browser/AccessibilityManager.ts index 2a34d6a3..af9fee6f 100644 --- a/src/browser/AccessibilityManager.ts +++ b/src/browser/AccessibilityManager.ts @@ -12,6 +12,7 @@ import { addDisposableDomListener } from 'browser/Lifecycle'; import { Disposable } from 'common/Lifecycle'; import { ScreenDprMonitor } from 'browser/ScreenDprMonitor'; import { IRenderService } from 'browser/services/Services'; +import { removeElementFromParent } from 'browser/Dom'; const MAX_ROWS_TO_READ = 20; @@ -106,7 +107,7 @@ export class AccessibilityManager extends Disposable { public dispose(): void { super.dispose(); - this._terminal.element?.removeChild(this._accessibilityTreeRoot); + removeElementFromParent(this._accessibilityTreeRoot); this._rowElements.length = 0; } @@ -240,9 +241,7 @@ export class AccessibilityManager extends Disposable { // Only detach/attach on mac as otherwise messages can go unaccounced if (isMac) { - if (this._liveRegion.parentNode) { - this._accessibilityTreeRoot.removeChild(this._liveRegion); - } + removeElementFromParent(this._liveRegion); } } diff --git a/src/browser/Dom.ts b/src/browser/Dom.ts new file mode 100644 index 00000000..c558a8b1 --- /dev/null +++ b/src/browser/Dom.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2020 The xterm.js authors. All rights reserved. + * @license MIT + */ + +export function removeElementFromParent(...elements: (HTMLElement | undefined)[]): void { + for (const e of elements) { + e?.parentElement?.removeChild(e); + } +} diff --git a/src/browser/renderer/BaseRenderLayer.ts b/src/browser/renderer/BaseRenderLayer.ts index 7d9fb5b8..8afec352 100644 --- a/src/browser/renderer/BaseRenderLayer.ts +++ b/src/browser/renderer/BaseRenderLayer.ts @@ -16,6 +16,7 @@ import { CellData } from 'common/buffer/CellData'; import { IBufferService, IOptionsService } from 'common/services/Services'; import { throwIfFalsy } from 'browser/renderer/RendererUtils'; import { channels, color, rgba } from 'browser/Color'; +import { removeElementFromParent } from 'browser/Dom'; export abstract class BaseRenderLayer implements IRenderLayer { private _canvas: HTMLCanvasElement; @@ -60,7 +61,7 @@ export abstract class BaseRenderLayer implements IRenderLayer { } public dispose(): void { - this._canvas.parentElement?.removeChild(this._canvas); + removeElementFromParent(this._canvas); this._charAtlas?.dispose(); } diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index 9082e36b..572b7114 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -12,6 +12,7 @@ import { ICharSizeService } from 'browser/services/Services'; import { IOptionsService, IBufferService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; import { color } from 'browser/Color'; +import { removeElementFromParent } from 'browser/Dom'; const TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-'; const ROW_CONTAINER_CLASS = 'xterm-rows'; @@ -98,10 +99,7 @@ export class DomRenderer extends Disposable implements IRenderer { // Outside influences such as React unmounts may manipulate the DOM before our disposal. // https://github.com/xtermjs/xterm.js/issues/2960 - this._rowContainer.parentElement?.removeChild(this._rowContainer); - this._selectionContainer.parentElement?.removeChild(this._selectionContainer); - this._themeStyleElement.parentElement?.removeChild(this._themeStyleElement); - this._dimensionsStyleElement.parentElement?.removeChild(this._dimensionsStyleElement); + removeElementFromParent(this._rowContainer, this._selectionContainer, this._themeStyleElement, this._dimensionsStyleElement); super.dispose(); }