2 * Copyright (c) 2019 The xterm.js authors. All rights reserved.
6 import { ITerminalAddon, IDisposable, Terminal } from 'xterm';
8 export interface ILoadedAddon {
9 instance: ITerminalAddon;
14 export class AddonManager implements IDisposable {
15 protected _addons: ILoadedAddon[] = [];
20 public dispose(): void {
21 for (let i = this._addons.length - 1; i >= 0; i--) {
22 this._addons[i].instance.dispose();
26 public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {
27 const loadedAddon: ILoadedAddon = {
29 dispose: instance.dispose,
32 this._addons.push(loadedAddon);
33 instance.dispose = () => this._wrappedAddonDispose(loadedAddon);
34 instance.activate(<any>terminal);
37 private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {
38 if (loadedAddon.isDisposed) {
39 // Do nothing if already disposed
43 for (let i = 0; i < this._addons.length; i++) {
44 if (this._addons[i] === loadedAddon) {
50 throw new Error('Could not dispose an addon that has not been loaded');
52 loadedAddon.isDisposed = true;
53 loadedAddon.dispose.apply(loadedAddon.instance);
54 this._addons.splice(index, 1);