| 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_) {
|
|
|