async download(revision, progressCallback) {
    const zipPath = path.join(
      this._downloadsFolder,
      `download-${this._platform}-${revision}.zip`,
    );
    const folderPath = this._getFolderPath(revision);
    if (await existsAsync(folderPath)) {
      return this.revisionInfo;
    }
    if (!(await existsAsync(this._downloadsFolder))) {
      await mkdirAsync(this._downloadsFolder);
    }
    try {
      await downloadFile(this.downloadURL, zipPath, progressCallback);
      await extractZip(zipPath, folderPath);
    } finally {
      if (await existsAsync(zipPath)) {
        await unlinkAsync(zipPath);
      }
    }
    const revisionInfo = this.revisionInfo;
    if (revisionInfo) {
      await chmodAsync(revisionInfo.executablePath, 0o755);
    }
    return revisionInfo;
  }
@param {string} revision
@param {?function(number, number)} progressCallback
@return {!Promise<!BrowserMetadata.RevisionInfo>}