/**
 * @file resize-manager.js
 */
從“全局/窗口”導入窗口;
從'./utils/fn.js'導入{debounce};
import * as Events from './utils/events.js';
從 './utils/merge-options.js' 導入 mergeOptions;
從 './component.js' 導入組件;

/**
 * 調整大小管理器。它負責在適當的條件下觸發播放器上的“playerresize”。
 *
 * 它將創建一個 iframe 並在其上使用去抖動調整大小處理程序或使用新的 {@link https://wicg.github.io/ResizeObserver/|ResizeObserver}。
 *
 * 如果 ResizeObserver 本機可用,則將使用它。可以將聚合填充作為選項傳入。
 * 如果不需要 `playerresize` 事件,可以從播放器中刪除 ResizeManager 組件,請參見下面的示例。
 * @example <caption>如何禁用調整大小管理器</caption>
 * const player = videojs('#vid', {
 * 調整大小管理器:假
 * });
 *
 * @see {@link https://wicg.github.io/ResizeObserver/|ResizeObserver 規範}
 *
 * @extends 組件
 */
類 ResizeManager 擴展組件 {

  /**
   * 創建調整大小管理器。
   *
   * @param {Object} 播放器
   * 此類應附加到的 `Player`。
   *
   * @param {對象} [選項]
   * ResizeManager 選項的鍵/值存儲。
   *
   * @param {Object} [options.ResizeObserver]
   * 這裡可以傳入一個 ResizeObserver 的 polyfill。
   * 如果將其設置為 null,它將忽略本機 ResizeObserver 並回退到 iframe 回退。
   */
  構造函數(播放器,選項){
    讓 RESIZE_OBSERVER_AVAILABLE = options.ResizeObserver ||窗口.ResizeObserver;

    // 如果傳遞了 `null`,我們要禁用 ResizeObserver
    如果(選項。ResizeObserver === null){
      RESIZE_OBSERVER_AVAILABLE = false;
    }

    // 只有當 ResizeObserver 不可用時才創建一個元素
    const options_ = mergeOptions({
      創意月光:!可調整觀察伺服器的大小,
      reportTouchActivity:假
    }, 選項);

    超級(玩家,選項_);

    this.ResizeObserver = options.ResizeObserver ||窗口.ResizeObserver;
    this.loadListener_ = null;
    this.resizeObserver_ = null;
    this.debouncedHandler_ = debounce(() => {
      這個.resizeHandler();
    }, 100, 假的, 這個);

    如果(RESIZE_OBSERVER_AVAILABLE){
      this.resizeObserver_ = new this.ResizeObserver(this.debouncedHandler_);
      this.resizeObserver_.observe(player.el());

    }其他{
      this.loadListener_ = () => {
        如果(!this.el_ || !this.el_.contentWindow){
          返回;
        }

        const debouncedHandler_ = this.debouncedHandler_;
        讓 unloadListener_ = this.unloadListener_ = function() {
          Events.off(this, 'resize', debouncedHandler_);
          Events.off(this, 'unload', unloadListener_);

          unloadListener_ = null;
        };

        // safari 和 edge 可以在 resizemanager dispose 之前卸載 iframe
        // 我們必須在此之前正確處理事件處理程序
        Events.on(this.el_.contentWindow, 'unload', unloadListener_);
        Events.on(this.el_.contentWindow, 'resize', debouncedHandler_);
      };

      this.one('load', this.loadListener_);
    }
  }

  創建El() {
    返回 super.createEl('iframe', {
      className: 'vjs-resize-manager',
      選項卡索引:-1,
      title: this.localize('無內容')
    },{
      'aria-hidden': 'true'
    });
  }

  /**
   * 當在 iframe 上觸發調整大小時或通過 ResizeObserver 觀察到調整大小時調用
   *
   * @fires Player#playerresize
   */
  調整大小處理程序(){
    /**
     * 當播放器大小改變時調用
     *
     * @event Player#playerresize
     * @type {EventTarget~Event}
     */
    // 確保玩家還在附近觸發
    // 防止這在處理後導致錯誤
    如果(!this.player_ || !this.player_.trigger){
      返回;
    }

    this.player_.trigger('playerresize');
  }

  處置(){
    如果(this.debouncedHandler_){
      this.debouncedHandler_.cancel();
    }

    如果(this.resizeObserver_){
      如果 (this.player_.el()) {
        this.resizeObserver_.unobserve(this.player_.el());
      }
      this.resizeObserver_.disconnect();
    }

    如果(this.loadListener_){
      this.off('load', this.loadListener_);
    }

    如果(this.el_ && this.el_.contentWindow && this.unloadListener_){
      this.unloadListener_.call(this.el_.contentWindow);
    }

    this.ResizeObserver = null;
    this.resizeObserver = null;
    this.debouncedHandler_ = null;
    this.loadListener_ = null;
    super.dispose();
  }

}

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