async onUpdate_() {
    shaka.log.info('Updating manifest...');

    goog.asserts.assert(
        this.getUpdatePlaylistDelay_() > 0,
        'We should only call |onUpdate_| when we are suppose to be updating.');

    // Detect a call to stop()
    if (!this.playerInterface_) {
      return;
    }

    try {
      const startTime = Date.now();
      await this.update();

      // Keep track of how long the longest manifest update took.
      const endTime = Date.now();

      // This may have converted to VOD, in which case we stop updating.
      if (this.isLive_()) {
        const updateDuration = (endTime - startTime) / 1000.0;
        this.averageUpdateDuration_.sample(1, updateDuration);
        const delay = this.config_.updatePeriod > 0 ?
            this.config_.updatePeriod : this.getUpdatePlaylistDelay_();
        const finalDelay = Math.max(0,
            delay - this.averageUpdateDuration_.getEstimate());
        this.updatePlaylistTimer_.tickAfter(/* seconds= */ finalDelay);
      }
    } catch (error) {
      // Detect a call to stop() during this.update()
      if (!this.playerInterface_) {
        return;
      }

      goog.asserts.assert(error instanceof shaka.util.Error,
          'Should only receive a Shaka error');

      if (this.config_.raiseFatalErrorOnManifestUpdateRequestFailure) {
        this.playerInterface_.onError(error);
        return;
      }

      // We will retry updating, so override the severity of the error.
      error.severity = shaka.util.Error.Severity.RECOVERABLE;
      this.playerInterface_.onError(error);

      // Try again very soon.
      this.updatePlaylistTimer_.tickAfter(/* seconds= */ 0.1);
    }

    // Detect a call to stop()
    if (!this.playerInterface_) {
      return;
    }

    this.playerInterface_.onManifestUpdated();
  }
Called when the update timer ticks. Because parsing a manifest is async,
this method is async. To work with this, this method will schedule the next
update when it finished instead of using a repeating-start.

@return {!Promise}
@private