async destroy(forceDisconnect = false) {
    if (document.pictureInPictureElement == this.localVideo_) {
      await document.exitPictureInPicture();
    }

    if (this.eventManager_) {
      this.eventManager_.release();
      this.eventManager_ = null;
    }

    if (this.mouseStillTimer_) {
      this.mouseStillTimer_.stop();
      this.mouseStillTimer_ = null;
    }

    if (this.fadeControlsTimer_) {
      this.fadeControlsTimer_.stop();
      this.fadeControlsTimer_ = null;
    }

    if (this.hideSettingsMenusTimer_) {
      this.hideSettingsMenusTimer_.stop();
      this.hideSettingsMenusTimer_ = null;
    }

    if (this.timeAndSeekRangeTimer_) {
      this.timeAndSeekRangeTimer_.stop();
      this.timeAndSeekRangeTimer_ = null;
    }

    if (this.vr_) {
      this.vr_.release();
      this.vr_ = null;
    }

    // Important!  Release all child elements before destroying the cast proxy
    // or player.  This makes sure those destructions will not trigger event
    // listeners in the UI which would then invoke the cast proxy or player.
    this.releaseChildElements_();

    if (this.controlsContainer_) {
      this.videoContainer_.removeChild(this.controlsContainer_);
      this.controlsContainer_ = null;
    }

    if (this.castProxy_) {
      await this.castProxy_.destroy(forceDisconnect);
      this.castProxy_ = null;
    }

    if (this.spinnerContainer_) {
      this.videoContainer_.removeChild(this.spinnerContainer_);
      this.spinnerContainer_ = null;
    }

    if (this.clientAdContainer_) {
      this.videoContainer_.removeChild(this.clientAdContainer_);
      this.clientAdContainer_ = null;
    }

    if (this.localPlayer_) {
      await this.localPlayer_.destroy();
      this.localPlayer_ = null;
    }
    this.player_ = null;

    this.localVideo_ = null;
    this.video_ = null;

    this.localization_ = null;
    this.pressedKeys_.clear();

    this.removeMediaSession_();

    // FakeEventTarget implements IReleasable
    super.release();
  }
@param {boolean=} forceDisconnect If true, force the receiver app to shut
  down by disconnecting.  Does nothing if not connected.
@override
@export