2 * @module xterm/utils/DomElementObjectPool
7 * An object pool that manages acquisition and releasing of DOM elements for
8 * when reuse is desirable.
10 export class DomElementObjectPool {
11 private static readonly OBJECT_ID_ATTRIBUTE = 'data-obj-id';
13 private static _objectCount = 0;
15 private _type: string;
16 private _pool: HTMLElement[];
17 private _inUse: {[key: string]: HTMLElement};
20 * @param type The DOM element type (div, span, etc.).
22 constructor(private type: string) {
29 * Acquire an element from the pool, creating it if the pool is empty.
31 public acquire(): HTMLElement {
32 let element: HTMLElement;
33 if (this._pool.length === 0) {
34 element = this._createNew();
36 element = this._pool.pop();
38 this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)] = element;
43 * Release an element back into the pool. It's up to the caller of this
44 * function to ensure that all external references to the element have been
46 * @param element The element being released.
48 public release(element: HTMLElement): void {
49 if (!this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)]) {
50 throw new Error('Could not release an element not yet acquired');
52 delete this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)];
53 this._cleanElement(element);
54 this._pool.push(element);
58 * Creates a new element for the pool.
60 private _createNew(): HTMLElement {
61 const element = document.createElement(this._type);
62 const id = DomElementObjectPool._objectCount++;
63 element.setAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE, id.toString(10));
68 * Resets an element back to a "clean state".
69 * @param element The element to be cleaned.
71 private _cleanElement(element: HTMLElement): void {
72 element.className = '';
73 element.innerHTML = '';