/**
 * @file text-track-menu-item.js
 */
從 '../../menu/menu-item.js' 導入 MenuItem;
從 '../../component.js' 導入組件;
從“全局/窗口”導入窗口;
從“全局/文檔”導入文檔;

/**
 * 用於在文本軌道類型中選擇語言的特定菜單項類型
 *
 * @extends 菜單項
 */
類 TextTrackMenuItem 擴展 MenuItem {

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

    // 修改父 MenuItem 類的 init 的選項。
    options.label = track.label ||跟踪語言 || '未知';
    options.selected = track.mode === '顯示';

    超級(播放器,選項);

    this.track = 軌道;
    // 確定此組件和過濾器的相關軌道類型
    // 空種類。
    this.kinds = (options.kinds || [options.kind || this.track.kind]).filter(Boolean);

    const changeHandler = (...args) => {
      this.handleTracksChange.apply(this, args);
    };
    const selectedLanguageChangeHandler = (...args) => {
      this.handleSelectedLanguageChange.apply(this, args);
    };

    player.on(['loadstart', 'texttrackchange'], changeHandler);
    tracks.addEventListener('change', changeHandler);
    tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
    this.on('處置', function() {
      player.off(['loadstart', 'texttrackchange'], changeHandler);
      tracks.removeEventListener('change', changeHandler);
      tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
    });

    // iOS7 doesn't dispatch change events to TextTrackLists when an
    // 相關軌道的模式改變。沒有類似的東西
    // Object.observe()(在 iOS7 上也不存在),它不是
    // 可以檢測模式屬性和 polyfill 的變化
    // 改變事件。作為一個糟糕的替代品,我們手動調度
    // 每當控件修改模式時更改事件。
    如果(tracks.onchange ===未定義){
      讓事件;

      this.on(['點擊', '點擊'], 函數() {
        if (typeof window.Event !== 'object') {
          // Android 2.3 為 window.Event 拋出 Illegal Constructor 錯誤
          嘗試{
            event = new window.Event('改變');
          } 抓住(錯誤){
            // 不管錯誤繼續
          }
        }

        如果(!事件){
          event = document.createEvent('事件');
          event.initEvent('改變', 真, 真);
        }

        tracks.dispatchEvent(事件);
      });
    }

    // 根據當前曲目設置默認狀態
    this.handleTracksChange();
  }

  /**
   * 當 `TextTrackMenuItem` 被“點擊”時調用。看
   * {@link ClickableComponent} 以獲取有關點擊的更多詳細信息。
   *
   * @param {EventTarget~Event} 事件
   * 導致此功能被執行的 `keydown`、`tap` 或 `click` 事件
   * 打電話。
   *
   * @listens 水龍頭
   * @listens 點擊
   */
  handleClick(事件){
    const referenceTrack = this.track;
    const tracks = this.player_.textTracks();

    super.handleClick(事件);

    如果(!曲目){
      返回;
    }

    for (let i = 0; i < tracks.length; i++) {
      const track = tracks[i];

      // 如果文本軌道列表中的軌道類型不正確,
      // 跳過它。我們不想影響不兼容類型的曲目。
      如果 (this.kinds.indexOf(track.kind) === -1) {
        繼續;
      }

      // 如果此文本軌道是組件的軌道並且未顯示,
      // 設置為顯示。
      如果(軌道===參考軌道){
        if (track.mode !== 'showing') {
          track.mode = '顯示';
        }

      // 如果這個文本軌道不是組件的軌道並且它不是
      //禁用,將其設置為禁用。
      } else if (track.mode !== 'disabled') {
        track.mode = '禁用';
      }
    }
  }

  /**
   * 處理文本曲目列表更改
   *
   * @param {EventTarget~Event} 事件
   * 導致此函數被調用的 `change` 事件。
   *
   * @listens TextTrackList#change
   */
  handleTracksChange(事件){
    const shouldBeSelected = this.track.mode === '顯示';

    // 防止多餘的 selected() 調用,因為它們可能會導致
    // 屏幕閱讀器不必要地閱讀附加的控製文本
    if (shouldBeSelected !== this.isSelected_) {
      this.selected(shouldBeSelected);
    }
  }

  handleSelectedLanguageChange(事件){
    如果(this.track.mode ==='顯示'){
      const selectedLanguage = this.player_.cache_.selectedLanguage;

      // 跨同一種語言不要替換那種曲目
      如果(選定語言 && 選定語言。已啟用 &&
        selectedLanguage.language === this.track.language &&
        selectedLanguage.kind !== this.track.kind) {
        返回;
      }

      this.player_.cache_.selectedLanguage = {
        啟用:真,
        語言:this.track.language,
        種類:this.track.kind
      };
    }
  }

  處置(){
    // 在處理時刪除對跟踪對象的引用
    this.track = null;

    super.dispose();
  }

}

Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
導出默認 TextTrackMenuItem;