| Index: chrome/browser/extensions/webstore_installer.cc
 | 
| diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc
 | 
| index f9caccad4e009a2ddf73fafdcc52cf18ca92a8eb..9f01e0271dccf59ed26ddc1745e4bdb158ad76ee 100644
 | 
| --- a/chrome/browser/extensions/webstore_installer.cc
 | 
| +++ b/chrome/browser/extensions/webstore_installer.cc
 | 
| @@ -19,6 +19,7 @@
 | 
|  #include "base/strings/string_util.h"
 | 
|  #include "base/strings/stringprintf.h"
 | 
|  #include "base/strings/utf_string_conversions.h"
 | 
| +#include "base/time/time.h"
 | 
|  #include "chrome/browser/chrome_notification_types.h"
 | 
|  #include "chrome/browser/download/download_crx_util.h"
 | 
|  #include "chrome/browser/download/download_prefs.h"
 | 
| @@ -84,6 +85,8 @@ const char kInlineInstallSource[] = "inline";
 | 
|  const char kDefaultInstallSource[] = "ondemand";
 | 
|  const char kAppLauncherInstallSource[] = "applauncher";
 | 
|  
 | 
| +const size_t kTimeRemainingMinutesThreshold = 1u;
 | 
| +
 | 
|  // Folder for downloading crx files from the webstore. This is used so that the
 | 
|  // crx files don't go via the usual downloads folder.
 | 
|  const base::FilePath::CharType kWebstoreDownloadFolder[] =
 | 
| @@ -303,10 +306,6 @@ void WebstoreInstaller::Start() {
 | 
|    }
 | 
|    ExtensionSystem::Get(profile_)->install_verifier()->AddProvisional(ids);
 | 
|  
 | 
| -  // TODO(crbug.com/305343): Query manifest of dependencises before
 | 
| -  // downloading & installing those dependencies.
 | 
| -  DownloadNextPendingModule();
 | 
| -
 | 
|    std::string name;
 | 
|    if (!approval_->manifest->value()->GetString(manifest_keys::kName, &name)) {
 | 
|      NOTREACHED();
 | 
| @@ -321,6 +320,12 @@ void WebstoreInstaller::Start() {
 | 
|        approval_->manifest->is_platform_app());
 | 
|    params.is_ephemeral = approval_->is_ephemeral;
 | 
|    tracker->OnBeginExtensionInstall(params);
 | 
| +
 | 
| +  tracker->OnBeginExtensionDownload(id_);
 | 
| +
 | 
| +  // TODO(crbug.com/305343): Query manifest of dependencies before
 | 
| +  // downloading & installing those dependencies.
 | 
| +  DownloadNextPendingModule();
 | 
|  }
 | 
|  
 | 
|  void WebstoreInstaller::Observe(int type,
 | 
| @@ -473,21 +478,15 @@ void WebstoreInstaller::OnDownloadUpdated(DownloadItem* download) {
 | 
|              extensions::InstallTrackerFactory::GetForProfile(profile_);
 | 
|          tracker->OnDownloadProgress(id_, 100);
 | 
|        }
 | 
| +      // Stop the progress timer if it's running.
 | 
| +      download_progress_timer_.Stop();
 | 
|        break;
 | 
|      case DownloadItem::IN_PROGRESS: {
 | 
|        if (delegate_ && pending_modules_.size() == 1) {
 | 
|          // Only report download progress for the main module to |delegrate_|.
 | 
|          delegate_->OnExtensionDownloadProgress(id_, download);
 | 
|        }
 | 
| -      int percent = download->PercentComplete();
 | 
| -      // Only report progress if precent is more than 0
 | 
| -      if (percent >= 0) {
 | 
| -        int finished_modules = total_modules_ - pending_modules_.size();
 | 
| -        percent = (percent + finished_modules * 100) / total_modules_;
 | 
| -        extensions::InstallTracker* tracker =
 | 
| -          extensions::InstallTrackerFactory::GetForProfile(profile_);
 | 
| -        tracker->OnDownloadProgress(id_, percent);
 | 
| -      }
 | 
| +      UpdateDownloadProgress();
 | 
|        break;
 | 
|      }
 | 
|      default:
 | 
| @@ -614,6 +613,42 @@ void WebstoreInstaller::StartDownload(const base::FilePath& file) {
 | 
|    download_manager->DownloadUrl(params.Pass());
 | 
|  }
 | 
|  
 | 
| +void WebstoreInstaller::UpdateDownloadProgress() {
 | 
| +  // If the download has gone away, or isn't in progress (in which case we can't
 | 
| +  // give a good progress estimate), stop any running timers and return.
 | 
| +  if (!download_item_ ||
 | 
| +      download_item_->GetState() != DownloadItem::IN_PROGRESS) {
 | 
| +    download_progress_timer_.Stop();
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  int percent = download_item_->PercentComplete();
 | 
| +  // Only report progress if precent is more than 0
 | 
| +  if (percent >= 0) {
 | 
| +    int finished_modules = total_modules_ - pending_modules_.size();
 | 
| +    percent = (percent + (finished_modules * 100)) / total_modules_;
 | 
| +    extensions::InstallTracker* tracker =
 | 
| +        extensions::InstallTrackerFactory::GetForProfile(profile_);
 | 
| +    tracker->OnDownloadProgress(id_, percent);
 | 
| +  }
 | 
| +
 | 
| +  // If there's enough time remaining on the download to warrant an update,
 | 
| +  // set the timer (overwriting any current timers). Otherwise, stop the
 | 
| +  // timer.
 | 
| +  base::TimeDelta time_remaining;
 | 
| +  if (download_item_->TimeRemaining(&time_remaining) &&
 | 
| +      time_remaining >
 | 
| +          base::TimeDelta::FromSeconds(kTimeRemainingMinutesThreshold)) {
 | 
| +    download_progress_timer_.Start(
 | 
| +        FROM_HERE,
 | 
| +        base::TimeDelta::FromSeconds(kTimeRemainingMinutesThreshold),
 | 
| +        this,
 | 
| +        &WebstoreInstaller::UpdateDownloadProgress);
 | 
| +  } else {
 | 
| +    download_progress_timer_.Stop();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  void WebstoreInstaller::ReportFailure(const std::string& error,
 | 
|                                        FailureReason reason) {
 | 
|    if (delegate_) {
 | 
| 
 |