Source: ui/icon.js

/*! @license
 * Shaka Player
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

goog.provide('shaka.ui.Icon');

goog.require('shaka.util.Dom');

/**
 * @final
 * @export
 */
shaka.ui.Icon = class {
  /**
   * @param {?Element} parent
   * @param {?(shaka.extern.UIIcon | string)=} icon
   */
  constructor(parent, icon) {
    this.parent = parent;

    /** @private {!SVGElement} */
    this.svg_ = shaka.util.Dom.createSVGElement('svg');

    this.svg_.classList.add('shaka-ui-icon');
    this.svg_.setAttribute('viewBox', '0 -960 960 960');

    if (icon) {
      this.use(icon);
    }

    if (this.parent) {
      parent.appendChild(this.svg_);
    }
  }

  /**
   * If a single string is passed, it is treated as an SVG path
   * @param {shaka.extern.UIIcon | string} icon
   * @export
   */
  use(icon) {
    // check if it is empty string or null or undefined
    if (!icon) {
      return;
    }

    // remove all previous path elements
    this.emptyChildNodes_();

    if (typeof icon == 'string') {
      this.svg_.style.setProperty('font-size', '');
      this.applyInlinedSVG_(icon, null);
    } else if (typeof icon == 'object') {
      const url = icon['url'];
      const path = icon['path'];
      const viewBox = icon['viewBox'];
      const size = icon['size'];

      this.svg_.style.setProperty('font-size', size ? size + 'px': '');

      if (url) {
        // let handle the background-color (icon color) by CSS
        this.svg_.style.setProperty('background-color', '');
        this.svg_.style.setProperty('mask-image', `url("${url}")`);
      } else if (path) {
        this.applyInlinedSVG_(path, viewBox);
      }
    }
  }

  /**
   * @return {!SVGElement}
   * @export
   */
  getSvgElement() {
    return this.svg_;
  }


  /**
   * @param {string | Array<string>} path
   * @param {?string} viewBox
   * @private
   */
  applyInlinedSVG_(path, viewBox) {
    // do not need a background color if mask-image isn't using
    this.svg_.style.setProperty('background-color', 'transparent');
    this.svg_.style.setProperty('mask-image', '');
    this.svg_.setAttribute('viewBox', viewBox || '0 -960 960 960');

    if (Array.isArray(path)) {
      for (let i = 0, l = path.length; i < l; i++) {
        this.addPath_(path[i]);
      }
    } else if (path) {
      this.addPath_(path);
    }
  }

  /**
   * Add a path element, call `emptyChildNodes()` first to clean previous
   * path elements.
   * @param {string} path
   * @private
   */
  addPath_(path) {
    const el = shaka.util.Dom.createSVGElement('path');
    el.setAttribute('d', path);
    this.svg_.appendChild(el);
  }

  /**
   * Remove all the child nodes from svg element
   * @private
   */
  emptyChildNodes_() {
    const childNodes = this.svg_.childNodes;
    for (let i = 0, l = childNodes.length, child; i < l; i++) {
      child = childNodes[i];
      if (child instanceof SVGPathElement) {
        child.remove();
      }
    }
  }
};