/**
 * @file time-display.js
 */
從“全局/文檔”導入文檔;
從 '../../component.js' 導入組件;
import * as Dom from '../../utils/dom.js';
從 '../../utils/format-time.js' 導入格式時間;
從 '../../utils/log.js' 導入日誌;

/**
 * 顯示有關視頻的時間信息
 *
 * @extends 組件
 */
類 TimeDisplay 擴展組件 {

  /**
   * 創建此類的一個實例。
   *
   * @param {Player} 播放器
   * 此類應附加到的 `Player`。
   *
   * @param {對象} [選項]
   * 播放器選項的鍵/值存儲。
   */
  構造函數(播放器,選項){
    超級(播放器,選項);

    this.on(player, ['timeupdate', 'ended'], (e) => this.updateContent(e));
    this.updateTextNode_();
  }

  /**
   * 創建 `Component` 的 DOM 元素
   *
   * @return {元素}
   * 創建的元素。
   */
  創建El() {
    const className = this.buildCSSClass();
    const el = super.createEl('div', {
      類名:`${className} vjs-time-control vjs-control`
    });
    const span = Dom.createEl('span', {
      className: 'vjs-control-text',
      textContent: `${this.localize(this.labelText_)}\u00a0`
    },{
      角色:'演示'
    });

    el.appendChild(span);

    this.contentEl_ = Dom.createEl('span', {
      類名:`${className}-display`
    },{
      // 告訴屏幕閱讀器不要在時間變化時自動讀取時間
      'aria-live':'關閉',
      // span 元素沒有隱含的作用,但有一些屏幕閱讀器(特別是 VoiceOver)
      // 使用箭頭鍵時,將它們視為 DOM 中項目之間的中斷
      //(或在 iOS 上從左向右滑動)讀取頁面內容。使用
      // role='presentation' 導致 VoiceOver 不將此跨度視為中斷。
      '角色':'演示'
    });

    el.appendChild(this.contentEl_);
    返回 el;
  }

  處置(){
    this.contentEl_ = null;
    this.textNode_ = null;

    super.dispose();
  }

  /**
   * 用新時間更新時間顯示文本節點
   *
   * @param {number} [time=0] 更新時間
   *
   * @私人的
   */
  updateTextNode_(time = 0) {
    時間 = 格式時間(時間);

    如果(this.formattedTime_ === 時間){
      返回;
    }

    this.formattedTime_ = 時間;

    this.requestNamedAnimationFrame('TimeDisplay#updateTextNode_', () => {
      如果(!this.contentEl_){
        返回;
      }

      讓 oldNode = this.textNode_;

      if (oldNode && this.contentEl_.firstChild !== oldNode) {
        舊節點=空;

        log.warn('TimeDisplay#updateTextnode_:防止替換文本節點元素,因為它不再是該節點的子節點。而是附加一個新節點。');
      }

      this.textNode_ = document.createTextNode(this.formattedTime_);

      如果(!this.textNode_){
        返回;
      }

      如果(舊節點){
        this.contentEl_.replaceChild(this.textNode_, oldNode);
      }其他{
        this.contentEl_.appendChild(this.textNode_);
      }
    });
  }

  /**
   * 要在子班填寫,應該更新顯示的時間
   * 根據當前時間已更改的事實。
   *
   * @param {EventTarget~Event} [事件]
   * 導致此運行的 `timeupdate` 事件。
   *
   * @listens Player#timeupdate
   */
  更新內容(事件){}
}

/**
 * 為屏幕閱讀器用戶添加到 `TimeDisplay` 的文本。
 *
 * @type {字符串}
 * @私人的
 */
TimeDisplay.prototype.labelText_ = '時間';

/**
 * 應該顯示在 `TimeDisplay` 控件上的文本。添加到本地化。
 *
 * @type {字符串}
 * @私人的
 *
 * @在 v7 中已棄用; controlText_ 不用於非活動顯示組件
 */
TimeDisplay.prototype.controlText_ = '時間';

Component.registerComponent('TimeDisplay', TimeDisplay);
導出默認時間顯示;